数学建模(1)——遗传算法(GA)

基本原理

遗传算法是是一种全局寻优算法,进行羣体搜索技术,且不易陷入局部最优点
基本思想:以编码空间代替问题参数空间,从代表问题可能有潜在解集的一个种羣出发,按照生物进化过程中适者生存、优胜略汰的原理,以适应度作为评价个体优劣的依据,重复使用选择、交叉、变异算子作用于羣体,使之不断进化,逐渐接近最优解

生物遗传概念在遗传算法中的对应关系

生物遗传概念遗传算法中的概念
适者生存算法停止时,最有目标值的可行解有最大可能被留住
个体可行解
染色体可行解的编码
基因可行解的每一分量的特征
适应性适应度函数值
种羣通过适应度函数值选取的一组可行解
交配通过交配原则产生一组新可行解的过程
变异编码的某一分量发生变化的过程
个体优劣每一个解应有一个度量好坏的依据,用适度值函数表示

基本步骤

  • 在一定编码方案下,随机产生一个初始羣组
  • 用相应的编码方法,将编码后的个体转换成问题空间的决策变量,并求出个体的适应值
  • 按照一定选择方式(即适者生存的原则),从中选择部分个体构成交配池
  • 交叉变异这两个遗传算子对交配池中随机两两配对的个体进行操作,并形成新一代的种羣
  • 从所有的目前现存的父代与子代中选取最为优良的某些个体作为新的父代,反复执行步骤2~4,使之逐代进化,直至满足收敛判断依据

遗传操作三大基本算子

选择

选择用来实施适者生存的原则,即把当前的羣体中的个体按照一定方法,挑选出一部分个体,用于构建交配池

选择算子的作用效果是提高了羣体的平均适应度。由于选择算子没有产生新个体,所以羣体中最好个体的适应值不会因为选择操作而有所改变

交叉

交叉,首先使交配池中的个体随机两两配对,然后按照某种方式选择出交叉点,互换交叉点后的全部基因

交叉算子是产生新个体的主要方法,他决定了遗传算法的全局搜索能力

变异

变异是对个体的某一个或者某一些基因值按照某一提前设定好的较小概率进行改变

变异算子只是产生新个体的辅助方法,它决定了遗传算法的局部搜索能力

编码策略

遗传算法不对优化问题的实际决策变量进行操 作 ,所以应用遗传算法首要的问题是通过编码将决策 变量表示成串结构数据。

二进制编码

将问题空间的参数表示为基于字符集{0,1}构成的染色体位串
如求二元函数最大值
f(x1,x2)=x1^2+x2^2
x1={1,2,3,4,5,6,7}
x2={1,2,3,4,5,6,7}
遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种符号串。本题中,用无符号二进制整数来表示。因 x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。
例如,基因型 X=101110 所对应的表现型是:x=[ 5,6 ]。
个体的表现型x和基因型X之间可通过编码和解码程序相互转换。

实数编码

实数编码[5] 中,个体的每个基因值用某一范 围内的一个实数来表示,个体的编码长度等于其 决策变量的个数.若某一个优化问题含有 5 个变 量,则即
{7.10 5.35 3.20 4.12 2.73}为一个个体的基因型,对应表现性为
x=[7.10,5.35,3.20,4.12,2.73]

十进制编码

十进制编码将待处理的参数数值(实数) 逐位数字地转化为一定长度的数字字符并形成 字符串.若每个参数取值范围均在 [0 , 10) 内,对 前面实数编码中所举例子进行十进制数编码,该个体可表示为:
{7 1 0 5 3 5 3 2 0 4 1 2 2 7 3}

应用举例

以《数学建模算法与应用(第二版)》中例题为例
《数学建模(1)——遗传算法(GA)》
(此处数据截取一部分,之后会将数据保存至纯文本文件,挂载下载链接)
《数学建模(1)——遗传算法(GA)》

参数设定:

  • 种羣大小:M=50
  • 最大代数:G=1000
  • 交叉率:Pc=1 可保证种羣的充分进化
  • 变异率:Pm=0.1 一般而言,变异发生的可能性较小

编码策略

使用w1w2…w102序列作为染色体,其中0<=wi<=1(i=2,3,…,101),w1=0,w102=1,每一个序列都与种羣中一个个体相对应。
例如(102个基因太多,此处以9个基因为代表),一个个体的染色体序列为
【0.23 0.82 0.45 0.74 0.87 0.11 0.56 0.69 0.78】
式中,w1w2…w9表示1-9目标的适应度值,将其升序排列后,即可得到本题中的顺序
6-1-3-7-8-4-9-2-5
这就是按照编码方案将基因转化为可行解的过程

初始种羣

先利用典型的近似算法——改良圈算法得到一个较好的初始种羣
《数学建模(1)——遗传算法(GA)》

目标函数

目标函数为侦查所有目标的路径长度,即从基地开始侦查100个敌军目标最后再飞回基地的路径长度,适度值函数就取为目标函数
min f (π12,…π102)=Σdπiπi+1

交叉算子

对于配对的两个父代个体 f1 f2 ,随机地选择第t个基因处作为交叉点,将 f1 的前t个基因和f2 的后102-t个基因组成s1,将 f2 的前t个基因和f1 的后102-t个基因组成s2,如图所示
《数学建模(1)——遗传算法(GA)》
交叉方式很多,应该尽可能的选取好的交叉方式,保证子代能继承父代的优良特性

变异算子

变异是实现羣体多样性的一种手段,同时也是全局寻优的保证。
按照给定的变异率,对选定变异的个体,随机选取三个整数,满足1

选择算子

在父代种羣和子代种羣中选择目标函数值最小的M个个体进化到下一代

MATLAB代码

clear,clc
load sj.txt;
x=sj(:,1:2:8);x=x(:);%将25*4矩阵变为100*1矩阵
y=sj(:,2:2:8);y=y(:);
sj=[x,y];
d1=[70,40];%初始起飞基地
sj0=[d1;sj;d1];%102个基地
%计算距离矩阵d
sj=sj0*pi/180; 
d=zeros(102); 
for i=1:101     
    for j=i+1:102         
        temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));         
        d(i,j)=6370*acos(temp);     
    end
end
d=d+d';%对称矩阵
L=102;w=50;dai=100;
%通过改良圈算法选取优良父代A
for k=1:w
    c=randperm(100);%把1到100这些数随机打乱得到的一个数字序列
    c1=[1,c+1,102];%染色体
    flag=1;
    while flag>0
        flag=0;
        for m=1:L-3
            for n=m+2:L-1
                if(d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<d(c1(m),c1(m+1))+d(c1(n),c1(n+1)))
                    flag=1;
                    c1(m+1:n)=c1(n:-1:m+1);
                end
            end
        end
     end
    J(k,c1)=1:102;
end
J=J/102;
J(:,1)=0;J(:,102)=1;
rand('state',sum(clock));
%遗传算法实现过程
A=J; 
for k=1:dai  %产生 0~1 间随机数列进行编码 
    %交配产生子代 B 
    B=A;     
    c=randperm(w);  %产生1~50随机数 
    for i=1:2:w     %从1到50依次两两配对,即i与(i+1)配对
        F=2+floor(100*rand(1)); %随机产生交叉点 
        temp=B(c(i),F:102);         
        B(c(i),F:102)=B(c(i+1),F:102);         
        B(c(i+1),F:102)=temp;     %交叉更换完毕
    end
    %变异产生子代 C 
    by=find(rand(1,w)<0.1); %返回随机数<0.1的位置
    if length(by)==0     %如果上一步找不到,则随机产生一个变异点
        by=floor(w*rand(1))+1; 
    end
    C=A(by,:); 
    L3=length(by); 
    for j=1:L3    
        bw=2+floor(100*rand(1,3));    %随机选取三个整数
        bw=sort(bw);    %满足1<u<v<w<102
        C(j,:)=C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]); %把u,v之间(包括u和v)的基因段插到w后面
    end
    G=[A;B;C];    %获得父代、交叉子代、变异子代合集G
    %在父代和子代中选择优良品种作为新的父代 
    TL=size(G,1);  
    [dd,IX]=sort(G,2);%dd为升序后的G,IX为索引
    temp(1:TL)=0;    
    for j=1:TL        
        for i=1:101            
            temp(j)=temp(j)+d(IX(j,i),IX(j,i+1));   %按照新的序列重新获得距离矩阵
        end
    end
    [DZ,IZ]=sort(temp);      
    A=G(IZ(1:w),:); %选择目标函数值最小的w个个体进化到下一代
end
path=IX(IZ(1),:) ;
long=DZ(1) ;
%toc 
xx=sj0(path,1);
yy=sj0(path,2); 
plot(xx,yy,'-o');

sj.txt+源码.m下载

点赞