首页 > 编程知识 正文

粒子群算法,matlab粒子群算法

时间:2023-05-06 08:17:56 阅读:61167 作者:105

在上次的博客中,将粒子群的搜索过程可视化,并导出为gif格式的文件。 关于这个过程,首先在这里说明。

1 .首先pause ()在每次绘制时暂停,单位为秒,进行下一次绘制。

2 .导出为gif文件时,这实际上是静音视频文件。 因此,需要每帧的图像。 你可以用pause,但最好用drawnow。 其原理是保持当前窗口不变,继续下一次绘制。

因此,如果将导出为gif的步骤添加到上一个代码中,则:

clc; 清除全部关闭; %%初始化种群f=@(x ) x .* sin(x ) x ) cos )2*x ) x .* sin(x )3*x ); %函数式N=50; %初始种群数量d=1; %空间维度ger=100; %最大迭代次数limit=[ 0,20 ]; %位置参数限制v limit=[-1,1 ]; 设置%速度限制w=0.8; %惯性权重c1=0.5; %自学因子c2=0.5; %群体学习因子forI=1:dx=limit(i(I,1 ) ) limit,2 )-limit,1 ) ) * rand(N ) n,d ); %初始种群位置endv=rand(n,d ); %初始种群速度xm=x; %每个个体的历史最高位置ym=Zeros(1,d ); %种群历史最佳位置fxm=Zeros(n,1 ); %每个个体的历史最佳适应度fym=-inf; %种群历史最优适应度%%群体更新iter=1; Record=Zeros(Ger,1 ); %记录器whileIter=gerFX=f(x; %个体的当前适应度forI=1:niffxm(I ) FX ) I ) fxm ) I )=FX ) I; %个体历史记录最佳适应度XM的更新(I, )=x ) I, ); %更新个体历史记录的最佳位置endendiffymmax(fxm ) [fym,nmax]=max ) fxm ); %更新组历史最佳适应度ym=XM(nmax, ); %更新组的历史最高位置endv=v*WC1*rand*(XM- x ) C2*rand* ) repmat(ym,n,1 )-x ); %速度更新%边界速度处理v(vvlimit )2)=vlimit(2) 2; v ) vvlimit(1)=vlimit(1) 1; x=x v; %位置更新%边界位置处理x(xlimit(2) )=limit(2) 2; x (x限制(1)=限制(1) 1; 记录(Iter )=fym; %最大值记录x0=0 : 0.01 : 20; plot(x0,f ) x0 )、' b- '、x,f ) x、' ro ' ); 状态位置变化) drawnow frame=getframe(1) 1; im=帧2 im (帧; [A,map]=RGB2ind(im,256 ); if iter==1; imwrite(a,map,' E:培训优化算法(pso.gif ',' gif ',' LoopCount ',Inf,' DelayTime ',0.1 ); elseimwrite(a,map,' E:(培训)优化算法(pso.gif )、' gif )、' WriteMode '、' append '和' DelayTime ) end iter=iter 1; enddisp([ '最大值:',num2str ) ) fym; disp([ '变量取值:',num2str(ym ) ];

另外,可以看出在种群的历史最佳值中被初始化为-inf,这是因为需要最大值。 但是,如果要求最小值该怎么办? 你最好不要把这里改成inf。 如果那样的话,在我们之后的最佳值更新中必须全部变更为最小值和。 很麻烦。 那么,直接给适应度加负号是最好的方法。 那样的话,就会求出最小值。 但是,必须将最后的最佳值反转。

而且,我们先写的只是一维问题的优化,代码的优化程度不高。 与此相对,为了应对多维优化问题,显示了优化程度较高的代码:

问题是21.5x*sin(4*pi*x ) y * sin (20 * pi * y ),x=[-3,12.1 ]; y=[ 4.1,5.8 ]的极值。

clc; 清除全部关闭; tic%%参数设定N=500; d=2; ger=1000; w=0.8; c1=0.9; c2=0.9; xlimit=[-3 12.1; 4.1 5.8]; vlimit=[-1 1; -11 ); %%种群初始化x=repmat (xlimit (:1 ),n,1 ) repmat (diff ) x limit ),n,1 ).*rand(N ) n,d; v=repmat(vlimit ) :1 ),n,1 ) repmat (diff ) vlimit ),n,1 ).*rand(N ) n,d ); xm=x; fxm=-INF*ones(n,1 ); ym=x limit (3360,1 ) diff ) x limit.* rand (1) 1,d ); fym=-inf; %%开始搜索forI=1:gery=f(x; forj=1:nify(j ) fxm ) j ) j )=y ) j; XM(j, )=x ) j, ); ify(j ) fym fym=y(j ) j; ym=x(j, ); endendv=w*vC1*rand*(XM-x ) C2*rand* ) repmat(ym,n,1 )-x ); x=x v; x=min(x,repmat ) xlimit ) :2 ),n,1 ); x=最大(x,repmat ) x限制) :1 )、n,1 ); v=min(v,repmat ) vlimit ) :2 )、n,1 ); v=最大(v,repmat ) vlimit ) :1 )、n,1 ); endtocdisp([ '最佳解为: ',num2str(ym ) ]; DISP([ '最佳值为: ',num2str(fym ) ]; 子函数如下:

函数y=f (x ) y=21.5 x (:1 ).*sin )4* pi * x (:1 ) ) x ) :2 ) ) sin ) 20*pi*x ) 3360 end

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。