【遗传算法】的基本流程为
- 产生初始种群
- 计算种群中个体对应的实际结果的值
- 计算个体对应的适应度
- 根据适应度选择个体
- 交叉
- 变异
- 求最佳结果
【案例】
有8个城市,旅行商需要找到最短的路线
【程序结果】
【代码】
%% 遍历8个城市的最短路径问题
七个处理流程用到的七个函数如下
【产生初始种群】
%% 产生初始种群,popsize为初始种群的个数,chromlength为每个个体的长度
function pop=initpop1(popsize,chromlength)
for i=1:popsize
pop(i,:)=randperm(chromlength);% randperm产生1-chromlength的随机排列
end
【计算个体的值】
function [objvalue]=calobjvalue1(pop)%计算目标函数值即距离
D=[5 0;3.54 3.54;0 5;-3.54 3.54;-5 0;-3.54 -3.54;0 -5;3.54 -3.54];%确定城市坐标
[px,py]=size(pop);
for i=1:px
k=sqrt((D(pop(i,1),1)-D(pop(i,py),1))^2+(D(pop(i,1),2)-D(pop(i,py),2))^2);
for j=1:py-1
k=k+sqrt((D(pop(i,j),1)-D(pop(i,j+1),1))^2+(D(pop(i,j),2)-D(pop(i,j+1),2))^2);
end
objvalue(i)=k;
end
【计算个体的适应度】
%%计算个体适应度
function [fitvalue]=calfitvalue1(objvalue)
x=objvalue;
fitvalue=1./x;%距离最小映射为适应度最大
fitvalue=10.*x.*x-1400*x+49000;%二次函数,可以实现非线性映射,并使种群更易收敛到最优解
【选择】
function [newpop,a,b]=selection1(pop,fitvalue) %选择
totalfit=sum(fitvalue); %求适应度值之和
pfitvalue=fitvalue/totalfit; %单个个体被选择的概率
mfitvalue=cumsum(pfitvalue); %如fitvalue=[1 2 3 4]cumsum(fitvalue)=[1 3 6 10]
[px,py]=size(pop);
ms=(rand(px,1)); %转动轮盘
a=ms;
b=mfitvalue;
fitin=1;
newin=1;
newpop=zeros(px,py);
while newin<=px
if mfitvalue(fitin)>ms(newin)
newpop(newin,:)=pop(fitin,:);
newin=newin+1;
fitin=1;
else
fitin=fitin+1;
end
end
【交叉】
function [newpop1]=crossover1(newpop,pc)%交叉
[px,py]=size(newpop);
newpop1=zeros(size(newpop));
for i=1:px
po=rand(1);
if po<pc
y=round(rand*px);%随机寻找交叉对象
x1=round(rand*py); %随机寻找交叉点
x2=round(rand*py); %随机寻找交叉点
cpoint1=min(x1,x2);%寻找交叉起点
cpoint2=max(x1,x2);%寻找交叉终点
while cpoint1==0||cpoint2==0||y==0
y=round(rand*px);%随机寻找交叉对象
x1=round(rand*py); %随机寻找交叉点
x2=round(rand*py); %随机寻找交叉点
cpoint1=min(x1,x2);%寻找交叉起点
cpoint2=max(x1,x2);%寻找交叉终点
end
newpop1(i,:)=[newpop(i,1:cpoint1-1),newpop(y,cpoint1:cpoint2),newpop(i,cpoint2+1:py)]; %两个染色体在交叉点位置交叉
t=1;
while t==1
t=0;
for m=1:py
for n=cpoint1:cpoint2
if newpop1(i,m)==newpop1(i,n) &&(m<cpoint1||m>cpoint2)
newpop1(i,m)=newpop(i,n);
t=1;
end
end %对交叉后染色体做调整
end
end
else
newpop1(i,:)=newpop(i,:);% 产生新染色体
end
end
【变异】
function [newpop2]=mutation1(newpop1,pm) % 变异
%Name: mutation.m
[px,py]=size(newpop1);
newpop2=zeros(px,py);
for i=1:px
ps=rand;
if ps<pm
mpoint1=round(rand*py);
mpoint2=round(rand*py);
if mpoint1<=0||mpoint2<=0
mpoint1=1;
mpoint2=1;
end
t=newpop1(i,mpoint1);
newpop1(i,mpoint1)=newpop1(i,mpoint2);
newpop1(i,mpoint2)=t;
end
end
newpop2=newpop1;
【求最优】
%% 找到最佳个体
function [bestindividual,bestfit,worstindividual,worstfit]=best1(a,newpop2,newfitvalue)%最佳个体
%Name: best.m
[px,py]=size(newpop2);
bestindividual=newpop2(1,:);%假设新的经过交叉变异的种群中第一个个体就是距离最短的
bestfit=newfitvalue(1);%假设第一个是适应度最好的,为了比较设置初始值
wostfit=newfitvalue(1);%假设第一个是适应度最坏的,为了比较设置初始值
j=1;
%挨个对比所有的个体找到适应度最差的位置
for i=1:px
if newfitvalue(i)<wostfit
j=i;
wostfit=newfitvalue(i);
end
end
worstindividual=newpop2(j,:);%将最差的替换为上一代的最好的
worstfit=newfitvalue(j);
for i=1:px
if newfitvalue(i)>bestfit %更新为适应度大的个体
bestindividual=newpop2(i,:);%循环下去求最佳个体
bestfit=newfitvalue(i);%循环下去求最佳适应度
end
end
【参考】
七个函数及题目来源于【西安交通大学】【智能信息处理】课程讲义,GA代码为个人编写。
祝你科研顺利!!!