约束进化算法中的约束条件处理方法

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年提出的新型智能优化算法,并附MATLAB代码。

本质上,我们常说的“约束进化算法”,实际上是约束处理方法进化算法的结合。因此,在设计求解约束优化问题(COP)的算法时,将一种高效的进化算法与一种有效的约束处理方法相结合,有利于获得更好的优化性能。根据进化计算中约束处理方法的研究进展,约束处理方法主要分为3类:罚函数方法、可行性规则法和多目标方法。此外,还可以通过编解码来保证满足约束条件。(注意我上面说的是主要,不是所有,此外还有拉格朗日乘子法、投影法、KKT条件等)

(这里先说一下,那种仅仅变量带约束的优化问题,我更愿意叫它无约束优化问题,或者变量带约束的优化问题。例如,f(x)=26*x,x∈[2,3],这就是仅仅变量带约束,不需要约束处理,无论目标函数多么复杂。像我们常常使用的CEC2013、14、17,其实就等于是无约束的)

图片

01
罚函数方法

罚函数方法是一种常见的用于处理约束条件的技术。通过引入罚函数,将约束条件纳入目标函数中,从而将原问题转化为无约束优化问题。常用的罚函数方法包括:

外部罚函数法:在外部罚函数法中,将约束条件转化为罚函数,与目标函数相加形成新的目标函数。通过调节罚函数的惩罚参数,使得在优化过程中违反约束条件时会受到惩罚,从而找到满足约束条件的最优解。

内部罚函数法:内部罚函数法通过引入惩罚项,将约束条件嵌入目标函数中,使得在优化过程中逐渐减小惩罚项的权重,从而逼近满足约束条件的最优解。

二次罚函数法:二次罚函数法是一种特殊的罚函数方法,通过引入二次罚函数来处理约束优化问题。在该方法中,约束条件的违反程度将被平方作为惩罚项,以实现对约束条件的有效处理。

线性罚函数法:线性罚函数法是一种简单的罚函数方法,通过引入线性惩罚项来处理约束优化问题。在该方法中,约束条件的违反程度被线性惩罚,以推动优化算法朝向满足约束条件的方向前进。

此外,还有一些其他的罚函数方法,例如:逐步罚函数法、指数罚函数法、混合罚函数法、非光滑罚函数法等。就不展开介绍了。

这里主要讲解一下外部罚函数法内部罚函数法的区别注意我上面的语句,外部罚函数是“约束条件转化为罚函数,与目标函数相加形成新的目标函数”,而内部罚函数是“通过引入惩罚项,将约束条件嵌入目标函数中”。本质区别就在于如何处理约束条件和目标函数的关系。

举例说明:

考虑一个简单的优化问题,目标函数为最小化函数f(x),约束条件为g(x)<=0。在外部罚函数法中,将约束条件g(x)转化为罚函数P(x),新的目标函数为F(x)=f(x)+α*P(x),其中α是惩罚因子。通过调节α的大小,可以控制对约束条件的惩罚程度,从而影响最优解的求解过程。

继续以上述简单的优化问题,内部罚函数法会将约束条件g(x)直接嵌入到目标函数中,形成新的目标函数F(x)=f(x)+λ*g(x),其中λ是惩罚项的权重。通过逐步减小λ的值,使得约束条件逐渐趋近满足,从而找到最优解。

外部罚函数法和内部罚函数法的选择取决于具体问题的性质和约束条件的复杂程度。外部罚函数法相对简单直观,适用于一般约束优化问题;而内部罚函数法能够更好地平衡目标函数和约束条件之间的关系,适用于处理复杂约束条件或需要精细控制的情况。

上面的分类是按照罚函数本身设计来分类的,还有一种常见的分类是按照罚函数的性质和特点:死罚函数法、静态罚函数法和自适应罚函数法。和上面有交叉。

图片

02
可行性规则

可行性规则,建立在可行解优于不可行解的偏好基础上,是用来帮助进化算法实现种群更迭和优胜劣汰。假设要从两个解中选择一个进入下一代种群,3条比较规则为:

A. 当一个解可行,一个解不可行时,可行解要优于不可行解;

B. 当两个都是可行解时,选择目标函数值更优的解;

C. 当两个解都是不可行解时,选择违反约束更小的解。

因此,可行性规则需要计算约束违反度。

03
多目标方法

多目标约束处理方法是随着多目标优化的快速发展而被提出是一种约束处理技术。本质思想是讲约束转换为一个或者多个目标函数。根据处理约束的不同原则,有两类方法:

一类是转化为两个目标的双目标优化问题,即原来目标函数、所有约束条件集成为另一个目标函数。这样就转化为了双目标的无约束优化问题。

另一类是将每一个约束条件转化为一个目标函数。因此,对于一个单目标的有m个约束条件的优化问题来讲,最后会转化为具有m+1个目标函数的无约束优化问题。

04
通过编解码来满足约束条件

这个就举例说明就行了,主要是针对于一些离散问题,用约束处理方法处理起来很麻烦。例如柔性作业车间调度问题,有工序约束,还有机器选择约束,就在解码时直接让它满足问题的各种约束。

再比如带容量约束的车辆路径问题(CVRP),有一种插0的编码解码方案就是在解码时直接让它满足约束。

例如由1个配送中心,8个客户以及2台可用车辆组成的染色体编码为X={3,2,8,4,1,5,7,6},解码时将0插入编码中,代表配送中心。先将第一个客户点3加入到配送路径中,再判断下个客户2加入路径是否能满足车载容量约束,若能满足,则将该客户加入当前配送路径;若不能满足,则取当前客户点为下一条配送路径的起点,并将0放入后更新上一条路径。以此规则,可获得解码后的长度为N+k+1的染色体X'={0,3,2,8,0,4,1,5,7,6,0},配送路线分别为{03280}、{0415760},每条路线由一辆车服务,两个0之间自然数的顺序表示服务次序。

图片

05
拉格朗日乘子法

最后,额外介绍一下拉格朗日乘子法。拉格朗日乘子法也是一种常用的约束处理方法。通过引入拉格朗日乘子,可以将约束条件融入到目标函数中,从而转化为一个无约束的优化问题。

举例说明:考虑一个带约束条件的优化问题,最小化目标函数f(x),满足约束条件 g_i(x) ≤ 0,i=1,2,…,m

引入拉格朗日乘子λ_i,构建拉格朗日函数:L(x,λ)=f(x)+Σ(λ_i*g_i(x))

求解拉格朗日函数的极值问题,得到最优解 x* 和对应的拉格朗日乘子 λ*。

拉格朗日乘子法的优点与外部罚函数一样,在于能够将约束条件和目标函数统一起来,转化为一个更容易处理的无约束优化问题。通过引入拉格朗日乘子,可以通过求解拉格朗日函数的极值问题来找到满足约束条件的最优解。目前也有一些文献将EA和拉格朗日乘子法结合。

图片

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

algorithmzzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值