遗传算法解决函数最大值问题

该博客介绍了使用遗传算法解决优化问题的过程。设置了初始种群大小为50,编码长度为15,迭代次数为100,杂交率为0.7,选择率为0.5。在MATLAB中实现,包括种群初始化、适应度计算、选择、交叉和变异操作,最终找到函数的最优解并展示结果。
摘要由CSDN通过智能技术生成

一 设计参数:
初始种群大小:50
问题解区间[-6,6]
二进制编码长度:15
迭代次数:100
杂交率:0.7
选择率:0.5
二 最终结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

main.m函数,主函数设计
clear;clc;close all;
%%遗传参数设置
NUMPOP=50;%初始种群大小
irange_l=-6; %问题解区间
irange_r=6;
LENGTH=15; %二进制编码长度
ITERATION = 25;%迭代次数
CROSSOVERRATE = 0.7;%杂交率
SELECTRATE = 0.5;%选择率
%变异率 0.1
%%
%初始化种群
[popx,popy]=m_InitPop(NUMPOP,irange_l,irange_r);%随机产生种群的X

% pop_save=pop;
%绘制初始种群分布
% ff=[];
for i=1:size(popx,2)
    for j=1:size(popy,2)
        ff(:,i)=m_Fx(popx(i),popy(j));
    end
end
plot3(popx,popy,ff,'rp')
grid on
title('初始种群分布');
%
%%
fitnessnum=[];
%开始迭代
for time=1:100
    %     %计算初始种群的适应度
    fitness=m_Fitness(popx,popy);
    %     %选择
    parentpopx=m_Select(fitness,popx,SELECTRATE);
    parentpopy=m_Select(fitness,popy,SELECTRATE);
    %     %编码
    binpop=。(parentpopx,parentpopy,LENGTH,irange_l);   
    %     %     %交叉
    kidsPop = crossover(binpop,NUMPOP,CROSSOVERRATE);
    %     %     %变异
    kidsPop = Variation(kidsPop,0.005);
    %     %解码
    [kidsPopx,kidsPopy]=m_Incoding(kidsPop,irange_l);
    %记录适应度
    fitnessnum(time)=min(m_Fitness(popx,popy));
    fprintf("迭代到第%d代\n",time)
    %更新种群
    popx=[popx kidsPopx];
    popy=[popy kidsPopy];
end
HSZ=[];
for i=1:size(popx,2)
        HSZ(:,i)=m_Fx(popx(i),popy(i));
end

%%
x=linspace(-6,6);
y=linspace(-6,6);
ff2=[];
for i=1:size(x,2)
    for j=1:size(y,2)
        ff2(i,j)=m_Fx(x(i),y(j));
    end
end
figure
surf(x,y,ff2)
title('函数三维曲面')
xlabel('x-axis'),ylabel('y-axis '),zlabel('z-axis')
figure
plot3(popx,popy,HSZ,'rp')
grid on
title('最终种群函数值','LineWidth',1,'FontSize',25,'FontName','黑体');
fprintf('最优解:%f\n',max(max(HSZ)))
[x0,y0]=find(HSZ==max(max(HSZ)));
x1=popx(1,x0);
y1=popy(1,y0);
fprintf('最优解所在位置:%f,%f\n',x1,y1)
%%
figure
xxx=[1:1:length(fitnessnum)];
plot(xxx,fitnessnum)
title('适应度曲线')
xlabel("迭代次数")
m_Fitness.m函数,计算适应度
function fitness =m_Fitness(popx,popy)
%% Fitness Function
for i=1:size(popx,2)
    fitness(i)=1-m_Fx(popx(:,i),popy(:,i));
end
%最重要得到最小的fitness值
m_Coding.m,进行二进制编码
function [dec2binpop]=m_Coding(popx,popy,pop_length,irange_l)
%% 二进制编码(生成染色体)
% 输入:popx与popy--种群 然后将两者编码到同一个染色体上
%      pop_length--编码长度为
popx=round((popx-irange_l)*10.^3);
popy=round((popy-irange_l)*10.^3);
for n=1:size(popx,2) %列循环
    dec2binpopx{1,n}=dec2bin(popx(1,n));%dec2bin 把一个十进制数转换成一个字符串形式的二进制数。
    %dec2binpop是cell数组
    lengthpopx=length(dec2binpopx{1,n});
    for s=1:pop_length-lengthpopx %补零
        dec2binpopx{1,n}=['0' dec2binpopx{1,n}];
    end
    %     binPop{n}=dec2binpop{k,n};   %取dec2binpop的第k行
end
%把popy变成二进制
for n=1:size(popy,2) %列循环
    dec2binpopy{1,n}=dec2bin(popy(1,n));%dec2bin 把一个十进制数转换成一个字符串形式的二进制数。
    
    %dec2binpop是cell数组
    lengthpopy=length(dec2binpopy{1,n});
    for s=1:pop_length-lengthpopy %补零
        dec2binpopy{1,n}=['0' dec2binpopy{1,n}];
    end
end
%     binPop{n}=dec2binpop{k,n};   %取dec2binpop的第k行
dec2binpop=[dec2binpopx,dec2binpopy];
end
crossover.m,交叉函数。
代码见资源



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值