(完整word版)运用遗传算法求解函数f(x)=x^2

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档