MATLAB遗传算法作业Word文档格式.docx
《MATLAB遗传算法作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《MATLAB遗传算法作业Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
b)个体评价:
计算群体P(t)中各个个体的适应度。
c)选择运算:
将选择算子作用于群体。
选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。
选择操作是建立在群体中个体的适应度评估基础上的。
d)交叉运算:
将交叉算子作用于群体。
遗传算法中起核心作用的就是交叉算子。
e)变异运算:
将变异算子作用于群体。
即是对群体中的个体串的某些基因座上的基因值作变动。
群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。
f)终止条件判断:
若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
三:
matlab实现
例子:
f(x)=10*sin(5x)+7*cos(4x)x∈[0,10]将变量域[0,10]离散化为二值域[0,1023],x=0+10*b/1023。
1.初始化
initpop.m
functionpop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength));
%rand随机产生每个单元为0或者1
行数(种群数量)为popsize,列数为chromlength(个体所含基因数)的矩阵,
2.计算目标函数值
2.1将二进制数转化为十进制数
(1)
decodebinary.m
%产生[2^n2^(n-1)...1]的行向量,然后求和,将二进制转化为十进制
functionpop2=decodebinary(pop)
[px,py]=size(pop)%Pop的行和列数
fori=1:
px
pop2(i)=0
forj=1:
py
pop2(i)=pop2(i)+2.^(py-j)*pop(i,j)
end
end
2.2将二进制编码转化为十进制数
(2)
Decodechrom.m
%函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置
functionpop2=decodechrom(pop,spoint,length)
pop1=pop(:
spoint:
spoint+length-1)%pop1取pop的第spoint列到spoint+length-1列为止
pop2=decodebinary(pop1)
2.2.3计算目标函数值
%calobjvalue.m函数的功能是实现目标函数的计算
function[objvalue]=calobjvalue(pop)
temp1=decodechrom(pop,1,10)%将pop每行转换成十进制
x=temp1*10/1023%将二值域中的数转化为变量域的数
objvalue=10*sin(5*x)+7*cos(4*x)%变量域是从1到10
m=max(objvalue)
b=0
fori=1:
100
ifobjvalue(i)==m
b=b+1
end
figure
fplot('
10*sin(5*x)+7*cos(4*x)'
[010])
holdon
plot(x,objvalue,'
or'
)
xlabel(sprintf('
%2d'
b))
gridon
3计算个体的适应值
calfitvalue.m
%计算个体的适应值
functionfitvalue=calfitvalue(objvalue)
[px,py]=size(objvalue)
ifobjvalue(i)>
0;
temp=objvalue(i)
else
temp=0.0
fitvalue(i)=temp
End
4选择复制
selection.m
%根据方程pi=fi/∑fi=fi/fsum,选择步骤:
%1)在第t代,计算fsum和pi
%2)产生{0,1}的随机数rand(.),求s=rand(.)*fsum
%3)求∑fi≥s中最小的k,则第k个个体被选中
%最后再产生一个0到1之间的随机数,依据该随机数出现在上述哪一个概率区域内来确定各个个体被选中的次数。
%4)进行N次2)、3)操作,得到N个个体,成为第t=t+1代种群
function[newpop]=selection(pop,fitvalue)
totalfit=sum(fitvalue)%求适应值的和
fitvalue=fitvalue/totalfit%单个个体被选择的概率
%如fitvalue=[1234],则cumsum(fitvalue)=[13610]
fitvalue=cumsum(fitvalue)
[px,py]=size(pop)
ms=sort(rand(px,1))%从小到大排列列向量
fitin=1
newin=1
whilenewin<
=px%得到px个个体
if(ms(newin))<
fitvalue(fitin)
newpop(newin,:
)=pop(fitin,:
)%将pop的第fitin行复制给newpop
中的newin行
newin=newin+1
fitin=fitin+1
5交叉
crossover.m
%交叉的概率为pc
function[newpop]=crossover(pop,pc)
[px,py]=size(pop)
newpop=ones(size(pop))%所有元素为1
2:
px-1
if(rand<
pc)
cpoint=round(rand*py)
newpop(i,:
)=[pop(i,1:
cpoint),pop(i+1,cpoint+1:
py)];
newpop(i+1,:
)=[pop(i+1,1:
cpoint),pop(i,cpoint+1:
)=pop(i,:
)=pop(i+1,:
6变异
mutation.m
%每个个体的每一位都以概率pm翻转,即由“1”变为“0”,
function[newpop]=mutation(pop,pm)
newpop=pop
px*py%对每一个元素进行判断
pm)
newpop(i)=1-pop(i)
7求出群体中最大得适应值及其个体
best.m
%求出群体中适应值最大的值
function[bestindividual,bestfit]=best(pop,fitvalue)
bestindividual=pop(1,:
bestfit=fitvalue
(1);
fori=2:
iffitvalue(i)>
bestfit
bestindividual=pop(i,:
bestfit=fitvalue(i)
8主程序
main.m
%遗传算法主程序
popsize=100%种群大小
chromlength=10%字符串长度,即个体长度
pc=0.6%交叉概率
pm=0.001%变异概率
pop=initpop(popsize,chromlength)%随机产生初始群体
[objvalue]=calobjvalue(pop)%计算目标函数值,形成一个20*1的列向量
fitvalue=calfitvalue(objvalue)%计算群体中每个个体的适应度
20%20次迭代
[newpop]=selection(pop,fitvalue)%选择
[newpop]=crossover(newpop,pc)%交叉
[newpop]=mutation(newpop,pm)%变异
[objvalue]=calobjvalue(newpop)
fitvalue=calfitvalue(objvalue)
[bestindividual,bestfit]=best(newpop,fitvalue)%求出群体中适应值最大的个体及适应值
y(i)=max(bestfit);
n(i)=i;
pop5=bestindividual;
x(i)=decodechrom(pop5,1,chromlength)*10/1023;
pop=newpop;
end
四:
结果分析
上面六张图片分别表示的是第1,3,5,10,15,20次迭代之后的结果,其中每张图中间下方的数字表示最大函数值的个数,即每张图片圆点处于最高点的个数,显然看得出来,随着迭代次数的增加,基本上都会往最优解方向收敛。
再分析,每一次迭代过程中的最优解,每一对(x,y)表示一次最优解。
最大函数值出现在x=7.8592和1.5738附近,这与上面六张图展示也相符。