MATLAB程序大全 - 图文 联系客服

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

☆★☆★☆

plot(len)

computer_tour.m

function len=computer_tour(city,n) %计算路线总长度,每个城市只计算和下家城市之间的距离。 len=0; for i=1:n-1

len=len+sqrt((city(i).x-city(i+1).x)^2+(city(i).y-city(i+1).y)^2); end

len=len+sqrt((city(n).x-city(1).x)^2+(city(n).y-city(1).y)^2); end

perturb_tour.m

function city=perturb_tour(city,n)

%随机置换两个不同的城市的坐标 %产生随机扰动

p1=floor(1+n*rand()); p2=floor(1+n*rand());

while p1==p2

p1=floor(1+n*rand()); p2=floor(1+n*rand()); end

tmp=city(p1); city(p1)=city(p2); city(p2)=tmp; end

netplot.m

function netplot(city,n) %连线各城市,将路线画出来 hold on; for i=1:n-1

plot(city(i).x,city(i).y,'r*');

line([city(i).x city(i+1).x],[city(i).y city(i+1).y]); %只连线当前城市和下家城市

☆★☆★☆

end

plot(city(n).x,city(n).y,'r*');

line([city(n).x city(1).x],[city(n).y city(1).y]); %最后一家城市连线第一家城市

hold off; end

13.

还是这本书上的内容,不过我看演化计算这一章是倒着看的,这里练习的算法正好和书中介绍的顺序是相反的。

演化策略是最古老的的演化算法之一,和上一篇DE算法类似,都是基于种群的随机演化产生最优解的算法。 算法步骤如下:

1.设定种群个体数和需要迭代的次数。

2.选择父代中的个体按照公式z1=sqrt(-2*ln(u1))*sin(2*pi*u2)*m,z2=sqrt(-2*ln(u1))*cos(2*pi*u2)*m进行演化。

这里u1,u2都是随机值,m是控制因子,演化次数越多m,m越小,父代通过与z1,z2相加得到后代。

3.计算后代的适应性。

4.选择后代中最优的适应性作为全局最优适应性。

其实整个过程和DE非常类似。过程都是随机变异,求适应性,再找最优。 我还试着将z1和z2横设为1,竟也能得到非常好的解。 算法结果如下:

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=50; %种群个体的数量 iter=100; %迭代次数

%初始化种群,定义结构体 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=compute_fit(par(i)); %个体在[x,y]处的适应度 end

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

for k=1:iter %迭代次数

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

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

select_and_recombin.m

function [next_par par_best]=select_and_recombin(par,par_best,n,k,iter) mul=(iter-k)/iter; %限制进化因子,代数越高变异越小 next_par=par; %新种群 for i=1:n

%产生变异随机数 u1=rand(); u2=rand();

z1=sqrt(-2*log(u1))*sin(2*pi*u2)*mul; z2=sqrt(-2*log(u1))*cos(2*pi*u2)*mul;

%变异

next_par(i).x=par(i).x+z1;

next_par(i).y=par(i).y+z2;

☆★☆★☆

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

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

14.

这两天在看M.Tim Jones的《人工智能》,书中不只介绍原理,而且都有相应的c代码实现。 虽然代码不完全,不过缺少的部分完全可以自己补完。 差异演化和昨天实现的PSO很类似,都属于优化算法。 算法步骤:

1.设定种群个体个数和需要迭代的次数。当然也可以设定条件,然后判断是否停止迭代。 2.定义交叉概率CR,个体有一定概率进行变异,如果变异则进行第3步,如果不变异则下一代个体和当前个体一样。

3.在种群中随机选出三个互不相同的个体进行变异,变异公式如下(有博士论文总结了一大堆变异公式):

Xi,g+1=Xr1,g+F(Xr2,g-Xr3,g)