华拓科技网
您的当前位置:首页运用遗传算法求解函数f(x)=x^2

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

来源:华拓科技网


一 遗传算法的基本原理

遗传算法是模拟生物遗传学和自然选择机理,通过人工方式构造的一类优化搜索算法,是对生物进化过程进行的一种数学仿真,是进化计算的一种重要形式。其搜索过程是从问题解的一个随机产生的集合开始的,而不是从单个个体开始的,具有隐含并行搜索特性,也就大大减少可陷入局部极小值的可能。在解决可能在求解过程中产生组合爆炸的问题时会产生很好的效果。

遗传算法需选择一种合适的编码方式表示解, 并选择一种评价函数用来每个解的适应值, 适应值高的解更容易被选中并进行交叉和变异, 然后产生新的子代。选择、交叉和变异的过程一直循环 , 直到求得满意解或满足其他终止条件为止。

本例运用遗传算法求解函数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=BinToDec(N1);%计算适配度

DecN2=BinToDec(N2);

DecN3=BinToDec(N3);

DecN4=BinToDec(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

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

case 0

[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:BinToDec.m

function sum=BinToDec(X)

sum=0;

for i=5:-1:1

sum=sum+X(1,i)*2^(5-i);

end

子程序3:cal.m

function[temp]=cal(X,n)

temp=zeros(n,5);

for i=1:n

temp(i,:)=X;

子程序4:crossover.m

function[A1,A2,A3,A4,position]=crossover(t1,t2,t3,t4)

while 1

p=floor(1000*rand);

if p>1

break;

else

continue;

end

end

position=mod(p,4)+1;

A1=[t1(1:position),t2(position+1:5)];

A2=[t2(1:position),t1(position+1:5)];

A3=[t3(1:position),t4(position+1:5)];

A4=[t4(1:position),t3(position+1:5)];

end

因篇幅问题不能全部显示,请点此查看更多更全内容