【随笔】 《谁动了我的奶酪》中的粒子群算法.



2016年07月25日    Author:Guofei

文章归类: 趣文    文章编号:

版权声明:本文作者是郭飞。转载随意,标明原文链接即可。本人邮箱
原文链接:https://www.guofei.site/2016/07/25/WhoMovedMyCheese.html


1、《谁动了我的奶酪》是讲啥的?

其实这本书是一碗上古的老鸡汤。

故事大概是这样的,有4个小生命,其中有两只老鼠,没有太高级的思维,也没有烦恼、恐惧等高级情绪。还有两个矮人,会理性思考,会分析复杂的经验,当然也有高级复杂的情绪—-其实是过于复杂了。

老鼠嗅嗅,他能够及早嗅出变化的气息。
老鼠匆匆,他能够迅速行动。
小矮人哼哼,他因为害怕改变而否认和拒绝变化,这会使事情变得更糟。
小矮人唧唧,当他看到变化会使事情变得更好时,能够及时地调整自己去适应变化。

四个小生命生活在迷宫中,享用着一大堆奶酪。某天,奶酪消失了,于是四个小生命有不同的反应: 老鼠嗅嗅,他能够及早嗅出变化的气息,所以闻着味跑了…(好贱) 老鼠匆匆,他能够迅速行动,跑了…不过撞了很多死胡同,消失在视线中… 小矮人哼哼,拒绝变化,一直在原地等奶酪回来,然后就没有然后了… 小矮人唧唧,能够及时地调整自己去适应变化,犹豫了很久,最后饿的不行,跑了。

然后小矮人唧唧就开始了主角视角,一路写段子,发鸡汤,毁坏公物(墙上刻鸡汤)

这本书的内容其实很简单,就是提醒人们要拥抱变化,克服对变化的恐惧,避免对变化采用鸵鸟政策。努力在不确定性中寻找机遇。(其实最后一句话出自《黑天鹅》)

《谁动了我的奶酪》刚出版时风靡一时,改变了很多人的思维模式;然而书中的观点,二十年后的今天看来却稀松平常,甚至有点无聊。

话说回来,正因为现在看起来稀松平常,才说明当时震撼的观点成了现代人的共识,这样的书是最伟大的书。(这是培根《论读书》中的句子,原句记不得了,意思大概没错,不要打我…)

2、简述粒子群算法

粒子群算法其实一种最优化算法,大概思路是,先往一个n维空间里面随机撒上一堆粒子。

(前方高能,高中物理老师来敲黑板了...)

这堆粒子就这样在空间中震荡,其速度由3个因素决定:

因素1、上一时刻速度。完全继承上一时刻速度的方向,而多大程度继承上一时刻速度的大小,这个叫做惯性权重。
因素2、该粒子的历史最优点。简单说,粒子离开自己的历史最优点越远,就越想回到这个历史最优点(想象一下弹簧)
因素3、所有粒子的历史最优点。效果跟2一样,想象另一个弹簧。

0

上图就是3个因素生成的速度叠加图,粒子最终走红线 (PS:有的书把2、3两个因素分别叫做个体经验、全局知识。我只能说,何必呢…)

下面两段,一段是公式,一段是代码。其实没必要贴出来的,为了文章完整性,还是贴一下吧。看官们直接略过也不影响阅读

名词

问题的维度:n
第i个粒子的位置x(i,:)=(xi1,xi2,...,xin)
第i个粒子的速度v(i,:)=(vi1,vi2,...vin)
第i个粒子的历史最优pbset(i,:)=(pi1,pi2,...pin)
全局最优gbest=(g1,g2,...gn)
迭代算法
v(i,:)=w*v(i,:)+c1*r1*(pbest(i,:)-x(i,:))+c2*r2*(gbest-x(i,:))
x(i,:)=x(i,:)+v(i,:)
where,
第一部分称为“惯性”或“动量” inertia,momentum
第二部分称为“认知”    cognition ,反映粒子的memory或rememberance
第三部分成为social,反映粒子群体历史经验
其它名词
r 粒子群算法的种子数量
m 粒子群算法的群体大小
max_d  最大迭代次数
r1,r2 加速权重 取[0,1]之间的随机数
c1,c2 加速常数 取2左右的随机数
w 惯性权重
vmax=k*xmax   (0.1<=k<=1)

下面是代码(Matlab):

%% 清空环境
clc;clear;close all;
fhandle=@myfun3
%%
x=-5:0.1:5;
y=x;
[X,Y]=meshgrid(x,y);
Z=fhandle(X,Y);
mesh(X,Y,Z)
shading interp
%% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;c2 = 1.49445;
maxg=200;   % 进化次数
sizepop=20;   %种群规模
parnum=2;      %变量个数(维度)
%给出速度的最大最小值限制
Vmax=1;Vmin=-1;
popmax=5;popmin=-5;
%% 产生初始粒子和速度
pop=random('unif',popmin,popmax,sizepop,parnum);
V=random('unif',Vmin,Vmax,sizepop,parnum);
fitness=fhandle(pop(:,1),pop(:,2));
%找最好的染色体
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:);%全局最佳
gbest=pop;          %个体最佳
fitnessgbest=fitness;     %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值
%% 迭代寻优
for i=1:maxg
    i%迭代次数

    %速度更新
    V=w*V+c1*rand(sizepop,parnum).*(gbest-pop)+c2*rand(sizepop,parnum).*(ones(sizepop,1)*zbest-pop);

    V(find(V>Vmax))=Vmax;
    V(find(V<Vmin))=Vmin;

    %种群更新
    pop=pop+V;

    %w更新,现有5种方法
    w=1;

    %自适应变异

    %mutation=(random('unif',0,1,sizepop,parnum)>0.8);
    %pop=pop.*(1-mutation)+mutation.*(random('unif',0,1,sizepop,parnum));

    %适应度值
    fitness=fhandle(pop(:,1),pop(:,2));

    %个体最优更新
    ind1=find(fitness<fitnessgbest);
    fitnessbest(ind1,:)=fitness(ind1,:);
    gbest(ind1,:)=pop(ind1,:);

    %群体最优更新
    ind2=find(fitness<fitnesszbest);
    if size(ind2,1)>=1
       [fitnesszbest,ind3]=min(fitness);
       zbest=pop(ind3,:);
    end
    yy(i)=fitnesszbest;
end
%% 结果分析
figure
plot(yy,'Linewidth',2)
title(['适应度曲线  ' '终止代数=' num2str(maxg)]);
grid on
xlabel('进化代数');ylabel('适应度');
% 结果输出
zbest %最佳个体值
fitnesszbest%最值

能到这里的看官,恭喜你获得新成就“超快滑屏”

(开个玩笑,这里的实现粒子群算法用代码很短,略神奇是不是?)。

下面是本文真正想说的事情

(到这里才开始啊(゚Д゚≡゚Д゚))

3、4个小生物,仅仅是粒子群算法中的4种策略而已

物理老师再次敲黑板:这是个必考题(:-D)

粒子就这样在空间中震荡,其速度由3个因素决定:
因素1、上一时刻速度。完全继承上一时刻速度的方向,而多大程度继承上一时刻速度的大小,这个叫做惯性权重。
因素2、该粒子的历史最优点。简单说,粒子离开自己的历史最优点越远,就越想回到这个历史最优点(想象一下弹簧)
因素3、所有粒子的历史最优点。效果跟2一样,想象另一个弹簧。

好吧只是复制了一遍,怕各位看官忘了。

老鼠嗅嗅,他能够及早嗅出变化的气息。对应粒子群算法中,c2比较大,也就是因素3比较强,因此一旦某个粒子发现更优的点,会迅速扑过去。

老鼠匆匆,他能够迅速行动。对应粒子群算法中,c1比较大,也就是因素2比较强,这就表现为,该粒子在个体最优点周围撞来撞去,没准就撞进了旁边的一组三体星(走错片场了,是撞进另一堆奶酪中)

小矮人哼哼,拒绝变化。对应粒子群算法中,惯性权重w太小,使速度迅速缩小,基本停在原地不会动了,这种情况有个专业词汇,叫陷入了局部最优解。值得一提,“局部最优”相反的极端是,一群粒子连局部最优都没找到,算法停止时,一堆粒子无所事事地停在随机位置。

小矮人唧唧,当他看到变化会使事情变得更好时,能够及时地调整自己去适应变化。对应粒子群算法中,各参数设定适中,既不会轻易放弃个体最优解,去扑向全体最优解,也不会停在个体最优解上不动了。

4、思考

有人说,中国人发现某个机会,会大量涌入,让整个行业不能盈利。其实是因为c2太大,所有粒子立即进入历史局部最优。

四位小生物在寻找自己的最优解。现实中千千万万的人就如粒子群一样,不断震荡、尝试,有人偶然震荡到了某个局部最优点,就成了牛人。

为什么曾国藩给自己写的墓志铭“不信书,信运气,公之言传万世”?自己的参数好固然重要,成功其实要归功于被随机因素震荡到某些状态。

1)在某种抽象意义下。人们的行为并没有什么本质上的不同,换句话说,人们行为所遵循的算法都是相同的,仅仅是所取参数不同而已。

2)某科技公司用(融资→项目→更大的融资→更大的项目)这种方式来获取快速成长。而巴菲特长期持有似乎不会成长的可口可乐。前者其疾如风,后者不动如山。他们都在寻找自己的局部最优解,只不过前者c1和c2更大;而后者惯性权重更小而已。

3)智能算法可以对复杂学做一种直观地另类阐释,正因为粗糙,才能轻易将其中的简洁美展现出来。


您的支持将鼓励我继续创作!