MATLAB程序大全 联系客服

发布时间 : 星期二 文章MATLAB程序大全更新完毕开始阅读ee93ef4b03d276a20029bd64783e0912a3167c3b

☆★☆★☆

其中X是种群中个体特征向量,这里就是x和y坐标。g是种群的代数。i代表当前个体,r1,r2,r3是和i不同,并且也互不相同的个体。

4.计算变异后个体的适应度,如果变异后适应度不如变异前,那么将变异后个体重新恢复为变异前个体。

5.比较变异后个体适应度和种群最优个体适应度,将适应度高的个体赋给种群最优个体。 最后当然还是需要目标函数才能计算适应度。 算法结果如下图,小绿点代表种群最优个体适应度:

matlab代码如下: main.m

clear all;close all;clc;

[x y]=meshgrid(-100:100,-100:100); sigma=50;

img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); %目标函数,高斯函数 mesh(img); hold on;

n=20; %种群个体的数量

%初始化种群,定义结构体 par=struct([]); for i=1:n

par(i).x=-100+200*rand(); %个体的x特征在[-100 100]随机初始化 par(i).y=-100+200*rand(); %个体的y特征在[-100 100]随机初始化 par(i).fit=0; %个体适应度为0初始化 end

par_best=par(1); %初始化种群中最佳个体

☆★☆★☆

for k=1:100 %迭代次数

plot3(par_best.x+100,par_best.y+100,par_best.fit,'g*'); %画出最佳个体的位置,+100为相对偏移

[par par_best]=select_and_recombine(par,par_best,n); %差异演化函数 end

select_and_recombine.m

function [next_par par_best]=select_and_recombine(par,par_best,n) F=0.5; %加速因子 CR=0.8; %变异率 next_par=par; %新种群 for i=1:n

while 1 %在原种群中任选三个互不相同的个体进行交叉变异 r1=floor(1+20*rand()); r2=floor(1+20*rand()); r3=floor(1+20*rand());

if i~=r1 && i~=r2 && i~=r3 &&... r1~=r2 && r1~=r3 && r2~=r3 break; end end

if rand()

next_par(i).x=par(r1).x+F*(par(r2).x-par(r3).x); %交叉变异准则 next_par(i).y=par(r1).y+F*(par(r2).y-par(r3).y); end

%计算变异后个体的适应度

next_par(i).fit=compute_fit(next_par(i));

%如果新个体没有变异前个体适应度高,新个体还原为旧个体 if par(i).fit>next_par(i).fit next_par(i)=par(i); end

%如果变异后适应度高于种群最高适应个体,则更新种群适应度最高个体

if next_par(i).fit>par_best.fit par_best=next_par(i); end end

☆★☆★☆

end

compute_fit.m

function re=compute_fit(par) x=par.x; y=par.y; sigma=50;

if x<-100 || x>100 || y<-100 || y>100

re=0; %超出范围适应度为0

else %否则适应度按目标函数求解

re=(1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); end end

15.

算法没有和图像处理直接相关,不过对于图像分类中的模式识别相关算法,也许会用到这个优化算法。 算法步骤:

1.首先确定粒子个数与迭代次数。 2.对每个粒子随机初始化位置与速度。 3.采用如下公式更新每个粒子的位置与速度。 Px=Px+Pv*t; %位置更新公式

Pv=Pv+(c1*rand*(Gx-Px))+(c2*rand*(PBx-Px)); %速度更新公式 这里c1和c2是加速因子,和梯度下降算法那里的加速因子我感觉很类似。 Gx是粒子群中最佳粒子的位置,PBx为当前粒子最佳位置。

4.每次迭代,首先检查新粒子适应度是否高于原最优适应度,如果高于则对自己的位置和适应度进行更新。然后再判断此粒子适应度是否高于全局最优粒子,如果高于则更新全局最优粒子适应度和位置。

因为自己不是主要研究这方面算法的,所以还有一些疑问(自问自答?)。

1.算法需要目标函数,如果没有目标函数怎么办。也许就不用这个算法了,或者其他什么算法先求出了目标函数了。

2.既然给了目标函数,那么直接遍历所有值再max()应该就能求得最佳位置。而PSO算法是不是只是为了减少运算量,比如我这里200*200的矩阵,本来需要计算40000次函数,而PSO只计算了100次函数就得到近似最优解了。

难怪叫优化算法,反正我暂时只能这样理解了,其他细节代码注释的很清楚了。

☆★☆★☆

下图展示了一个PSO的运行结果,目标函数是高斯函数,绿点代表最佳粒子的位置:

matlab代码如下: main.m

clear all;close all;clc;

[x y]=meshgrid(-100:100,-100:100); sigma=50;

img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); %目标函数,高斯函数 mesh(img); hold on;

n=10; %粒子群粒子个数

%初始化粒子群,定义结构体

%结构体中八个元素,分别是粒子坐标,粒子速度,粒子适应度,粒子最佳适应度,粒子最佳坐标

par=struct([]); for i=1:n

par(i).x=-100+200*rand(); %[-100 100]对x位置随机初始化 par(i).y=-100+200*rand(); %[-100 100]对y位置随机初始化 par(i).vx=-1+2*rand(); %[-1 1]对vx速度随机初始化 par(i).vy=-1+2*rand(); %[-1 1]对vy速度随机初始化 par(i).fit=0; %粒子适应度为0初始化 par(i).bestfit=0; %粒子最佳适应度为0初始化 par(i).bestx=par(i).x; %粒子x最佳位置初始化 par(i).besty=par(i).y; %粒子y最佳位置初始化 end

par_best=par(1); %初始化粒子群中最佳粒子