使用粒子群算法求取适应度函数的最小值(适应度函数值最小为零)

weixin_44486912 2019-02-26 05:15:06
使用粒子群算法求取适应度函数的最小值(适应度函数值最小为零),出现的图像是一条在0值的直线,问题出现在哪里?
% author zhaoyuqiang
clear all ;
close all ;
clc ;
N = 40 ; %种群规模
D = 2 ; % 粒子维度
T = 50 ; %迭代次数
Xmax = 1 ;
Xmin = 0 ;
C1 = 1.5 ; %学习因子1
C2 = 1.5 ; %学习因子2
W = 0.8 ; %惯性权重
Vmax = 1 ; %最大飞行速度
Vmin = -1 ; %最小飞行速度
popx = rand(N,D)*(Xmax-Xmin)+Xmin ; % 初始化粒子群的位置(粒子位置是一个D维向量)
% OO=popx
popv = rand(N,D)*(Vmax-Vmin)+Vmin ; % 初始化粒子群的速度(粒子速度是一个D维度向量)
%初始化每个历史最优粒子
pBest = popx;
pBestValue =func_objValue(pBest) ;
%初始化全局历史最优粒子
[gBestValue,index] = min(func_objValue(popx)) ;
gBest = popx(index,:) ;
for t=1:T
for i=1:N
% 更新个体的位置和速度
popv(i,:) = W*popv(i,:)+C1*rand*(pBest(i,:)-popx(i,:))+C2*rand*(gBest-popx(i,:));
popv(i,find(popv(i,:)>Vmax))=Vmax;
popv(i,find(popv(i,:)<Vmin))=Vmin;

popx(i,:) = popx(i,:)+0.5*popv(i,:);
popx(i,find(popx(i,:)>Vmax))=Xmax;
popx(i,find(popx(i,:)<Vmin))=Xmin;
% 边界处理,超过定义域范围就取该范围极值
% index = find(popv(i,:)>Vmax | popv(i,:)<Vmin);
% popv(i,index) = rand*(Vmax-Vmin)+Vmin ; %#ok<*FNDSB>
% index = find(popx(i,:)>Xmax | popx(i,:)<Xmin);
% popx(i,index) = rand*(Xmax-Xmin)+Xmin ;

%新粒子适应度
pBestValue(i)=func_objValue(popx(i,:));
% 更新粒子历史最优
if func_objValue(popx(i,:))<pBestValue(i)
pBest(i,:) = popx(i,:) ;
pBestValue(i) = func_objValue(popx(i,:));
else
if pBestValue(i)<gBestValue
gBest = pBest(i,:) ;
gBestValue = pBestValue(i) ;
end
end
end
% 每代最优解对应的目标函数值
tBest(t) = func_objValue(gBest); %#ok<*SAGROW>
end
figure
plot(tBest);
xlabel('迭代次数') ;
ylabel('适应度值') ;
title('适应度进化曲线');

...全文
1855 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
粒子群算法PSO入门代码火经典案例求Ackley函数附-PSO.zip 本帖最后由 当当的花生 于 2016-7-30 20:09 编辑 回帖获得更多 粒子群算法 遗传算法前面有人讲了,我来讲讲PSO。 1)先看看百度百科解释: 粒子群算法,也称粒子群优化算法(Particle Swarm Optimization),缩写为 PSO, 是近年来由J. Kennedy和R. C. Eberhart等[1] 开发的一种新的进化算法。PSO 算法属于进化算法的一种,和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉” 和“变异” 操作,它通过追随当前搜索到的最优来寻找全局最优。这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性。粒子群算法是一种并行算法。 2) 什么? 看不懂? 我来通俗解释: 粒子群算法是生物学家研究鸟类捕食创造的,把一只鸟比作成一个粒子,设想一个有20只秃鹫(粒子)的群体吧,秃鹫相互独立具有个体特征但又相互协助体现群体特征,现在我就是这20只中的一只好了(人丑),我现在和小伙伴去 觅食(找非洲野牛的尸体),假设我是一只老婆在家里孵蛋所以我得很认真找食物的秃鹫,每时每刻我都在记录我周围中最可能有猎物的地方,并以这个依据(设为依据一)在下一刻立即调整速度矢量(有大小方向)来趋向我上一时刻发现的最有可能有尸肉的地方。 假如我飞了一小时,上面说到我每时每刻都在记录最有当刻最有可能有肉的地方,那么在这一个小时的记录中肯定有一个最可能有肉的地方,这个地方就是依据二了,我有种往这个移动的趋势。 前面都是我的个鸟行为,我是一只善于观察和沟通并成功让酋长漂亮女儿当我老婆的鸟,所以群里其他秃鹫找到了一个小尸体就会立即告诉我,那我就看谁发现的小尸肉最有分量了,并有一个往这个地方移动的趋势,这是依据三。 再加一些假设以尽可能地模仿一个群体,1)每时每刻有随机从3只傻鸟中抽出一只鸟让他分心,在下一刻瞎移动位置,假设其他秃鹫和我一样机智并且有才华(不太可能),好了有了这些,经过2个小时的觅食,我们这十只鸟最终飞到了同一地点:一头最大野牛尸体旁边。这就是粒子群算法啦,显然是一个找大尸肉的优化算法。 3)来举个经典栗子,求Ackley函数最小。 什么很好求?可不是,这个函数的局部最小太多了,一不小心就掉坑了,函数是这样的: ackley函数.png MATLAB画图如下: 图像.png 画图代码: %经典函数 Ackley clear,clc,close all; x1=-5:0.01:5; x2=-5:0.01:5; for i=1:1001     for j=1:1001         %目标函数         z=-20*exp^2 x2^2)/2))-exp)) cos))/2 20 2.71289;     end end [x,y]=meshgrid; figure mesh xlabel ylabel zlabel复制代码 这么多局部最小,那么怎么用PSO求最小呢? 少说废话,先上MATLAB代码: 1)定义函数: function y = fun y=-20*exp^2 x^2)/2))-exp)) cos))/2 20 2.71289;   复制代码 2)PSO求解: 要先定义函数哦 clear,clc,close all; %参数初始化 %粒子群算法中的俩个参数 c1 = 0.1; %惯量因子 c2 = 0.1; maxg=400; %进化次数 移动400回啊 sizepop=20; %总群规模 20只鸟啊 %初始速度和总群上下边界 Vmax=1; Vmin=-1; %速度范围 上帝让我飞这么快啊 popmax=5; popmin=-5; %粒子范围 我不能飞到老王的领地啊 %%产生初始粒子和速度,上帝说要有鸟,就有了鸟 for i= 1:sizepop pop=popmax*rands ; %初始种群 V=rand; %初始速度 fitness=fun); %染色体的适应度 end %%找最好的染色体,最大的小肉块啊 [bestfitness,bestindex]=min; zbest=pop; %全局最佳 gbest=pop; %个体最佳 fitnessgbest=fitness; %个体最佳适应度 fitnesszbest=bestfitness; %全局最佳适应度 %%迭代寻优,我要找俩百回啊,老婆在家孵蛋啊 for i=1:maxg for j = 1:sizepop %速度更新,要找最好吃的肉啊 V = V c1*rand*-pop) c2*rand*); V>popmax))=popmax; V0.99 k=ceil; pop=rand; end %适应度函数最小的点(鸟) fitness=fun); %个体最优更新,我找到最好吃的肉要实时追踪啊 if fitness < fitnessgbest gebest = pop; fitnessgbest = fitness; end %群体最优更新,我是一只善于观察和沟通并成功让酋长漂亮女儿当我老婆的鸟 if fitness < fitnesszbest zbest = pop; fitnesszbest = fitness; end end yy = fitnesszbest; end %结果分析,20个鸟到了同一个地方,来啊互相伤害啊 plot% title]); grid on xlabel; ylabel; %结果输出 zbest %最佳个体,(点的位置) fitnesszbest %最优函数最小)复制代码 说明:且把一个点(x,y)当成我这只鸟的位置,把这个点代到Ackley函数里得到一个并记录下来。第一,我移动十次以后十次里有一个位置函数最小函数最小就是我们要的尸肉啊),那么我总有种往这个位置移动的趋势,第二,20个点带到函数我是不是得有个最小的,那我就又有种往这个点移动的趋势。 V = V c1*rand*-pop) c2*rand*); 而上面的速度更新公式巧妙的结合了上面俩点啊,精彩绝伦啊 c1,c2是个巧妙的常数,选大了搜索范围广,选小了局部搜索强啊 砖家现在在研究动态调整这俩个惯性因子啊 3)运行结果: 适应度.png 这里的适应度其实就是 把20个点带进函数的那个最小的变化呀 最小最后是接近真实最小0啊,好吃的肉啊 结果: 360反馈意见截图16751106316927.png 每次运行结果都不是相同的哦,pso最终得到函数在(0.1070,0.0199)得到最小0.0694.成功避开所有菊部最优十分接近真实的在(0,0),最小0 的结果。 啊我是一只神奇的秃鹫。第一次认真的回答啊,来啊点赞啊,来啊智能算法有什么: 算法.png ----Mr.Dang 转载注明出处,侵删 回复 支持 获得更多 M文件如下:
经典PSO算法的matlab实现 压缩包包括4个文件:MyPSO.m TestFucnt.m test_mypso.m CalFitnessFunct.m 1. MyPSO.m PSO算法的实现,函数传入参数只有一个结构体,易于使用 function [OptVal BestPos IterCnt OutMsg] = MyPSO(Options) %%功能:基本PSO算法的实现 %输入:结构化参数Options各个域如下 % Options.OptFunctName:待寻优函数名 % Options.ModFlag 寻优模式 0最小 1 最大 % Options.PopSize:种群规模 % Options.DimSize:每个粒子维数 % Options.MaxIter:最大迭代次数 % Options.WeightChangeMaxIter:w变化代数 % Options.Xrange:每维粒子搜索位置范围,Options.Xrange(i,1),Options.Xrange(i,2)分别为i维最小和最大 % Options.Lamba:全局最优适应度最小间隔 % Options.StopIter:全局最优适应度间隔连续StopIter次小于Options.Lamba停止迭代 % Options.c1:加速项c1 % Options.c2:加速项c2 % Options.wmax:最大权重 % Options.wmin:最小权重 % Options.wChagneMode 惯性权重递减方式 0 线性递减 1非线性递减 % Options.plot: 0 不画图 1 画图 %输出: % OptVal:算法搜索到的全局最优函数 % BestPos:算法搜索到的全局最优位置 % IterCnt:算法迭代次数 % OutMsg:函数执行结果相关信息 2. TestFunct.m 待寻优的测试函数 3. CalFitnessFunct.m 计算粒子归属度函数 4. test_mypso.m 测试函数,用来测试算法的正确性 针对不同的寻优函数,只需修改TestFunct.m文件中的函数实现或直接修改Options.OptFunctName 同时修改test_mypso.m中的Options.DimSize Options.Xrange 代码有详细的注释,具体细节代码实现

3,423

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧