文章目录
遗传算法
一 概述
遗传算法是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。遗传算法通常实现方式为一种计算机模拟。对于一个最优化问题,一定数量的候选解(称为个体)的抽象表示(称为染色体)的种群向更好的解进化。传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法。进化从完全随机个体的种群开始,之后一代一代发生。在每一代中,整个种群的适应度被评价,从当前种群中随机地选择多个个体(基于它们的适应度),通过自然选择和突变产生新的生命种群,该种群在算法的下一次迭代中成为当前种群。
二 算法步骤
基本遗传算法的基本步骤是:
随机产生种群,
用轮盘赌策略确定个体的适应度,判断是否符合优化准则,若符合,输出最佳个体及其最优解,结束,否则,进行下一步
依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体被淘汰
按照一定的交叉概率和交叉方法,生成新的个体
按照一定的变异概率和变异方法,生成新的个体
由交叉和变异产生新一代种群,返回步骤2
三 算法代码
3.1 %连点画图函数 plot_route.m
function plot_route(a,R)
scatter(a(:,1),a(:,2),'rx');
hold on;
plot([a(R(1),1),a(R(length(R)),1)],[a(R(1),2),a(R(length(R)),2)]);
hold on;
for i=2:length(R)
x0=a(R(i-1),1);
y0=a(R(i-1),2);
x1=a(R(i),1);
y1=a(R(i),2);
xx=[x0,x1];
yy=[y0,y1];
plot(xx,yy);
hold on;
end
3.2 %染色体的路程代价函数 mylength.m
function len=myLength(D,p)%p是一个排列
[N,NN]=size(D);
len=D(p(1,N),p(1,1));
for i=1:(N-1)
len=len+D(p(1,i),p(1,i+1));
end
end
3.3 %对调函数 exchange.m
function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
end
3.4 %适应度函数fit.m,
每次迭代都要计算每个染色体在本种群内部的优先级别,类似归一化参数。越大约好!
function fitness=fit(len,m,maxlen,minlen)
fitness=len;
for i=1:length(len)
fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.0001)).^m;
end
3.5 %变异函数 Mutation.m
function a=Mutation(A)
index1=0;index2=0;
nnper=randperm(size(A,2));
index1=nnper(1);
index2=nnper(2);
%fprintf('index1=%d ',index1);
%fprintf('index2=%d ',index2);
temp=0;
temp=A(index1);
A(index1)=A(index2);
A(index2)=temp;
a=A;
end
3.6 主函数 main.m
%main
clear;
clc;
%%%%%%%%%%%%%%%输入参数%%%%%%%%
N=25; %%城市的个数
M=100; %%种群的个数
ITER=2000; %%迭代次数
%C_old=C;
m=2; %%适应值归一化淘汰加速指数
Pc=0.8; %%交叉概率
Pmutation=0.05; %%变异概率
%%生成城市的坐标
pos=randn(N,2);
%%生成城市之间距离矩阵
D=zeros(N,N);
for i=1:N
for j=i+1:N
dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2;
D(i,j)=dis^(0.5);
D(j,i)=D(i,j);
end
end
%%生成初始群体
popm=zeros(M,N);
for i=1:M
popm(i,:)=randperm(N);%随机排列,比如[2 4 5 6 1 3]
end
%%随机选择一个种群
R=popm(1,:);
figure(1);
scatter(pos(:,1),pos(:,2),'rx');%画出所有城市坐标
axis([-3 3 -3 3]);
figure(2);
plot_route(pos,R); %%画出初始种群对应各城市之间的连线
axis([-3 3 -3 3]);
%%初始化种群及其适应函数
fitness=zeros(M,1);
len=zeros(M,1);
for i=1:M%计算每个染色体对应的总长度
len(i,1)=myLength(D,popm(i,:));
end
maxlen=max(len);%最大回路
minlen=min(len);%最小回路
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);%找到最小值的下标,赋值为rr
R=popm(rr(1,1),:);%提取该染色体,赋值为R
for i=1:N
fprintf('%d ',R(i));%把R顺序打印出来
end
fprintf('\n');
fitness=fitness/sum(fitness);
distance_min=zeros(ITER+1,1); %%各次迭代的最小的种群的路径总长
nn=M;
iter=0;
while iter<=ITER
fprintf('迭代第%d次\n',iter);
%%选择操作
p=fitness./sum(fitness);
q=cumsum(p);%累加
for i=1:(M-1)
len_1(i,1)=myLength(D,popm(i,:));
r=rand;
tmp=find(r<=q);
popm_sel(i,:)=popm(tmp(1),:);
end
[fmax,indmax]=max(fitness);%求当代最佳个体
popm_sel(M,:)=popm(indmax,:);
%%交叉操作
nnper=randperm(M);
% A=popm_sel(nnper(1),:);
% B=popm_sel(nnper(2),:);
%%
for i=1:M*Pc*0.5
A=popm_sel(nnper(i),:);
B=popm_sel(nnper(i+1),:);
[A,B]=cross(A,B);
% popm_sel(nnper(1),:)=A;
% popm_sel(nnper(2),:)=B;
popm_sel(nnper(i),:)=A;
popm_sel(nnper(i+1),:)=B;
end
%%变异操作
for i=1:M
pick=rand;
while pick==0
pick=rand;
end
if pick<=Pmutation
popm_sel(i,:)=Mutation(popm_sel(i,:));
end
end
%%求适应度函数
NN=size(popm_sel,1);
len=zeros(NN,1);
for i=1:NN
len(i,1)=myLength(D,popm_sel(i,:));
end
maxlen=max(len);
minlen=min(len);
distance_min(iter+1,1)=minlen;
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
fprintf('minlen=%d\n',minlen);
R=popm_sel(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
popm=[];
popm=popm_sel;
iter=iter+1;
%pause(1);
end
%end of while
figure(3)
plot_route(pos,R);
axis([-3 3 -3 3]);
figure(4)
plot(distance_min);
四 代码运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qo1NQNoP-1574178412508)(C:\Users\59287\Desktop\1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2lgIWBIh-1574178412509)(C:\Users\59287\Desktop\2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-35wisl9j-1574178412511)(C:\Users\59287\Desktop\3.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gFIQM2nc-1574178412512)(C:\Users\59287\Desktop\4.PNG)]
五 不同参数对实验结果的影响
5.1 改变迭代次数
ITER=1500;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DxZCBnfM-1574178412513)(C:\Users\59287\Desktop\2.1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bPEgWp9K-1574178412514)(C:\Users\59287\Desktop\2.2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjooR2gx-1574178412516)(C:\Users\59287\Desktop\2.2 (2)].PNG)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnCmVHW8-1574178412517)(C:\Users\59287\Desktop\1.PNG)]
ITER=2500
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XaWCIPGY-1574178412518)(C:\Users\59287\Desktop\1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LCYRGVcC-1574178412519)(C:\Users\59287\Desktop\2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z54bePdC-1574178412519)(C:\Users\59287\Desktop\3.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LjFUXFDN-1574178412520)(C:\Users\59287\Desktop\4.PNG)]
由图可知算法迭代次数一般越大越好,但是也不宜太大,应当选取适合当前数据量的迭代次数即可。迭代次数过多,势必会降低算法的运行效率。若迭代次数过少,会直接导致算法的失败
5.2 改变交叉概率
Pc=0.5
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ag7tuvOd-1574178412522)(C:\Users\59287\Desktop\2.1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMGvPhMR-1574178412522)(C:\Users\59287\Desktop\2.2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbVm9JWd-1574178412523)(C:\Users\59287\Desktop\2.3.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nj1GKyTf-1574178412525)(C:\Users\59287\Desktop\2.4.PNG)]
Pc=1.0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VgEsEgz9-1574178412526)(C:\Users\59287\Desktop\3.1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jv5dxL4-1574178412526)(C:\Users\59287\Desktop\3.2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJ1v9fYG-1574178412527)(C:\Users\59287\Desktop\3.3.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNBXQM5Z-1574178412528)(C:\Users\59287\Desktop\3.4.PNG)]
当Pc为1.0时,算法的收敛速度很快,可以得出较差概率影响着算法的运行效率,但对得出的最优值不能保证其最优性。Pc的取值一般为0.4~0.99。
5.3 改变种群个数
M=50
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xudW63ie-1574178412533)(C:\Users\59287\Desktop\4.1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8fNL9zg7-1574178412534)(C:\Users\59287\Desktop\4.2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9XIg96nN-1574178412535)(C:\Users\59287\Desktop\4.3.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypmLZWj1-1574178412536)(C:\Users\59287\Desktop\4.4.PNG)]
M=150
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bWsN5v6E-1574178412536)(C:\Users\59287\Desktop\1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZsJuhom-1574178412537)(C:\Users\59287\Desktop\2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wumjQhW-1574178412538)(C:\Users\59287\Desktop\3.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBZzreZM-1574178412538)(C:\Users\59287\Desktop\4.PNG)]
种群规模是指任意一代中的个体总数,这个是人为设定的,种群规模越大越可能找到全局解,但运行时间也相对较长,一般在40-100之间取值
5.4 改变变异概率
Pmutation=0.01
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NDGwUuZx-1574178412539)(C:\Users\59287\Desktop\2.1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vxTol7J2-1574178412539)(C:\Users\59287\Desktop\2.2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4rG3jXL-1574178412540)(C:\Users\59287\Desktop\2.3.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YAFxv67S-1574178412540)(C:\Users\59287\Desktop\2.4.PNG)]
Pmutation=0.08
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BsbMGmFG-1574178412541)(C:\Users\59287\Desktop\3.1.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mIgrD4ZW-1574178412541)(C:\Users\59287\Desktop\3.2.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ac1VJufL-1574178412542)(C:\Users\59287\Desktop\3.3.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SSmrO6Av-1574178412543)(C:\Users\59287\Desktop\3.4.PNG)]
变异率的选取一般受种群大小、染色体长度等因素的影响,通常选取很小的值,一般取0.001-0.1。
六 算法不足之处
(1)编码不规范及编码存在表示的不准确性。
(2)单一的遗传算法编码不能全面地将优化问题的约束表示出来。考虑约束的一个方法就是对不可行解采用阈值,这样,计算的时间必然增加。
(3)遗传算法通常的效率比其他传统的优化方法低。
(4)遗传算法容易过早收敛。
(5)遗传算法对算法的精度、可行度、计算复杂性等方面,还没有有效的定量分析方法。
78412541)]
[外链图片转存中…(img-Ac1VJufL-1574178412542)]
[外链图片转存中…(img-SSmrO6Av-1574178412543)]
变异率的选取一般受种群大小、染色体长度等因素的影响,通常选取很小的值,一般取0.001-0.1。
六 算法不足之处
(1)编码不规范及编码存在表示的不准确性。
(2)单一的遗传算法编码不能全面地将优化问题的约束表示出来。考虑约束的一个方法就是对不可行解采用阈值,这样,计算的时间必然增加。
(3)遗传算法通常的效率比其他传统的优化方法低。
(4)遗传算法容易过早收敛。
(5)遗传算法对算法的精度、可行度、计算复杂性等方面,还没有有效的定量分析方法。