main.m
来自「由我收集或写出的GA源码」· M 代码 · 共 127 行
M
127 行
%利用遗传算法(Genetic Algorithms)求解 MAX{ f(x)=x^2 }, 0=<x<=31
%==========================================================================
%--------------------------------------------------------------------------
%种群的初始化
%设初始种群大小N=4个,分别为X1-X4,均为五位二进制编码
clear
clc
total=1; %总的进化代数
Num=0; %当Num=10时,即最大值连续保持10代不变,算法停止
Max1=0;
Max2=0;
flag=0;
X1=initialize();
X2=initialize();
X3=initialize();
X4=initialize();
%--------------------------------------------------------------------------
%复制-reproduction
%BinToDec()将二进制转化为十进制
while 1
while 1
DecX1=BinToDec(X1); %计算适配度
DecX2=BinToDec(X2);
DecX3=BinToDec(X3);
DecX4=BinToDec(X4);
f1=DecX1^2;
f2=DecX2^2;
f3=DecX3^2;
f4=DecX4^2;
ttt=[f1,f2,f3,f4]; %27-37句与计算适配度无关
if flag==0
Max1=max(ttt);
else
Max2=max(ttt);
end
if Max1==Max2
Num=Num+1;
else
Num=0;
end
sum=f1+f2+f3+f4;
aver=sum/4;
n1=round(f1/aver); %实际得到的复制个数
n2=round(f2/aver);
n3=round(f3/aver);
n4=round(f4/aver);
N=n1+n2+n3+n4; %总的复制个数
if N~=4 %引入N是为了保持原种群大小不变
X1=initialize();
X2=initialize();
X3=initialize();
X4=initialize();
total=1;
Num=0;
Max1=0;
Max2=0;
flag=0;
continue;
else
break;
end
end
temp1=cal(X1,n1);
temp2=cal(X2,n2);
temp3=cal(X3,n3);
temp4=cal(X4,n4);
M=[temp1;temp2;temp3;temp4];
X1=M(1,:);
X2=M(2,:);
X3=M(3,:);
X4=M(4,:);
%disp('交叉前:')
%M
%--------------------------------------------------------------------------
%交叉-crossover
%第一步将新复制产生的匹配池中的成员随机两两匹配,第二步是进行交叉繁殖
while 1
p=floor(1000*rand);
if p>1
break;
else
continue;
end
end
k=mod(p,3);
switch k
case 0
[X1,X2,X3,X4,ps]=crossover(X1,X2,X3,X4); %k=0,X1、X2同组,X3、X4同组,ps为交叉位置
case 1
[X1,X3,X2,X4,ps]=crossover(X1,X3,X2,X4); %k=1,X1、X3同组,X2、X4同组
case 2
[X1,X4,X2,X3,ps]=crossover(X1,X4,X2,X3); %k=2,X1、X4同组,X2、X3同组
end
%--------------------------------------------------------------------------
%变异-mutation
%本种群很小,一共才有4*5=20个基因,变异概率一般只有千分之几,所以本例可以没有变异.
%本例有一位变异
%变异相对于复制和交叉操作,是处于相对次要的地位,其目的是为了防止丢失一些有用的遗
%传因子。变异操作可以起到恢复多样性的作用。
U=[X1,X2,X3,X4];
pos=mod(floor(1000*rand),20)+1;
if U(1,pos)==0
U(1,pos)=1;
else
U(1,pos)=0;
end
X1=U(1,1:5);
X2=U(1,6:10);
X3=U(1,11:15);
X4=U(1,16:20);
%--------------------------------------------------------------------------
%本例遗传算法的结束条件:连续10代最大值均保持一致
if Num==10
disp('进化代数:')
total-10
disp('现在的种群:')
X1
X2
X3
X4
disp('最大值:')
Max1
break;
end
flag=mod(flag+1,2);
total=total+1;
end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?