编程实现利用遗传算法求解方程最值
编程实现利用遗传算法求解方程最值
一.函数为:
求函数y=x+3*sin(2*x)-7*cos(x) 在【-4 4】的最大值
二.MATLAB 程序如下:
1.主控制程序
GA.m
%求函数y=x+3*sin(2*x)-7*cos(x) 在【-4 4】的最大值
%
function main()
clear
clc
popsize=100
chromlength=10
pc=0.6
pm=0.01
%%
pop=initpop(popsize,chromlength)
for i=1:100
[objvalue]=calobjvalue(pop)
fitvalue=calfitvalue(objvalue)
[newpop]=selection(pop,fitvalue)%选择操作
[newpop]=crossover(pop,pc)%交叉操作
[newpop]=mutation(pop,pm)%变异操作
[bestindividaul,bestfit]=best(pop,fitvalue)%求出群体中适应值最大的个体及其适应值y(i)=max(bestfit)
n(i)=i
pop5=bestindividaul
x(i)=decodechrom(pop5,1,chromlength)*8/1023-4
pop=newpop;
end
x(i)
y(i)
fplot('x+3*sin(2*x)-7*cos(x)',[-4 4])
grid on
hold on
plot(x,y,'r*')
title('x+3*sin(2*x)-7*cos(x)的最大值')
hold off
2.子程序:初始化
%初始化
function pop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength)) %rand随机产生初始种群3. 子程序:计算目标函数
%计算目标函数值
function [objvalue]=calobjvalue(pop)
temp1=decodechrom(pop,1,10)
x=temp1*8/1023-4
objvalue=x+3*sin(2*x)-7*cos(x)
function pop2=decodechrom(pop,spoint,length)
pop1=pop(:,spoint:spoint+length-1)
pop2=decodebinary(pop1)
function pop2=decodebinary(pop)
[px,py]=size(pop)
for i=1:py
pop1(:,i)=2.^(py-1).*pop(:,i)
py=py-1
end
pop2=sum(pop1,2)
4. 子程序:选择操作
%选择
function [newpop]=selection(pop,fitvalue)
totalfit=sum(fitvalue)
fitvalue=fitvalue/totalfit%但个个体选择概率
fitvalue=cumsum(fitvalue)
[px,py]=size(pop)
ms=sort(rand(px,1))
fitin=1
newin=1
while newin<=px
if(ms(newin)) newpop(newin,:)=pop(fitin,:) newin=newin+1 else fitin=fitin+1 end end 5.子程序:交叉 % 交叉 function [newpop]=crossover(pop,pc) [px,py]=size(pop) newpop=ones(size(pop)) for i=1:2:px-1 if(rand 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:py)] else newpop(i,:)=pop(i,:) newpop(i+1,:)=pop(i+1,1) end end % 6. 子程序:变异 %变异 function [newpop]=mutation(pop,pm) [px,py]=size(pop) newpop=ones(size(pop)) for i=1:px if(rand mpoint=round(rand*py) if mpoint<=0 mpoint=1 end newpop(i,:)=pop(i,:) if any(newpop(i,mpoint))==0 newpop(i,mpoint)=1 else newpop(i,mpoint)=0 end else newpop(i,:)=pop(i,:) end end 7. 求出群体中适应值最大的个体及其适应值: %求出群体中最大适应值及其个体 function [bestindividual,bestfit]=best(pop,fitvalue) [px,py]=size(pop) bestindividual=pop(1,:) bestfit=fitvalue(1) for i=2:px if fitvalue(i)>bestfit bestindividual=pop(i,:) bestfit=fitvalue(i) end end 三 以上程序运行后的的结果如下图: -4-3-2-101234 -15-10 -5 5 10 15 (图)