基于遗传算法的函数优化.docx
《基于遗传算法的函数优化.docx》由会员分享,可在线阅读,更多相关《基于遗传算法的函数优化.docx(25页珍藏版)》请在冰豆网上搜索。
![基于遗传算法的函数优化.docx](https://file1.bdocx.com/fileroot1/2023-2/3/ae61057f-c778-4458-8793-a4847838c9fd/ae61057f-c778-4458-8793-a4847838c9fd1.gif)
基于遗传算法的函数优化
智能多媒体实验报告
实验六:
基于遗传算法的函数优化
姓名:
班级:
学号:
同做者:
一、实验目的
利用遗传算法求解函数极值。
二、算法概要
1.遗传算法概要
遗传算法是具有“生成+检测”的迭代过程的搜索算法。
它的基本处理流程如图6.1所示。
由此流程图可见,遗传算法是一种群体型操作,该操作以群体中的所有个体为对象。
选择(selection)、交叉(crossover)和变异(mutation)是遗传算法的3个主要操作算子,它们构成了所谓的遗传操作(geneticoperation),使遗传算法具有了其它传统方法所没有的特性。
遗传算子包含如下6个基本因素:
(1)参数编码:
由于遗传算法不能直接处理解空间的解数据,因此必须通过编码将它们表示成遗传空间的基因型串结构数据。
(2)生成初始群体:
由于遗传算法的群体型操作需要,所以必须为遗传操作准备一个由若干初始解组成的初始群体。
初始群体的每个个体都是通过随机方法产生。
(3)适应度评估检测:
遗传算法在搜索进化过程中一般不需要其他外部信息,仅用适应度(fitness)值来评估个体或解的优劣,并作为以后遗传操作的依据。
(4)选择(selection):
选择或复制操作是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。
个体适应度越高,其被选择的机会就越多。
此处采用与适用度成比例的概率方法进行选择。
具体地说,就是首先计算群体中所有个体适应度的总和(
),再计算每个个体的适应度所占的比例(
),并以此作为相应的选择概率
。
(5)交叉操作:
交叉操作是遗传算法中最主要的遗传操作。
简单的交叉(即一点交叉)可分两步进行:
首先对种群中个体进行随机配对;其次,在配对个体中随机设定交叉处,配对个体彼此交换部分信息。
(6)变异:
变异操作是按位(bit)进行的,即把某一位的内容进行变异。
变异操作同样也是随机进行的。
一般而言,变异概率
都取得较小。
变异操作是十分微妙的遗传操作,它需要和交叉操作配合使用,目的是挖掘群体中个体的多样性,克服有可能限于局部解的弊病。
这6个要素构成了遗传算法的核心内容,其流程如图6.1所示。
图6.1遗传算法的基本流程
2.二进制编码及解码方法
二进制编码是遗传算法中最主要的一种编码方法,它使用的编码符号集是由二进制符号0和1所组成的二进制符号集{0,1},它所构成的个体基因型是一个二进制编码符号串。
二进制编码符号串的长度与问题所要求的求解精度有关。
假设某一参数的取值范围是[Umin,Umax],我们用长度为L的二进制编码符号串来表示该参数,则它总共能够产生
种不同的编码,若使参数编码时的对应关系如下:
00000000…00000000=0→Umin
00000000…00000001=1→Umin+δ
………
111111111…11111111=2L﹣1→Umax
则二进制编码的编码精度为:
(6-1)
假设某一个个体的编码是:
X
bLbL﹣1bL,则对应的解码公式为:
(6-2)
例如,对于
,若用十位长的二进制编码来表示该参数的话,则下述符号串:
X:
0010101111
就可表示一个个体,它所对应的参数值是
。
此时的编码精度为
。
其中:
f个体适应度
[Umin,Umax]某变量的取值范围
δ编码精度
三、算法步骤及流程图
Step1:
参数设置及种群初始化;
Step2:
适应度评价;
Step3:
轮盘赌选择;
Step4:
交叉;
Step5:
变异;
Step6:
适应度评价;
Step7:
终止条件判断,若未达到终止条件,则转到Step3;
Step8:
输出结果。
四、实验程序
主程序
clc;
clear;closeall;
v=2*rand(50,22)-1;
v=hardlim(v);
[N,L]=size(v);ger=200;pc=0.5;pm=0.01;updatef=0;c=0;
disp(sprintf('Numberofgenerations:
%d',ger));
disp(sprintf('Populationsize:
%d',N));
disp(sprintf('Crossoverprobability:
%.3f',pc));
disp(sprintf('Mutationprobability:
%.3f',pm));
f='-1*(x.^2+y.^2)';
%Generalparameters&Initialoperations
sol1=1;vmfit=[];it=1;vx=[];C=[];updatef=-10;
x=decod(v(:
1:
11),11);y=decod(v(:
12:
end),11);fit=eval(f);
%Generations
t0=clock;
whileit<=ger
%Selection轮盘赌
fori=1:
N
sp(i)=(fit(i)+3)/sum(fit+3);%
end
fori=2:
N
sp(i)=sp(i-1)+sp(i);
end
fori=1:
N
p=rand
(1);sindex=1;
whilep>sp(sindex)
sindex=sindex+1;%寻找要选择个体的位置
end
newv(i,:
)=v(sindex,:
);
end
fori=1:
N
v(i,:
)=newv(i,:
);%用选择出的个体构成的种群替代旧的种群
end
%Crossver
fori=1:
N
cindex(i)=i;
end
fori=1:
N%产生要配对的父代的序号;经过N次顺序调换,将原有顺序打乱,使相邻两个个体作为交叉的父代
point=unidrnd(N-i+1);
temp=cindex(i);
cindex(i)=cindex(i+point-1);
cindex(i+point-1)=temp;
end
fori=1:
2:
N
p=rand
(1);
if(ppoint=unidrnd(L-1)+1;%1forj=point:
(L-1)%交叉
ch=v(cindex(i),j);
v(cindex(i),j)=v(cindex(i+1),j);%cindex中相邻的两个为两个父代的序号
v(cindex(i+1),j)=ch;
end
end
end
%Mutation
M=rand(N,L)<=pm;%产生(N,L)维的01矩阵,为1的位置进行变异
v=v-2.*(v.*M)+M;
%Evaluatefitness&Evolution
x=decod(v(:
1:
11),11);y=decod(v(:
12:
end),11);fit=eval(f);
[sol1,indb1]=max(fit);
ifupdatef>=sol1
sol1=updatef;
v(indb1,:
)=updatec;
end
updatef=sol1;
updatec=v(indb1,:
);
[sol2,indb2]=min(fit);
v(indb2,:
)=v(indb1,:
);
x=decod(v(:
1:
11),11);y=decod(v(:
12:
end),11);fit=eval(f);
media=mean(fit);
vx=[vxsol1];vmfit=[vmfitmedia];
ifrem(it,1)==0|it==10,
ifc~=1
disp(sprintf('Gen.:
%dx:
%2.5fy:
%2.5fAv:
%2.2ff(x,y):
%2.40f',it,x(indb1),y(indb1),media,sol1));
else
disp(sprintf('Gen.:
%dAv:
%2.2ff(x,y):
%2.5f',it,media,sol1));
end
end;
it=it+1;
end;
T=etime(clock,t0);%F=flops-f0;
X=x;Y=y;
x=x(indb1);y=y(indb1);fx=sol1;P=v;
disp(sprintf('thetotaltimeis%2.4f',T));
disp(sprintf('Maximumfound[f(x,y)]:
[%.2f]',fx));
%xx=vx;yy=vmfit;
figure
(2);plot(vx,'k');
title('f(x,y)xMean');xlabel('Generations');ylabel('f(x,y)');
holdon;plot(vmfit,'k:
');legend('best','mean',0);holdoff;
decod.m子程序
functioncode=decod(w_code,len)
w_size=size(w_code);
code=ones(w_size
(1),1);%N*1的矩阵
%编写解码表
code_arry=ones(1,len);
fori=0:
len-1
code_arry(i+1)=2.^i;
end
%针对每一个样本进行解码
fori=1:
w_size
(1)
w=w_code(i,:
);
m=w.*code_arry;
code(i)=sum(m);
end
%转换到给定区间
rate=2./(2.^len-1);
code=-1+rate.*code;
return;
程序流程图:
五、实验结果
Numberofgenerations:
200
Populationsize:
50
Crossoverprobability:
0.500
Mutationprobability:
0.010
Gen.:
1x:
0.05227y:
0.17440Av:
-0.55f(x,y):
-0.0331482272125327780000000000000000000000
Gen.:
2x:
0.04934y:
0.17440Av:
-0.53f(x,y):
-0.0328503900402103420000000000000000000000
Gen.:
3x:
-0.09331y:
-0.12066Av:
-0.48f(x,y):
.023*********
Gen.:
4x:
0.05227y:
0.10992Av:
-0.42f(x,y):
-0.0148140582009155010000000000000000000000
Gen.:
5x:
0.05227y:
0.10992Av:
-0.37f(x,y):
-0.0148140582009155010000000000000000000000
Gen.:
6x:
0.05227y:
0.10992Av:
-0.34f(x,y):
-0.0148140582009155010000000000000000000000
Gen.:
7x:
0.05227y:
0.07865Av:
-0.31f(x,y):
-0.0089184095590458482000000000000000000000
Gen.:
8x:
0.05227y:
0.01612Av:
-0.33f(x,y):
-0.0029922135148867180000000000000000000000
Gen.:
9x:
0.05227y:
0.01612Av:
-0.38f(x,y):
-0.0029922135148867180000000000000000000000
Gen.:
10x:
0.05227y:
0.01612Av:
-0.32f(x,y):
-0.0029922135148867180000000000000000000000
Gen.:
11x:
0.05227y:
0.01612Av:
-0.24f(x,y):
-0.0029922135148867180000000000000000000000
Gen.:
12x:
0.04836y:
0.01612Av:
-0.25f(x,y):
-0.0025989157104096623000000000000000000000
Gen.:
13x:
0.04836y:
0.01612Av:
-0.24f(x,y):
-0.0025989157104096623000000000000000000000
Gen.:
14x:
0.04836y:
0.01612Av:
-0.22f(x,y):
-0.0025989157104096623000000000000000000000
Gen.:
15x:
0.04836y:
0.01612Av:
-0.24f(x,y):
-0.0025989157104096623000000000000000000000
Gen.:
16x:
0.04836y:
0.00049Av:
-0.25f(x,y):
-0.0023392627909490826000000000000000000000
Gen.:
17x:
0.04836y:
0.00049Av:
-0.30f(x,y):
-0.0023392627909490826000000000000000000000
Gen.:
18x:
0.04836y:
0.00049Av:
-0.31f(x,y):
-0.0023392627909490826000000000000000000000
Gen.:
19x:
0.04836y:
0.00049Av:
-0.34f(x,y):
-0.0023392627909490826000000000000000000000
Gen.:
20x:
0.04836y:
0.00049Av:
-0.37f(x,y):
-0.0023392627909490826000000000000000000000
Gen.:
21x:
0.03273y:
0.03175Av:
-0.41f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
22x:
0.03273y:
0.03175Av:
-0.33f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
23x:
0.03273y:
0.03175Av:
-0.30f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
24x:
0.03273y:
0.03175Av:
-0.28f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
25x:
0.03273y:
0.03175Av:
-0.26f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
26x:
0.03273y:
0.03175Av:
-0.21f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
27x:
0.03273y:
0.03175Av:
-0.13f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
28x:
0.03273y:
0.03175Av:
-0.13f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
29x:
0.03273y:
0.03175Av:
-0.11f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
30x:
0.03273y:
0.03175Av:
-0.10f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
31x:
0.03273y:
0.03175Av:
-0.10f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
32x:
0.03273y:
0.03175Av:
-0.10f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
33x:
0.03273y:
0.03175Av:
-0.19f(x,y):
-0.0020796098714885034000000000000000000000
Gen.:
34x:
0.02101y:
0.03175Av:
-0.23f(x,y):
-0.0014495696992679788000000000000000000000
Gen.:
35x:
0.02101y:
0.03175Av:
-0.21f(x,y):
-0.0014495696992679788000000000000000000000
Gen.:
36x:
0.02101y:
0.03175Av:
-0.22f(x,y):
-0.0014495696992679788000000000000000000000
Gen.:
37x:
0.02101y:
0.03175Av:
-0.23f(x,y):
-0.0014495696992679788000000000000000000000
Gen.:
38x:
0.02101y:
0.03175Av:
-0.17f(x,y):
-0.0014495696992679788000000000000000000000
Gen.:
39x:
0.02003y:
0.03175Av:
-0.17f(x,y):
-0.0014094762337630387000000000000000000000
Gen.:
40x:
0.02003y:
0.03175Av:
-0.18f(x,y):
-0.0014094762337630387000000000000000000000
Gen.:
41x:
0.01710y:
0.00440Av:
-0.15f(x,y):
-0.0003116789639848482400000000000000000000
Gen.:
42x:
0.01710y:
0.00440Av:
-0.19f(x,y):
-0.0003116789639848482400000000000000000000
Gen.:
43x:
0.01710y:
0.00440Av:
-0.19f(x,y):
-0.0003116789639848482400000000000000000000
Gen.:
44x:
0.01710y:
0.00440Av:
-0.21f(x,y):
-0.0003116789639848482400000000000000000000
Gen.:
45x:
0.01710y:
0.00440Av:
-0.20f(x,y):
-0.0003116789639848482400000000000000000000
Gen.:
46x:
0.01710y:
0.00440Av:
-0.15f(x,y):
-0.0003116789639848482400000000000000000000
Gen.:
47x:
0.01710y:
0.00440Av:
-0.15f(x,y):
-0.0003116789639848482400000000000000000000
Gen.:
48x:
0.00537y:
0.00440Av:
-0.19f(x,y):
-0.0000482076192380845980000000000000000000
Gen.:
49x:
0.00537y:
0.00440Av:
-0.25f(x,y):
-0.0000482076192380845980000000000000000000
Gen.:
50x:
0.00537y:
0.00440Av:
-0.20f(x,y):
-0.0000482076192380845980000000000000000000
Gen.:
51x:
0.00537y:
0.00244Av:
-0.15f(x,y):
-0.0000348431307364366280000000000000000000
Gen.:
52x:
0.00537y:
0.00049Av:
-0.13f(x,y):
-0.0000291154928071597700000000000000000000
Gen.:
53x:
0.00537y:
0.00049Av:
-0.13f(x,y):
-0.0000291154928071597700000000000000000000
Gen.:
54x:
0.00147y:
0.00440Av:
-0.11f(x,y):
-0.0000214786422347901870000000000000000000
Gen.:
55x:
0.00147y:
0.00440Av:
-0.09f(x,y):
-0.0000214786422347901870000000000000000000
Gen.:
56x:
0.00147y:
0.00440Av:
-0.07f(x,y):
-0.0000214786422347901870000000000000000000
Gen.:
57x:
0.00147y:
0.00440Av:
-0.04f(x,y):
-0.0000214786422347901870000000000000000000
Gen.:
58x:
0.00049y:
0.00440Av:
-0.03f(x,y):
-0.0000195694295916979000000000000000000000
Gen.:
59x:
0.00049y:
0.00440Av:
-0.03f(x,y):
-0.0000195694295916979000000000000000000000
Gen.:
60x:
0.00049y:
0.0044