进化算法——约束优化

每一个实际问题,如果不是显式地至少也是隐式地带有约束。约束优化问题可以写成

这个问题包含p+m个约束,其中m个不等式约束,p个等式约束。满足全部约束条件的x的集合被称为可行集。违反一个或多个约束的x的集合被称为不可行集

为求解(1)式的问题而设计的进化算法被称为约束进化算法


目录

惩函数法

1.内点法

2.外点法

 a.死刑法

b.非死刑法

处理约束的常用方法

 1.静态惩罚方法

2.可行点优势 

3.折中进化算法

4.协同进化惩罚

5.动态惩罚方法

a.指数动态惩罚

b.其他动态惩罚方法

6.自适应惩罚方法

7.分离遗传算法

8.自身自适应的适应度描述

9.自身自适应罚函数

10.自适应分离约束处理

11.行为记忆

12.随机排名

13.小生境惩罚方法

 特殊表示与特殊算子

1.特殊表示

解码器

 2.特殊算子

3.Genocop

 4.GenocopⅡ

5.GenocopⅢ

 约束优化的其他方法

 1.文化算法

 2.多目标优化

候选解的排名

1.最大违反约束排名

2.约束次序排名

3.-水平比较

处理约束方法的比较 


惩函数法

惩函数法惩罚违反约束或接近违反约束的候选解。惩函数法是最常用的求解约束优化问题的方法。

我们可以用两种方式设计惩函数法。首先,在可行个体移近约束边界时就惩罚它;这种方法被称为内点法或闸方法。它不容许种群中出现违反约束的候选解。其次,容许种群中存在不可行个体,但在费用上惩罚它们,或在为下一代选择父代时惩罚它们。一般不惩罚可行个体,无论他们离约束边界有多近。这种方法被称为外点法

1.内点法

通过一个简单的例子说明内点法的思路。考虑标量问题

当x的可行值靠近约束时就惩罚它。修改后的函数被称为闸函数。例如,将(3)式的带约束问题转化为无约束问题

其中,\delta>0是一个小的常数,\alpha>0是另一个常数。当\alpha \rightarrow 0,argmin_{x}f'(x)\rightarrow argmin_{x}f(x)

下图所示为c=1,\delta=0.01且\alpha=1时的f(x)和f'(x)。

 在约束进化算法中不怎么常用内点法。因为对于许多约束优化问题,要找出满足所有约束的候选解本身就是一个极具挑战性的问题。此外,不可行解包含的信息可能有利于搜索带约束的最优值。

2.外点法

 a.死刑法

 死刑法在种群中不容许不可行个体,但只是短暂的容许。这个方法会立即去掉种群中的不可行个体\bar{x}。如果是通过重组得到的\bar{x},就拒绝它并再行重组直到得到可行个体。如果是通过变异得到的\bar{x},就拒绝它并再行变异直到得到可行个体。

它的优势在于无需评价不可行个体的费用,这样能节省计算量。许多问题在一开始很难得到可行个体,因此,拒绝不可行个体可能过于严厉。不是完全拒绝,而是让它们留在种群中同时让违反约束不太严重的个体费用较低,这样会鼓励种群像可行域的方向移动。

总之,死刑法是否有效还依赖具体的问题。

b.非死刑法

 在进化算法的过程中容许不可行个体留在种群中,它们是比死刑法更宽容的外点法。我们将(1)式的标准约束优化问题转化为下面的无约束问题:

其中,r_{i}c_{j}为正数,被称为惩罚因子,\gamma\beta是正数,通常设置为1或2。\phi (x)被称为惩罚费用函数,我们由最初的费用函数f(x)和违反约束程度的{G_{i}(x)}及{L_{j}(x)}的加权和得到。如果x∈F,则\phi (x)=f(x)。如果x∉F,则\phi (x)>f(x)的量会随着违反约束的量的增大而增大。

约束h_{j}(x)很不宽容。如果在连续搜索域上随机生成一个初始种群,所得的个体能满足等式约束的机会基本为0.因此,我们经常将等式的硬约束转化为要求h_{j}(x)几乎为0而不是正好等于0的软约束。这样就得到

其中\epsilon是一个小的正数。它等价于约束

在进化算法的初期让\epsilon的取值较大从而能够得到一些可行的个体,然后随着代数的增加逐渐减小\epsilon

为了让等式约束转化为不等式约束,(5)式变为

为将问题简化,这里令γ=β。上式的问题可以使用静态或者动态的方法求解。静态方法所用的r_{i},β,\epsilon独立于进化算法的代数。

动态方法的 r_{i},β,\epsilon的值依赖于进化算法的代数。静态方法实施起来更容易,但动态方法因为更灵活可能表现的更好。动态方法常常随着代数的增加让  r_{i}和β增大并让\epsilon减小,它让违反约束的权重增大从而逐渐将越来越多的不可行个体引向可行域。


处理约束的常用方法

 1.静态惩罚方法

 (8)式取β=2,r_{i}是违反约束程度的函数。r_{i}G_{i}(x)的一个非减的函数。根据违反约束的量,惩罚因子r_{i}有时候在一个离散的集合中取值:

其中,q是用户指定的约束水平的个数,R_{ij}是用户定义的权重,T_{ij}是由用户定义的约束阈值。这是一个静态的方法。由于可调参数太多,这个方法常常受到批评。它需要(2q-1)(m+p)个可调参数。

2.可行点优势 

将(8)式的惩罚费用函数改换为

其中,为了保证对于所有的x∈F和所有的\bar{x}∉F都有{\phi }'(x)\leq{\phi }(\bar{x})',增加了\theta (x)这一项。对于所有可行的x和所有不可行的\bar{x}{\phi }'(x)\leq{\phi }(\bar{x})'。假定对于所有的x,f(x)≥0。\theta (x)可以设置为下面的形式:

这个方法一种不保守的实施方式,并不假定 f(x)≥0。 而是将\theta (x)设置为下面的形式:

 于所有的x∈F和所有的\bar{x}∉F,在\phi (x)\leq\phi (\bar{x})的条件下,对所有x都有{\phi }'(x)={\phi }(\bar{x})'。也就是说,如果(8)式的惩罚函数让所有的可行个体的排名都好于不可行个体,(8)式就不变。如果对于某些x∈F和某些\bar{x}∉F,由(8)式得到的 \phi (x)\phi (\bar{x}),(12)式就将所有不可行个体的惩罚函数值变为min{\phi }(\bar{x})'=max{\phi }'(x),即最好的不可行惩罚费用等于最差的可行惩罚费用

如果优化问题中含有较难满足的约束,这个方法会产生很大的选择压力让可行点留在种群中,从而让可行点的信息传递到下一代。

3.折中进化算法

 折中进化算法提出了另一种强化可行点优势的方法。折中进化算法将惩罚函数定义为

其中,K是一个大常数,m+p是约束的总个数,s(x)是x满足约束的个数。为了保证对所有的x∈F和所有的\bar{x}∉F,在\phi (\bar{x})\phi (x)成立,用户定义的常数K要足够大。即使不可行个体排在可行个体后面,我们也要确保不可行个体有适当的机会被选中进行重组。

折中进化算法与(10)式不同,它不去评价不可行个体的费用,这样会省去很多计算量。折中进化算法在确定惩罚函数费用函数时之考虑违反约束的个数,不考虑违反约束的程度。这又让折中进化算法占优势,因为在实际问题中,与量化违反1约束的具体程度相比,计算违反约束的个数常常很容易。

4.协同进化惩罚

 有趣的是让(10)式与(13)式结合,有时候违反规则的程度可能更重要,另一些时候违反约束的个数更重要。协同进化方法采纳了这个思路,它使用惩罚费用

其中,\omega _{1}\omega _{2}是权重,这是一个协同进化方法,因为它涉及两个种群。种群P1,由候选解x组成并根据惩罚费用\phi (x)进化。另一个种群P2,由(\omega _{1}\omega _{2})组成,P1的个体利用来自P2的具体个体(即一对具体的 (\omega _{1}\omega _{2}))进化。 (\omega _{1}\omega _{2})的费用评价为

其中,\omega来自P2一对具体的(\omega _{1}\omega _{2}),M_{1}(\omega )是P1在用\omega完成进化之后其中的可行个体的个数。个体\omega的费用\psi (\omega )依赖于在P1中进化的所有可行个体的平均惩罚费用,也依赖于在P1中进化的可行个体的个数。如果M_{1}(\omega )=0则(15)式就没有定义,这时可以将\psi (\omega )设置为任意高。

对P2中的每一个个体和代次,进化算法让种群P1进化,因为是潜逃的进化算法,这个协同进化方法可能对计算的要求较高,但它很适合并行实现,这样做计算量会减少。

算法1概述协同进化惩罚算法。外层循环进化P2种群。对P2的每一代用(14)式的惩罚函数在内循环运行|P2|次让候选解x进化。

 为了改进性能可以用几种方式修改算法1,例如,采用个类型的精英,也可以对于P2的每一个个体,执行多于P1次的进化得到在给定\omega下的平均性能或最好性能。

5.动态惩罚方法

 (8)式的惩罚函数,并取β=1或2,r_{i}=(ct)^{\alpha },这里c和α是常数,t为代数:

这是一个动态方法,因为对约束的惩罚会随着代数增加。要让这个方法成功,应该对费用f(·)和违反约束的大小M(·)做正规化处理, 惩罚费用函数\phi(·)表示如下:

 其中假定对所有x,f(x)>0.这样就能保证惩罚费用\phi (x)的所有分量大致都在相同的量级上。另一个方案是将动态惩罚方法与可行点优势方法结合,这个方案中的惩罚费用为

其中,\theta (x)的定义要让所有可行点的惩罚费用都低于不可行点。

a.指数动态惩罚

 指数动态惩罚函数为

其中,M(x)是(16)式定义的违反规则的程度,而T是代数t的一个单调不增函数。T=\sqrt{t},于是有\lim_{t\rightarrow \Join }T=0,当代数趋于无穷大时,不可行个体的惩罚费用也会趋于无穷大。

(19)式假设对所有x>0,f(x)≥0;否则约束惩罚会让费用减小。如果不能满足这个假设,在惩罚它之前应该让费用函数偏移。也可以在\phi(x)的惩罚部分增加一个可调参数。

其中,正规化后的违反约束程度{M}'(x)由(17)式定义,α是一个可调参数,用它来调节违反约束的相对权重。

与(17)式的加性惩罚一样,我们可以将指数动态惩罚方法与可行点优势方法结合,这个方法的惩罚费用为

 其中,\theta (x)足够大,就能保证可行点的费用都低于不可行点的费用。

b.其他动态惩罚方法

动态惩罚方法常常比静态方法好,但是需要更多调试。调试的效果取决于问题。惩罚太高会阻碍对不可行集的探索,我们有时候需要利用不可行个体找出满足约束的好的解。惩罚太低会过多的搜索不可行集,进化过程很难收敛找到可行解。综合这些因素,我们下面讨论自适应惩罚防方法。

6.自适应惩罚方法

静态和动态惩罚方法存在的问题促使我们开发出一种动态方法的特殊类型,我们称自适应方法。自适应方法利用种群的反馈调整惩罚权重。惩罚权重设置为

其中,t是代数,\beta _{1},\beta _{2}满足 \beta _{1}>\beta _{2}>1的常数,情况1意味着最好的个体在过去k代的每一代都是可行的。情况2意味着在过去的k代没有可行个体。代窗k是影响自适应速率的一个可调参数。如果种群中最好的个体可行,减少约束权重就会容许种群中有更多不可行个体。如果在种群中没有可行个体,增大约束权重有利于获得一些可行个体。我们的目的是要均衡地混合可行个体和不可行个体以充分探索搜索空间,并利用不可行个体的信息,尽管它们并不满足约束。

7.分离遗传算法

分离遗传算法是处理惩罚方法参数调节的一个聪敏的方法。要调试(8)式的参数r_{i}非常困难。如果它们太大,约束进化算法会对满足约束过于关注而在最小化费用函数上用力不足;如果太小,约束进化算法会对最小化费用函数过于关注,而在满足约束上用力不足。分离遗传算法通过建立两个个体排名表来解决这个问题:第一张表用小的惩罚权重r_{1i},第二张表用大的惩罚权重r_{2i}。我们从这两张表中交替选出权重来为下一代选择个体。它大致等价于使用量个子种群,一个的惩罚权重小,一个的惩罚权重大。

8.自身自适应的适应度描述

自身自适应的适应度描述方法在两个阶段利用费用函数惩罚不可行个体。首先,如果存在某个不可行个体\bar{x},它的非惩罚费用比最好的可行个体的非惩罚费用还要好,则每一个不可行个体在费用上都要受到惩罚。如果对所有\bar{x}∉F和最好的x∈F,f(\bar{x})>f(x),就不惩罚不可行个体。这样做可以防止对不可行个体多余的惩罚。

另一个阶段的惩罚如下。惩罚所有不可行个体,违反约束最严重的个体的惩罚最大。要做到这一点首选需定义一个个体x的总的不可行性

其中,G(·)根据(8)式在β=1时计算得到。下面定义最好个体(x_{b}) ,可行性最差个体(x_{wf})以及费用最高的个体(x_{wc}):

 如果F≠∅,则x_{b}∈F,尽管存在某个个体\bar{x}∉F的费用较小。按照这些定义,我们将不可行性度量正规化到[0,1]上,得到

 第一个惩罚的数学定义为

 第二个惩罚将\phi (x)映射到额外的惩罚{\phi }'(x)

 上式中的指数函数只会对违反约束的娇小的个体一个较小的惩罚。比例因子γ保证让违反约束最严重的个体受到最大的惩罚。

对所有的x,{\phi }'(x_{wf})\geq {\phi }'(x)。                    (29)

这两个阶段的惩罚方法可能有点复杂。其基本目标是要在惩罚之后,种群中最好的个体中有一些是可行的有一些是不可行。费用低且违反约束较少的个体在惩罚费用上能够与可行个体竞争。

9.自身自适应罚函数

自身自适应罚函数(SAPF)算法基于种群的分布调整罚函数。如果只有几个可行个体,就让违反约束的较小个体的惩罚费用\phi(·)较低,即使它们的f(·)较高。如果有很多个可行个体,就只给费用f(·)低的个体赋予较低的惩罚费用\phi(·)。SAPF的算法由一下几步组成。

1.对没一个个体x,正规化费用函数值:

所有x正规化后的费用f_{1}(x) ∈[0,1],费用最低的个体正规化后的费用等于0,费用最高的个体正规化后的费用等于1.

2.按照(24)式计算没一个个体正规化后的违反约束的程度\iota (x)。对所有x,\iota (x)∈[0,1]。对于x∈F,\iota (x)=0,对所有 \bar{x}∉F,\iota (x)>0。此外,也有可能存在 \bar{x}使\iota (x)=1,也可能不存在这样的 \bar{x}

3.对每一个个体x计算距离:

 当我们比较可行个体x和不可行个体\bar{x}时,二者之中任何一个的距离都可能更小,具体哪一个更小由它们之间的相对费用决定。

4.计算另外两个惩罚费用函数:

X(x)基于不可行个体违反约束的程度惩罚不可行个体,但只是在种群中包含可行个体的时候才用。Y(x)采用与不可行个体的费用成比例的量进一步惩罚不可行个体。 

5.计算惩罚费用函数

 其中,r∈[0,1]是种群中可行个体的比例。如果种群中有很多可行个体,\phi (x)着重于X(x),它是基于费用对不可行个体的惩罚。如果种群中只有几个可行个体, \phi (x)着重于Y(x),它是对不可行个体违反约束的惩罚。

10.自适应分离约束处理

 自适应分离约束处理进化算法(ASCHEA)基于两个思路。

首先,我们试图维持可行个体和不可行个体的特定的比率。这与自适应方法类似。它允许我们探索整个搜索空间,既包括可行的部分也包括不可行的部分。其次,如果种群中只有几个可行个体,就让可行个体与不可行个体重组。因为约束优化问题的解常常处于或接近边界。可行个体与不可行个体的组合往往会让它们的后代更靠近约束边界。

ASCHEA采用(8)式的惩罚方法,取β=1并遵从下列更新惩罚权重的方法:

其中,t是代数,γ>1是可调参数,\tau _{d}是可行个体与不可行个体的目标比,\tau (t)是在t代的比率:

 实施ASCHEA的第二个思路是,如果\tau (t)\tau _{d},让可行个体与不可行个体重组,它鼓励不可行个体的后代向可行域移动,这样做有望增加可行个体的数目。 如果\tau (t)\tau _{d} ,在种群中的可行个体已经足够。我们按照下面两个步骤来选择:首先,从可行集F中选择指定数目的个体;然后,在选择余下个体进行重组时是基于惩罚费用\phi(·)选择而不再直接考虑可行性。选出的可行个体的个数通常不少于所需选择总数的30%。

11.行为记忆

行为记忆采用分而治之的方法解决约束优化问题。(8)式的问题有m+p个约束,我们首先进化最小化G_{1}(x)的种群;让违反第一个约束的程度最小二步考虑其他约束和费用函数。当满足第一个约束的个体数目在种群中达到用户指定的比例之后就终止这个算法。在这个进化完成之后,用最终得到的种群初始化G_{2}(x)的进化算法。在第二个进化算法中,去掉种群中违反G_{1}(x)约束的个体,但不考虑其他约束和费用函数。

对每个约束重复这些步骤,我们用第i-1个进化算法的结果初始化第i个进化算法。第i个进化算法最小化G_{i}(x)的种群,并且在这个进化过程中去除偏离G_{j}(x),j∈[1,i-1]。最后通过实施m+p次进化算法,在满足所有的m+p个约束之后,用得到的种群初始化满足所有m+p个约束的最小化费用函数的进化算法。

算法2概述了行为记忆算法。我们可以将行为记忆类归为罚函数法,因为它用了死刑法。

行为记忆实际上是无约束算法的一般化,它逐渐增加费用函数的评价次数。例如,假如我们要最小化f_{i}(x),这里i可以是集合I={1,2,...,i_{max}}中的任何一个值。要做到这一点,第一种方式是用进化算法最小化f_{1}(x),然后用最后得到的种群最小化f_{1}(x)+f_{2}(x);再用第二个最后的种群最小化 f_{1}(x)+f_{2}(x)+f_{3}(x)。继续这个过程直到我们对最小化f_{i}(x)在全部i∈I上的均值感到满意为止。另一种方法是随机选择f_{i}(x)实例的一个组合随着代数增加逐渐增加实例的个数,这个方法被称为随机采样法。

12.随机排名

 随机排名在约束优化算法中加入随机成分。随机排名有时候根据费用f(·)对候选解排名,有时候又根据违反规则的程度对候选解排名。对个体排名的决策是随机的。在比较两个个体x_{1}x_{2}时,我们认为x_{1}优于x_{2}如果:

  • 这两个解都可行且f(x_{1})<f(x_{2})或者
  • 随机生成的r~U[0,1]小于用户给定的概率P_{f},并且 f(x_{1})<f(x_{2});或者
  • 上面的两个条件都不满足,但 x_{1}x_{2}违反的约束少。

否则就认为 x_{2}优于x_{1}。在对种群中所有个体进行比较和排名之后,为生成下一代选择父代重组。

13.小生境惩罚方法

 由于惩罚方法很难调节参数,因此提出小生境惩罚方法。它根据下面的规则采用锦标赛选择重组个体。

  • 已知两个可行个体,费用低的个体赢得锦标赛。
  • 已知一个可行个体和一个不可行个体,可行的个体赢得锦标赛。
  • 已知两个不可行个体,违反约束小的个体赢得锦标赛。

这个方法很简单,它不需要调节参数。在比较两个不可行个体时,无需评价费用函数,因此计算量会很少。在约束优化问题上,小生境惩罚方法经常能得到较好的结果。简单也是它的劣势,因为它认为可行个体即使费用很好也比费用很低稍微违反约束的不可行个体好。在个方法对于解在约束边界上的问题可能不怎么管用。

此方法的“小生境”部分对于处理约束并非必不可少,它的目的是为了保持种群的多样性,描述如下:如果个体在空间域中相距很远,就不让他们参加锦标赛。在我们为锦标赛随机的选出个体之后,计算它们之间的距离。如果相互离得很远,就为随机选择不同的个体。这样可以防止在远处的个体簇从种群中消失从而保持多样性。

多远进化策略与小生境惩罚方法类似。多远进化策略的显著特征是它常常保证费用函数值最低的不可行个体或违反约束最小的不可行个体被选为下一代。这个类似精英的方法能保证进化算法的搜索过程从好的不可行个体的特征中获益。


 特殊表示与特殊算子

 特殊表示是描述问题的一种方式,它让候选解自动满足约束。特殊算子是定义重组和变异算子的一种方式,它让子代个体自动的满足约束。这两个方法在很大程度上都依赖于具体的问题。使用具体问题信息的进化算法的性能一般比由通用的进化算法那里得到的性能好。

1.特殊表示

 作为特殊表示方法的一个简单例子,考虑二维问题

其中K是一个常数,它可以转化为等价的无约束问题

从直角坐标到极坐标的简单变换将(36)式带约束问题转化为(37)式的约束问题。原问题中有一个非线性约束,我们把它转换为(37)式之后它的唯一约束是在搜索域上的简单界限。

解码器

 求解约束优化问题的一种方法是对决定候选解的指令编码,保证由指令集合总能得到一个可行个体,即对用来生成候选解的指令编码,而不是对问题的候选解直接编码。进化算法中种群的每一个个体由构建候选解的指令集组成。

构建候选集的指令集被称为解码器。它要满足以下几个性质。

  • 对优化问题的可行解至少存在一个解码器。
  • 每个可行解相应的解码器个数应相同,这样搜索时不会有偏向。
  • 每个解码器应该相当于一个可行解。
  • 解码器和候选解之间的转换在计算上应该比费用评价快。
  • 解码器中一个小变化应该相当于候选解中的一个小变化。

对于具体应用,如果很难满足这些规则可以适当放松。

一旦得到构建候选解的指令集,就重新定义包括指令集(解码器)的进化算法的种群。然后对解码器进行选择,重组和变异,从而保证满足约束。

 2.特殊算子

很多实际的优化问题的解都落在约束边界上。由此得到通过探索约束边界求解优化问题的想法。因为我们预期优化问题的解会在约束的边界上。也许可以忽略约束边界以内的部分。例如考虑带乘积约束的优化问题:

 因此,通过搜索满足下式的(x_{1},x_{2},x_{3},x_{4})的组合求解优化问题

 可以按照下面的方式初始化种群中的一个个体:

 它保证(x_{1},x_{2},x_{3},x_{4})满足(38)式,现在假设有另一个个体(y_{1},y_{2},y_{3},y_{4})并且y_{1}y_{2}y_{3}y_{4}=0.75.如果再带生成个体z满足z_{i}=x_{i}^{\alpha }y_{i}^{1-\alpha },i∈[1,4],这里实数α∈[0,1],子代就总能满足约束z_{1}z_{2}z_{3}z_{4}=0.75。因为

 可见,这个专用的交叉算子能保证两个可行的父代的子代也是可行的。

还可以为这个问题设计一个准们的变异算子:

 其中,i∈[1,4]和j∈[1,4]是两个不同的随机整数,q是一个随机数。每一个可行的个体z按这种方式变异都会得到可行个体{x}'

这些简单的重组和变异算子说明进化算法是如何使用专用的算子。专用算子需要依赖具体的问题确定;对每个约束问题,为了包住可行性,在设计进化算法时都要描述1具体问题的算子。

3.Genocop

 带约束问题的数值优化遗传算法Genocop,这个算法包含有约束优化的几个特殊性质和技巧。Genocop背后的想法是这样的:根据约束的形式,我们可以用具体问题的算子将不可行个体转换为可行个体。对于(38)式那样的约束式就可以这样做。如果有一个个体不满足约束,就按照(40)式的最后一行替换它的第四个分量。这是一种修补方法。或者首先生成一个子代个体的前三个元素,然后按照(40)式的最后一行生成4个元素。这是特殊算子的方法。

假设有线性约束

如果有一个个体不满足这个约束,要修补它只需将x_{3}设置为小于8x_{1}的数就行。修改后的个体满足约束。这个例子说明用修补算法或特殊算子很容易满足线性约束。

Genocop的效率高,但是它的设计依赖于具体问题,如上所示。Genocop局限于线性约束以及其中某个变量可以由其他变量求得的特殊形式的非线性约束。

 4.GenocopⅡ

GenocopⅡ将Genocop与动态惩罚相结合。GenocopⅡ使用特殊算子最大化进化算法种群的可行性。首先,按照Genocop提出的方法修补不可行个体使它们满足所有线性约束。其次,通过最小化(8)式中的\phi (x)处理非线性约束,因为特殊算子已经满足了线性约束,式子中所有的约束都是非线性的。在(8)中权重r_{i}1/\tau。GenocopⅡ会让\tau在几代中保持不变。一段时间后,GenocopⅡ让\tau减小。这样就会令约束的压力增大,从而逐渐吸引越来越多的个体移动到可行集。

5.GenocopⅢ

GenocopⅢ是对Genocop的进一步改进。协同进化算法维护满足所有约束的参考点种群P_{r}={x_{r}},并采用Genocop所用的方法让搜索点种群P_{s}={x_{s}}满足线性约束。P_{r}P_{s}的规模可能不同。我们用修补后的版本P_{s}为的每一个个体x_{s}分配费用函数值,利用P_{r}的信息来修补x_{s}得到满足所有约束的个体{x_{s}}'。然后令f(x_{s})\leftarrowf({x_{s}}')。用一组随机数α∈[0,1]和一个随机选出的x_{r}P_{r}生成一个点序列x=ax_{s}+(1-a)x_{r},用这个点序列生成{x_{s}}',即在连接x_{s}x_{r}的直线上的一组随机点上集中搜索。当搜到可行的x之后,置x_{s}{x_{s}}',并赋值f(x_{s})\leftarrowf({x_{s}}')。此外如果f({x_{s}}')f(x_{s}),则在P_{r}中用{x_{s}}'替换x_{r}。最后,在P_{s}中以用户定义的某个概率ρ由{x_{s}}'替换x_{s}

 算法3概述GenocopⅢ算法。第一步初始化种群P_{s}。在生成它的种群时不考虑可行性,只按照Genocop那样满足线性约束。第二步用算法3后部分的来评价每个x_{s}P_{s}f(x_{s})。第三步是初始化P_{r}。初始化这个种群时生成的每一个个体都要满足所有的约束。第四步是评价每一个x_{r}P_{r}f(x_{r})。最后执行进化算法的循环演化P_{s}P_{r}种群。在修改P_{s}P_{r}时,可以用任何一个进化算法实施选择、重组和变异。


 约束优化的其他方法

 1.文化算法

文化算法是利用信仰空间指导进化的进化算法。也就是说,文化算法在尝试求解一个优化问题时,其搜索会偏向某个方向。带约束的文化算法不是惩罚方法,因为惩罚方法会增大不可行解的费用函数,带约束的文化算法让搜索偏向某个方向从而使不可行解在一开始就不太可能留在种群中。

 2.多目标优化

 多目标优化问题要同时最小化M个费用函数:

 可以将约束优化问题的费用看成是第一个目标,将约束看成是余下的目标。考虑(1)式的标准形式的约束优化问题:

 这个问题等价于(44)式中的多目标优化问题,如果

 因此,我们可以使用多目标优化问题求解约束优化问题。


候选解的排名

我们在前面讨论了约束优化问题候选解排名的几种方式。

  • (8)中用违反约束程度的函数作为惩罚费用函数
  • (10)式修改(8)式,让所有的可行个体排在不可行个体之前,同时对不可行个体根据它们违反约束的程度排名
  • (13)式让所有可行个体排在不可行个体的前面,同时对不可行个体基于违反约束的个属于而不是违反约束的程度排名
  • (14)式用违反约束的程度和个数作为惩罚函数
  • (19)式采用对违反约束的惩罚随着代数增加的方式定义惩罚费用函数
  • (23)和(34)式加强一个违反约束惩罚,它随着种群中可行个体个数的变化而变化
  • 分离遗传算法和自身自适应的适应度描述方法基于可行个体个数及不同个体相对费用的组合调整费用惩罚。
  • 随机排名用一个随机的过程来决定如何为候选解排名。

下面再介绍三个。

1.最大违反约束排名

不用违反约束程度的总和也不用违反约束的个数,可以用个体违反约束的最大程度来为它们排名。在这种情况下,将(8)式的惩罚函数替换为

还可以用违反约束程度的总和、违反约束的个数,以及最大违反约束程度的组合来对候选解排名。 

2.约束次序排名

将违反约束的程度和违反约束的个数相结合。假设x_{k}是N个体中第k个个体。假设一个带有m+q个约束的优化问题。我们用G_{i}(x_{k})表示x_{k}违反第i个约束的程度,G_{i}(x_{k})>0.然后用c_{i}(x_{k})表示x_{k}违反第i个约束的排名。这里较低的排名意味着违反约束较少,如果G_{i}(x_{k})=0,则令c_{i}(x_{k})=0。注意,c_{i}(x_{k})∈-0,N]。下面是种群规模为5的一个简单的例子

然后定义违反约束的测度为

3.\epsilon-水平比较

\epsilon-水平比较与静态的惩罚方法类似,它根据违反约束的水平使用不同的惩罚权重,但\epsilon-水平比较在排名时只采用两个违反约束的水平。

首先,用所有违反约束的组合,或最大违反约束来量化每一个个体x违反约束的量M(x):

 

也可以将总和约束和最大约束结合得到M(x)。

其次,两个个体x和y按如下方式排名:

 

其中\epsilon≥0,是用户定义的违反约束阈值。这个方法将违反约束小于\epsilon的解视为可行解,这样有利于排名。如果\epsilon=∞,就是单纯基于费用对个体进行排名。如果 \epsilon=0,基于费用对可行个体进行排名,对于不可行个体仅仅基于违反约束的程度来对它们进行排名,可行个体始终排在不可行个体的前面。通常随着代数的增加,\epsilon的值逐渐减少,这样就让满足约束变得越来越重要:

其中,​​​​​​​\epsilon(t)是第t代\epsilon的值,x_{p}是第p个违反约束最少的个体,p=N/5,N是种群规模,c和T_{c}是可调参数,经常设定c=100,T_{c}=t_{max}/5。


处理约束方法的比较 

  1.  EE:折中进化算法
  2. DP:动态惩罚方法,取c=10,α=2
  3. DS:动态惩罚方法与可行点优势的结合,取c=10,α=2
  4. EP:指数动态惩罚方法,取α=10
  5. ES:指数动态惩罚方法与可行点优势的结合,取α=10
  6. AP:自适应惩罚方法,\beta _{1}=4,\beta _{2}=3,且k=n,n为问题的维数
  7. SR:随机排名方法,取P_{f}=0.45
  8. NP:小生境惩罚方法
  9. \epsilonC:\epsilon-水平比较,c=100,T_{c}=200,且p=N/5,其中N是种群的规模

上面列出的处理约束的方法只关心对候选解的排名,我们可以将进化算法与上面的方法结合。采用BBO算法,同时采用上面的9中处理约束的方法中的一种计算每一个个体的适应度。

维数取n,只测试没有等式约束的基准:C01,C07,C08,C13,C14,C15。

这里的要点不是以高的离谱的函数评价次数得到最可能的最好性能,而是要在公平竞争的环境中对处理约束的方法作比较。变异方式是在搜索域中按均匀分布随机的选出一个值来替换个体的一个特征,变异率为1%。取精英参数为2.我们将费用最低的可行个体定义为最好的个体,如果没有可行个体,则将惩罚费用最低的个体定义为最好的个体。

下表列出了这9中处理约束的方法在没有等式约束的6个CEC2010约束优化基准上的性能。表中的结果是在20次蒙塔卡罗上的平均。

 所有算法在C01上的表现相似。其次,对于C13,除了EE,其他算法都表现得差不多;EE在C13,C14和C15上的表现都最差,这三个基准的约束最难满足。

  • 13
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值