遗传算法运用

遗传算法是一种非常有用的算法,可以用于求解最小值,TSP问题等等

对于算法基本思想,这里就不写了,毕竟到处都有,直接给出一个用遗传算法求解最小值的matlab代码(附有详细注释)

% 罗森布罗克 ( Rosenbrock ) 函数为f(x1, x2)  = 100(x1^2 - x2)^2 + (1 - x1)^2 ,试用遗传算法计算此函数在区域 内的最大值。

clear all
clc
format long;  %设定数据显示格式
%初始化参数
T=100;  %进化代数
N=80;  % 群体规模
pm=0.05; pc=0.8;  %交叉变异概率
umax=2.048; umin=-2.048;  %参数取值范围
L=10;  %单个参数字串长度,总码串长度2L
bval=round(rand(N,2*L));  %初始种群
bestv=-inf;  %最优适应度初值

%迭代开始
for ii=1:T
%解码,计算适应度
for i=1:N
        y1=0;y2=0;
        for j=1:1:L
           y1=y1+bval(i,L-j+1)*2^(j-1);
        end
        x1=(umax-umin)*y1/(2^L-1)+umin;
for j=1:1:L
           y2=y2+bval(i,2*L-j+1)*2^(j-1);
        end
        x2=(umax-umin)*y2/(2^L-1)+umin;
        obj(i)=100*(x1*x1-x2).^2+(1-x1).^2; 
        %目标函数值 
        xx(i,:)=[x1,x2];
    end
func=obj;  %目标函数转换为适应度函数
p=func./sum(func);
q=cumsum(p);  %累加,形成部分和序列
[fmax,indmax]=max(func);  %求当代最佳个体
   if fmax>=bestv
      bestv=fmax;  %到目前为止最优适应度值
      bvalxx=bval(indmax,:);  %到目前为止最佳位串

      optxx=xx(indmax,:);  %到目前为止最优参数
   end   
   Bfit1(ii)=bestv;   % 存储每代的最优适应度
%%%%遗传操作开始,使用赌轮选择
 for i=1:(N-1)
    r=rand;  tmp=find(r<=q);  newbval(i,:)=bval(tmp(1),:);
 end 
  newbval(N,:)=bvalxx;  %最优保留
  bval=newbval;
%%%%单点交叉
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
    
end   
bval(N,:)=bvalxx;  %最优保留
%%%%位点变异
mm=rand(N,2*L)<pm;  %N行2L列随机数,小于pm的元素变成逻辑数1,
%大于pm的元素变成逻辑数0
mm(N,:)=zeros(1,2*L);  %最后一行不变异,强制赋0
bval(mm)=1-bval(mm);  % 矩阵mm中每个逻辑数1指示bval中与其位置相同的
%元素x变为1-x,即0,1互换
end
%输出
plot(Bfit1);  % 绘制最优适应度进化曲线
bestv   %输出最优适应度值
optxx    %输出最优参数

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