浅析遗传算法在规划中应用


前言

遗传算法(Genetic Algorithms,简称 GA)是一种基于自然选择原理和自然遗传机制的搜索(寻
优)算法,它是模拟自然界中的生命进化机制,在人工系统中实现特定目标的优化。遗传算法
的实质是通过群体搜索技术,根据适者生存的原则逐代进化,最终得到最优解或准最优解。
它必须做以下操作:
• 初始群体的产生
• 根据适者生存的原则选择优良个体
• 被选出的优良个体两两配对
• 通过随机交叉其染色体的基因并随机变异某些染色体的基因后生成下一代群体
按照此方法使群体逐代进化, 直到满足进化终止条件。


一、遗传算法的原理

( 1 ) (1) (1)概念阐述

自然选择

自然选择(Natural selection )指生物在生存斗争中适者生存不适者被淘汰的现象,最初由C·R·达尔文提出。达尔文从生物与环境相互作用的观点出发,认为生物的变异、遗传和自然选择作用能导致生物的适应性改变。自然选择由于有充分的科学事实作根据,所以能经受住时间的考验,百余年来在学术界产生了深远的影响。
受自然界这种普遍机制的启发,我们可以将这种适者生存不适者被淘汰用于我们数学中的 规 划 邻 域 \color{#00F}{规划邻域} 。给定一个系统的解 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots,x_n x1,x2,,xn,该解集中适者生存不适者被淘汰,简单来说,就是对于系统规划较优的解能够保留下来,而其余解将被剔出。

遗传和变异

从生物学的角度来说,生命之所以能够一代一代地延续的原因,主要是由于遗传物质在生物进程之中得以代代相承,从而使后代具有与前代相近的性状。
在这里插入图片描述
如左图所示,母本和父本的染色体分离(其上所携带的基因也随之分离),在子代中,染色体上的基因两两组合生成下一代。
这里,我们可以假设染色体上的基因编码方式为二进制 10010111010 ⋯ \color{#F00}{10010111010\cdots} 10010111010
在这里插入图片描述
交配之后,形成子代 1100001101010 1011011011011 \color{#F00}{1100001101010}\color{#00F}{1011011011011} 11000011010101011011011011 11000101 01011010 \color{#F00}{11000101}\color{#00F}{01011010} 1100010101011010,以上过程在数学上称为交叉

变异,就是在染色体上的某一个位点,突然出现了一个新基因,代替了原有基因,这个基因叫做突变基因。于是后代的表现中也就突然地出现祖先从未有的新性状。采用二进制编码之后,变异如下图所示:
在这里插入图片描述
一般来说,一个种群的变异的概率很小,变异具有不确定性。

( 2 ) (2) (2)算法流程

在这里插入图片描述

1.初始种群

对于自然界来说,一个种群的繁衍必然依托于一个初始种群的诞生。没有初始种群,就没有后代,也就不会繁衍生息。初始种群是具有一定数目、一定规模无优良差异的特征群体。在算法中,初始种群对应一系列初值,好比一个函数的初值,一个项目的初始方案,一个路径规划中的初始路径 ⋯ ⋯ \cdots\cdots 这些所谓的初条件、初方案并没有优劣之分,于是算法流程中常常采用生成随机数(为了便于遗传和变异,常常采用随机生成二进制数列)来模拟这种 初 始 种 群 c e l l \color{#F00}{初始种群cell} cell ( m × n × s ) (m\times n \times s) m×n×s)

种群大小 m m m随机二进制数列的行数种群大小越大,求解准确度提高
物种个数 n n n随机二进制数列的 胞 数 \color{#F00}{胞数} =变量数适用于多元函数规划问题
染色体长度 s s s随机二进制数列的串长串长越长,精度越高(小数点后位数多)

例如:对于非线性规划问题 m i n ( x 1 2 + x 2 ) min ( x_1^2+x_2) min(x12+x2)
b . t . x 1 ∈ [ − 1 , 2 ] b.t. x_1\in[-1,2] b.t.x1[1,2]
x 2 ∈ [ − 3 , 1 ] x_2\in[-3,1] x2[3,1]
我们假设初始种群 m = 5 m=5 m=5
由于变量为 x 1 , x 2 x_1,x_2 x1,x2两个,于是物种个数 n = 2 n=2 n=2
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.优胜劣汰

首先介绍几个概念:
( 1 ) (1) (1)解码:将初始种群中各物种的二进制染色体翻译成十进制 x ′ x' x 并 使 其 十 进 制 区 间 等 价 于 定 义 域 区 间 的 过 程 , x = x m i n + x ′ × x m a x − x m i n 2 s − 1 \color{#00F}{并使其十进制区间等价于定义域区间的过程},x=x_{min}+x'\times \frac{x_{max}-x_{min}}{2^s-1} 使x=xmin+x×2s1xmaxxmin
b . t . x 1 ∈ [ − 1 , 2 ] b.t. x_1\in[-1,2] b.t.x1[1,2]
x 2 ∈ [ − 3 , 1 ] x_2\in[-3,1] x2[3,1]
变量 x 1 x_1 x1所产生的物种1号:在这里插入图片描述 编码为:0 1 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0
化成十进制: x 1 ′ = 1154128 x_1'=1154128 x1=1154128
编码结果: x 1 = − 1 + 1154128 × 2 − ( − 1 ) 2 22 − 1 = − 0.174503 x_1=-1+1154128\times \frac{2-(-1)}{2^{22}-1}=-0.174503 x1=1+1154128×22212(1)=0.174503

( 2 ) (2) (2)适应度:种群中任意个体满足目标的程度。同样举个例子:还是这个规划问题 m i n ( x 1 2 + x 2 ) min ( x_1^2+x_2) min(x12+x2),个体 x 1 = 0 , x 2 = − 2 x_1=0,x_2=-2 x1=0,x2=2时的目标值小于个体 x 1 = 1 , x 2 = 0 x_1=1,x_2=0 x1=1,x2=0,于是前者的适应度大,更符合目标规划要求。
一般地,最大 ( m a x ) (max) max规划问题的适应度正比 与函数值,这里可令 f i = F i f_i=F_i fi=Fi;最小 ( m i n ) (min) min规划问题的适应度反比与函数值,这里可令 f i = 1 F i f_i=\frac{1}{F_i} fi=Fi1.

在此环节中,根据适者生存不适者被淘汰的原则,将 适 应 度 \color{#00F}{适应度} 大的个体保留,将 适 应 度 \color{#00F}{适应度} 小的个体淘汰。为保持种群多样性及其生态系统的平衡,筛选规则为: 某 个 体 i , 其 适 应 度 为 f i , 其 被 选 择 的 概 率 为 P i = f i ∑ i = 1 M   f i \color{#F00}{某个体i,其适应度为f_i,其被选择的概率为P_i= \frac{f_i}{\sum_{i=1}^M\ f_i}} ifi,Pi=i=1M fifi

解码
适应度计算
优胜劣汰
个体 i i i适应度 f i f_i fi P i P_i Pi
1 1 1 7.5 7.5 7.5 0.378 0.378 0.378
2 2 2 3.7 3.7 3.7 0.186 0.186 0.186
3 3 3 2.4 2.4 2.4 0.121 0.121 0.121
4 4 4 3.3 3.3 3.3 0.166 0.166 0.166
5 5 5 2.9 2.9 2.9 0.146 0.146 0.146

建议采用随机数,选择出能繁衍后代的优秀个体。

3.遗传变异

采用之前上述方法 初 始 种 群 c e l l \color{#F00}{初始种群cell} cell ( 5 × 2 × 22 ) (5\times 2 \times 22) 5×2×22)
这里,只演示物种一的遗传和变异。
非特殊情况,交叉仅仅发生在每个物种(也就是每个变量)内部,变量之前的遗传和变异各自独立,互不影响。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这里需要指出的是,变异不仅仅发生在子代,变异会发生在整个种群的世世代代中, 上 一 代 的 变 异 会 伴 随 着 染 色 体 遗 传 给 下 一 代 . \color{#00F}{上一代的变异会伴随着染色体遗传给下一代.} .

4.多目标优化问题中的非支配排序

注意:这里所指的非支配排序只针对于多目标优化问题
什么是多目标?简单来说就是对于所要求解的问题来说,不仅仅只有一个目标那么简单,举个例子:在投资中,我们不仅仅期望得到一个收益较好的投资项目,同时也期望该风险较小,这便是一个双目标规划问题。
同样地,在路径规划问题中,如果我们需要得到一个路径及其过路费最小的方案,这也是一个双目标规划问题。
对于这种双目标或多目标问题该如何处理?
现有的较为成熟的方法就是对各目标进行非支配排序。(这里仅仅介绍个人对于这种方法的一些见解,详细请大家参阅多目标遗传算法
还是举路径这个例子。如果方案1的路径小于方案2并且过路费也比方案2少,那方案1不用说肯定优于方案2;如果方案1的路径小于方案3但是过路费比方案3高,那么方案1和方案2的优先顺序无法比较,则称方案1和方案3 非 支 配 \color{#00F}{非支配}
在这里插入图片描述
这里每个方案都有多个与之非支配的方案,对所有方案找到非支配组合的过程也是非支配分层的过程,较快排序的算法为NSGA-II的快速非支配排序
在这里插入图片描述

整个种群被分层后,还是没法确定最优解,例如上述方案1、方案3、方案4,我们对这三种处于同一级别的方案进行筛选,其具体方法便是拥挤度(同层个体之间密度)比较。
在这里插入图片描述
定义拥挤度为图示矩形长,在这里插入图片描述

二、路径问题的单目标遗传算法

对于路径问题时,由于路径为序列,我们一般采用采用十进制编码,用随机数列 作为染色体,其中 ;每一个随机序列都和种群中的一个个体相对应,例如一个 9 目标问题的一个染色体为 [0.23,0.82,0.45,0.74,0.87,0.11,0.56,0.69,0.78] 其中编码位置 代表目标 ,位置 的随机数表示目标 在巡回中的顺序,我们将这些随机数按升序排列得到如下巡回: 6-1-3-7-8-4-9-2-5

clear
sj=load('数据2.txt');
M=50;%种群数量
G=1000;%最大的子代数
sj=[sj,sj(:,1)]';
n=size(sj,1);
d=zeros(n);
for i=1:n-1
    for j=i+1:n
%         d(i,j)=6370*acos(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)=sqrt((sj(i,1)-sj(j,1))^2+(sj(i,2)-sj(j,2))^2);
    end
end
d=d+d';%获得对称阵

path=linspace(1,n,n);
ZQ=zeros(M,n);%优秀种群初始化
YXGT=1;%优秀个体
while YXGT<=M
c=sort(2+floor((n-2)*rand(1,2)));
df=d(path(c(1)-1),path(c(2)))+d(path(c(1)),path(c(2)+1))-d(path(c(1)-1),path(c(1)))-d(path(c(2)),path(c(2)+1));        
if df<0
    path=[path(1:c(1)-1),path(sort(c(1):c(2),'descend')),path(c(2)+1:n)];
    ZQ(YXGT,:)=path;
    YXGT=YXGT+1;
end%采用2变化法得到优秀种群
end
mother=[ZQ(M-1,:);sort(rand(1,n))];father=[ZQ(M,:);sort(rand(1,n))];%选取优秀种群中的任意两个个体进行编码,获得父本和母本
long=zeros(4,1);
for p=1:G
t=floor(n*rand(1));
son=[mother(:,1:t),father(:,t+1:n)];
 for i=2:n
   for j=i:-1:2
    if son(2,j)<son(2,j-1)
         h=son(:,j-1);
         son(:,j-1)=son(:,j);
         son(:,j)=h;
     end
    end
end
daughter=[father(:,1:t),mother(:,t+1:n)];
for i=2:n
   for j=i:-1:2
    if daughter(2,j)<daughter(2,j-1)
         h=daughter(:,j-1);
         daughter(:,j-1)=daughter(:,j);
         daughter(:,j)=h;
     end
    end
end
NEW=[father(1,:);mother(1,:);son(1,:);daughter(1,:)];

for j=1:n-1
    long=long+d(NEW(1,j),NEW(1,j+1));
 end
NEW=[NEW,long];
for l=2:4
    for b=l:-1:2
        if NEW(b,n+1)<NEW(b-1,n+1)
            k=NEW(b-1,:);
            NEW(b-1,:)=NEW(b,:);
            NEW(b,:)=k;
        end
    end
end
mother=[NEW(1,1:n);sort(rand(1,n))];
father=[NEW(2,1:n);sort(rand(1,n))];
end
distance=0;
for i=1:n-1
    distance=distance+d(path(i),path(i+1));
 end
 GreatX=sj(path,1);
 GreatY=sj(path,2);
 plot(GreatX,GreatY,'-*');
 path
 distance
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值