Matlab遗传算法求函数最大值

matlab 专栏收录该内容
3 篇文章 0 订阅

用遗传算法求目标函数的最大值

主函数函数main.m

global Bitlength%定义3个全局变量
global boundsbegin
global boundsend
boundsbegin=-2;
boundsend=2;
precision=0.0001;%运算精确度
Bitlength=ceil(log2((boundsend-boundsbegin)'./precision));%染色体长度
popsize=50;%初始种群大小
Generationmax=12;%最大进化代数
pcrossover=0.90;%交叉概率
pmutation=0.09;%变异概率
population=round(rand(popsize,Bitlength));%随机生产初始化种群
[Fitvalue,cumsump]=fitness(population); %调用子函数1算个体适应度和选择累积概率
Generation=1;
while Generation<Generationmax+1%总共进化12for j=1:2:popsize%每一次生成2个个体,经过25次循环生产一个新种群,完成一代进化
        seln=selection(population,cumsump);%调用子函数2选择操作,返回选中的2个个体的序号
        scro=crossover(population,seln,pcrossover);%调用子函数3交叉操作,返回2条染色体
        scnew(j,:)=scro(1,:);%存储交叉操作返回的染色体
        scnew(j+1,:)=scro(2,:);
        smnew(j,:)=mutation(scnew(j,:),pmutation);%调用子函数4对交叉操作返回的染色体变异
        smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);    
    end
    population=smnew;%更新种群
    [Fitvalue,cumsump]=fitness(population);%调用子函数1计算新种群的适应度
    [fmax,nmax]=max(Fitvalue);%记录最佳适应度和其染色序号
    fmean=mean(Fitvalue);
    ymax(Generation)=fmax;%记录当代最佳适应度
    ymean(Generation)=fmean;%记录当代平均适应度
    x=transform2to10(population(nmax,:));%调用子函数6转化为10进制数
    xx=boundsbegin+x*(boundsend-boundsbegin)/(power(boundsend,Bitlength)-1);%将x整合到[-2,2]区间中
    xmax(Generation)=xx;%保存整合后最佳染色体10进制的值
    Generation=Generation+1;%依次循环进化12代,得到最佳种群个体
end
Generation=Generation-1
Bestpopulation=xx%最佳种群个体,即x的值
Targetmax=targetfun(xx)%调用子函数7要求的函数的最大值

子函数1:计算适应度和累积选择率fitness.m

function [Fitvalue,cumsump]=fitness(population)
global Bitlength
global boundsbegin
global boundsend
popsize=size(population,1);%总共计算多少个个体
for i=1:popsize
    x=transform2to10(population(i,:));%调用子函数6转化为10进制数
    xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),Bitlength)-1);
    Fitvalue(i)=targetfun(xx);
end
Fitvalue=Fitvalue'+230;
fsum=sum(Fitvalue);
everypopulation=Fitvalue/fsum;
cumsump(1)=everypopulation(1);
for i=2:popsize
    cumsump(i)=cumsump(i-1)+everypopulation(i);
end
cumsump=cumsump';

子函数2:选择操作函数selection.m

function seln=selection(population,cumsump)
%子函数选择操作,从种群中随机选择2个个体
for i=1:2
    r=rand;
    j=1;
    prand=cumsump-r;
    while prand(j)<0
        j=j+1;
    end
    seln(i)=j;%选择个体的序号
end

子函数3:交叉操作函数crossover.m

function scro=crossover(population,seln,pc)
global Bitlength
pcc=IfcroORmut(pc);%调用子函数5判断是否进行交叉
if pcc==1%进行交叉
    c=round(rand*(Bitlength-2))+1;%在[1,Bitlength-1]范围内随机产生一个交叉位
    scro(1,:)=[population(seln(1),1:c) population(seln(2),c+1:Bitlength)];
    scro(2,:)=[population(seln(2),1:c) population(seln(1),c+1:Bitlength)];
else%不交叉,返回原值
    scro(1,:)=population(seln(1),:);
    scro(2,:)=population(seln(2),:);
end

子函数4:变异操作mutation.m

function smnew=mutation(scnew,pmutation)
global Bitlength
smnew=scnew;
paa=IfcroORmut(pmutation);调用子函数5,判断是否进行变异
if paa==1
    v=round(rand*(Bitlength-1))+1;%在[1,Bitlength]中选择一个变异位
    smnew(v)=abs(scnew(v)-1);%将smnew中第V个位置变异 
end

子函数5:判断是否进行交叉或者变异IfcroORmut.m

function pcc=IfcroORmut(mutORcro)
judge(1:100)=0;
L=round(100*mutORcro);
judge(1:L)=1;
n=round(rand*99)+1;
pcc=judge(n);

子函数6:二进制转化为十进制transform2to10.m

function x=transform2to10(Population)
global Bitlength
x=Population(Bitlength);
for i=1:Bitlength-1
    x=x+Population(Bitlength-i)*power(2,i);
end

子函数7:目标函数即为适应度函数targetfun.m

function y=targetfun(x)
%适应度函数,即原函数
y=200*exp(-0.05*x).*sin(x);

运行结果:
运行结果如图
当进化了12代后,x约等于1.5时取到最大值185。

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值