(完整word版)运用遗传算法求解函数f(x)=x^2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一遗传算法的基本原理
遗传算法是模拟生物遗传学和自然选择机理,通过人工方式构造的一类优化搜索算法,是对生物进化过程进行的一种数学仿真,是进化计算的一种重要形式。其搜索过程是从问题解的一个随机产生的集合开始的,而不是从单个个体开始的,具有隐含并行搜索特性,也就大大减少可陷入局部极小值的可能。在解决可能在求解过程中产生组合爆炸的问题时会产生很好的效果。
遗传算法需选择一种合适的编码方式表示解, 并选择一种评价函数用来每个解的适应值, 适应值高的解更容易被选中并进行交叉和变异, 然后产生新的子代。选择、交叉和变异的过程一直循环, 直到求得满意解或满足其他终止条件为止。
本例运用遗传算法求解函数f(x)=x^2,x∈[0,31]上的整数,的最大值。首先随机选择五位二进制编码,设定初始种群个数为4,产生初始种群。随后确定适配度,本例就是目标值。然后根据适配值的大小,按照一定的概率进行复制。连续10代最大值结果保持一致,则遗传算法结束运行。
二Matlab程序运行结果:
由运行结果可以看出,经过2代以后,遗传算法的结果达到最优。
Matlab程序如下:
%****遗传算法主程序******* clear
clc
total=1; %总的进化代数Num=0;
MaN1=0;
MaN2=0;
flag=0;
N1=initialize();
N2=initialize();
N3=initialize();
N4=initialize();
%复制
while 1
while 1
DecN1=BinT oDec(N1);%计算适配度
DecN2=BinT oDec(N2);
DecN3=BinT oDec(N3);
DecN4=BinT oDec(N4);
f1=DecN1^2;
f2=DecN2^2;
f3=DecN3^2;
f4=DecN4^2;
ttt=[f1,f2,f3,f4];
if flag==0
MaN1=max(ttt);
else
MaN2=max(ttt);
end
if MaN1==MaN2
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
N1=initialize();
N2=initialize();
N3=initialize();
N4=initialize();
total=1;
Num=0;
MaN1=0;
MaN2=0;
flag=0;
continue;
else
break;
end
temp1=cal(N1,n1);
temp2=cal(N2,n2);
temp3=cal(N3,n3);
temp4=cal(N4,n4);
M=[temp1;temp2;temp3;temp4]; N1=M(1,:);
N2=M(2,:);
N3=M(3,:);
N4=M(4,:);
%交叉
while 1
p=floor(1000*rand);
if p>1
break;
else
continue;
end
end
k=mod(p,3);
switch k
[N1,N2,N3,N4,ps]=crossover(N1,N2,N3,N4);
case 1
[N1,N2,N3,N4,ps]=crossover(N1,N3,N2,N4);
case 2
[N1,N2,N3,N4,ps]=crossover(N1,N4,N2,N3); end
%变异
U= [N1,N2,N3,N4]
pos=mod(floor(1000*rand),20)+1;
if U(1,pos)==0
U(1,pos)=1;
else
U(1,pos)=0;
end
N1=U(1,1:5);
N2=U(1,6:10);
N3=U(1,11:15);
N4=U(1,16:20);
%遗传算法结束条件:连续10代最大值均保持一致
if Num==10
disp('进化代数:')
total-10
disp('现在的种群:')
N1
N2
N3
N4
disp('最大值:')
MaN1
break;
end
flag=mod(flag+1,2);
total=total+1;
end
子程序1:initialize.m function[X]=initialize()
X=zeros(1,5);
for j=1:5
X(1,j)=round(rand);
end
子程序2:BinT oDec.m function sum=BinT oDec(X) sum=0;