matlab遗传算法

五月份好久都没写博客了。我辈工科生当自强,好好学习技术。


言归正传,本学期我是选了一门matlab的选修课的。最近使用matlab,应用遗传算法求解目标函数的最大值。私以为这个算法还是很牛逼的,所以在这里分享给大家。

代码:

%用遗传算法求函数f(x1,x2)=100(x1^2-x2)^2+(1-x1)^2的最大值,-2.048<=x1,x2<=2.048
Umax=2.048;Umin=-2.048;
N=80;%种群规模
T=100;%迭代到第几代
Pc=0.8;%交叉概率
Pm=0.05;%变异概率
L=10;%编码长度
bval=round(rand(N,2*L));%随机产生初始种群的80个个体
obj=zeros(1,N);%种群每个个体对应的函数f(x1,x2)的值
for ii=1:T
    for i=1:N
        y1=0;y2=0;
        for j=1:L
            y1=y1+bval(i,L-j+1)*2^(j-1);
        end
        for j=1:L
            y2=y2+bval(i,2*L-j+1)*2^(j-1);
        end
        %把种群中个体解码为对应的x1和x2
        x1=(Umax-Umin)*y1/(2^L-1)+Umin;%把编码左边L位解码为x1
        x2=(Umax-Umin)*y2/(2^L-1)+Umin;%把编码右边L位解码为x2
        obj(i)=100*(x1*x1-x2).^2+(1-x1).^2;%计算x1和x2对应的函数f(x1,x2)的值,即每个个体的适应度
        xx(i,:)=[x1,x2];
    end
    func=obj;%适应度函数
    %fsum=sum(func);
    p=func/sum(func);%求每个个体的选择概率
    q=cumsum(p);%求累加概率
    [fmax,indmax]=max(func);%求最佳个体
    bestv=-inf;
    if fmax>=bestv
        bestv=fmax;
        bvalxx=bval(indmax,:);
        optxx=xx(indmax,:);
    end
    for i=1:N-1
        r=rand;%相当于rand(1)
        tmp=find(r<=q);%设置一个下限
        newbval(i,:)=bval(tmp(1),:);%79行的矩阵
    end
    newbval(N,:)=bvalxx;%最优个体保留
    bval=newbval;%更新bval的矩阵
    for i=1:2:(N-1)
        cc=rand;
        %单点交叉
        if cc<Pc
            point=ceil(rand*(2*L-1));%取一个1到2L-1的整数,作为交叉点
            ch=bval(i,:);
            bval(i,point+1:2*L)=bval(i+1,point+1:2*L);
            bval(i+1,point+1:2*L)=ch(1,point+1:2*L);
        end
        %变异
        cm=rand;
        if cm<Pm
            point=ceil(rand*(2*L-1));%取一个1到2L-1的整数,作为变异点
            bval(i,point)=~bval(i,point);%point 是一个点
        end
    end
end
bestv,optxx
%绘图,观察函数图象,确定最大值点的位置
[x,y]=meshgrid(-2.05:0.01:2.05);
z=100*(x.*x-y).^2+(1-x).^2;
mesh(x,y,z);
x1=2.048,y1=2.048,
z1=100*(x1.*x1-y1).^2+(1-x1).^2
x2=2.048,y2=-2.048
z2=100*(x2.*x2-y2).^2+(1-x2).^2,
x3=-2.048,y3=2.048,
z3=100*(x3.*x3-y3).^2+(1-x3).^2,
x4=-2.048,y4=-2.048,
z4=100*(x4.*x4-y4).^2+(1-x4).^2
%axis([-2.048,2.048,-2.048,2.048,-4000,4000]);

代码中求得的最优值在bestv以及最优值所对应的最优解存储在optxx中。

代码跑完之后绘制出的图形:

运行结果

我总是觉得,matlab画的图看着还是很舒服的。继续努力学习为了画更漂亮的图。

代码跑完之后的命令窗口:

运行结果

最终我们借助遗传算法,计算出了该函数的最优值(最大值),以及最优解。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值