利用遗传算法求出下面函数的极小值:z=2-exp[-(x2+y2)]

遗传算法方法介绍

第一步:确定决策变量及其约束条件:[-5,+5]

第二步:建立优化模型:min z(x,y)=2-exp[-(x2+y2)]

第三步:确定编码方法。用长度为50位的二进制编码串来表示决策变量x,y。

第四步:确定解码方法。解码时将50位长的二进制编码前25位转换为对应的十进制整数代码,记为x,后25位转换后记为y。

第五步:确定个体评价方法。

第六步:设计遗传算子。选择运算用比例选择算子,交叉运算使用单点交叉算子,变异运算使用基本位变异算子。

第七步:确定遗传算法的运行参数。

代码如下:

function ga_main()

clear all;
close all;
clc;

tic;
n=30;
ger=200;
pc=0.65;
pm=0.05;

% 生成初始种群
v=init_population(n,50); 
[N,L]=size(v);
disp(sprintf('Number of generations:%d',ger));
disp(sprintf('Population size:%d',N));
disp(sprintf('Crossover probability:%.3f',pc));
disp(sprintf('Mutation probability:%.3f',pm));

% 待优化问题
xmin=-5;%变量范围,此处为两个变量
xmax=5;
ymin=-5;
ymax=5;
f='-(2-exp(-(x.^2+y.^2)))';%求最小值在前面加一个负号

[x,y]=meshgrid(xmin:0.1:xmax,ymin:0.1:ymax);%相当于求size(z)
%利用mesh画图,x,y必须为向量,如果X和Y的长度分别为m和n,则Z必须为m*n的矩阵,即[m,n]=size(Z)
vxp=x;
vyp=y;
vzp=eval(f);%将括号内的字符串视为语句并运行,此语句等于vzp=-(2-exp(-(x.^2+y.^2)))

figure(1);
mesh(vxp,vyp,-vzp);%画出三维图形
hold on;
grid on;

% 计算适应度,并画出初始种群图形
x=decode(v(:,1:25),xmin,xmax);%25位二进制转化为十进制,':'表示对所有进行操作
y=decode(v(:,26:50),ymin,ymax);%26位二进制转化为十进制,':'表示对所有进行操作
fit=eval(f);

plot3(x,y,-fit,'k*');
title('(a)染色体的初始位置');
xlabel('x');
ylabel('y');
zlabel('f(x,y)');

% 迭代前的初始化
vmfit=[];
vx=[];
it=1;    % 迭代计数器

% 开始进化
while it<=ger

    % Reproduction(Bi-classist Selection)
    vtemp=roulette(v,fit);

    % Crossover 
    v=crossover(vtemp,pc);

    % Mutation
    M=rand(N,L)<=pm;
    %M(1,:)=zeros(1,L);
    v=v-2.*(v.*M)+M;

    % Results
    x=decode(v(:,1:25),xmin,xmax);
    y=decode(v(:,26:50),ymin,ymax);
    fit=eval(f);
    [sol,indb]=max(fit);    % 每次迭代中最优目标函数值
    v(1,:)=v(indb,:);
    fit_mean=mean(fit);     % 每次迭代中目标函数值的平均值
    vx=[vx sol];
    vmfit=[vmfit fit_mean];
    it=it+1;
end

%%%% 最后结果
disp(sprintf('\n'));    %空一行

% 显示最优解及最优值
disp(sprintf('Maximum found[x,f(x)]:[%.4f,%.4f,%.4f]',x(indb),y(indb),-sol));

% 图形显示最优结果
figure(2);
mesh(vxp,vyp,-vzp);
hold on;
grid on;
plot3(x,y,-fit,'r*');
title('染色体的最终位置');
xlabel('x');
ylabel('y');
zlabel('f(x,y)');

% 图形显示最优及平均函数值变化趋势
figure(3);
plot(-vx);
%title('最优,平均函数值变化趋势');
xlabel('Generations');
ylabel('f(x)');
hold on;
plot(-vmfit,'r');
hold off;

runtime=toc
end
%%
%Decodify bitstrings
function x=decode(v,xymin,xymax)
% x ----real value(precision:6)
% v ----binary string(length:22)
v=fliplr(v); %实现左右翻转颠倒
[s,c]=size(v); %c代表串长。求行,列
aux=0:1:c-1;   %21维向量
aux=ones(s,1)*aux;%权值向量矩阵
x1=sum((v.*2.^aux)');%权值 %注意转置 %sum是求列和 x=xymin+(xymax-xymin)*x1./(2^c-1); %最大值4194303; end %% %Crossover function v=crossover(vtemp,pc) [N,L]=size(vtemp); C(:,1)=rand(N,1)<=pc;%选择被杂交的。<=pc就是1否则是0构成0-1向量 I=find(C(:,1)==1);%找分量等于1的元素,其下标构成向量。 I';%变成行向量
j=1;
for i=1:2:size(I)%两两配对所以以2为步长
    if i>=size(I)%奇数个处理
        break;
    end
    site=fix(1+L*rand(1));%fix向零取整,L=22.%site属于1-22.
    temp=vtemp(I(i,1),:);%交换的暂存变量。T
    vtemp(I(i,1),site:end)=vtemp(I(i+1,1),site:end);%交换后面的数值
    vtemp(I(i+1,1),site:end)=temp(:,site:end);%交换
end
v=vtemp;%复制返回
end        
%%
%Function init_population
function v=init_population(n1,s1)
v=round(rand(n1,s1));%rand产生随机数,%round四舍五入取整
end
%%
function vtemp=roulette(v,fit)
N=size(v);  %N向量
fitmin=abs(min(fit));%最小值和绝对值
fit=fitmin+fit; %最小值加上步长,保证fit>=0.
%fit
S=sum(fit);%求向量的和
for i=1:N
    SI=S*rand(1);%rand随机数。0-s之间的一个随机数
    for j=1:N
        if SI<=sum(fit(1:j))  %累加列值
            vtemp(i,:)=v(j,:);%选中此样本
            break
        end
    end
end
end

运行结果:
Number of generations:200
Population size:30
Crossover probability:0.650
Mutation probability:0.050

Maximum found[x,f(x)]:[0.0050,-0.0025,1.0000]

runtime =

1.7109

《利用遗传算法求出下面函数的极小值:z=2-exp[-(x2+y2)]》

《利用遗传算法求出下面函数的极小值:z=2-exp[-(x2+y2)]》
《利用遗传算法求出下面函数的极小值:z=2-exp[-(x2+y2)]》

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/Brezee_xy/article/details/45174605
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞