差分进化算法_带约束的遗传算法、差分进化算法、粒子群算法的小介绍

以下文字针对 scikit-opt 的 v0.5.9 版本(也是写这篇文章时的最新版本),针对带约束的遗传算法、差分进化算法、粒子群算法做一个梳理。有些约束很好用,有些约束效果其实不怎么好,在这里做个汇总。找了不少论文,实现之后效果一般,哪天找到更好的实现会持续做更新。

一些约束的格式的定义

  • lb:lower bound,“下界约束”,例如,要求满足约束 x0>=-1, x1>=1, x2>=0,那么取值 lb=[-1,1,0]
  • ub:upper bound,“上界约束”,例如,要求慢猪约束x0<=5, x1<=2, x2<=3,那么取值 ub=[5,2,3]
  • constraint_eq:线性约束,例如,要求 x0*x1=1, x1*x2=5,那么,取值 constraint_eq = [lambda x: x[0]*x[1]-1, lambda x: x[1]*x[2]-5]
  • constraint_ueq:非线性约束,例如,要求 x0*x1>=1, x1*x2<=5,那么,取值 constraint_ueq = [lambda x: 1-x[0]*x[1], lambda x: x[1]*x[2]-5]

多解释一下 constraint_eq、constraint_ueq,它们都是列表,列表的元素是函数,constraint_eq 里面的函数约束是等于0,constraint_ueq 里面的函数的约束是小于等于0

也可以这么写:

def constraint0(x):
    return 1 - x[0]*x[1]

def constraint1(x):
    return x[0]*x[1] - 5

constraint_ueq = [constraint0, constraint1]

带约束的遗传算法

在 scikit-opt 的遗传算法 (GA)中, lb, ub 靠编码方式实现,基因无论如何交叉、变异,都不能超过 lb 和 ub,这一约束非常有效。

constraint_eq,constraint_ueq 靠“罚函数”,也就是说,适应度的计算是这样的:

self.Y_raw + 1e5 * penalty_eq + 1e5 * penalty_ueq

其中:(示意公式)

penalty_eq =

penalty_ueq =

这么做缺点非常明显:

  • 非常依赖初始值的选择,如果初始值“不小心”全随机到了可行域外,那么算法会在可行域外迭代
  • 约束不能太多,否则目标函数非常“不平滑”,最后的优化结果什么也不是
  • 最拖累效果的是等式约束,超过两个基本就完蛋了。

改进计划:

罚函数法是一种比较通用的添加约束的方法,实现了几个其他的方法,感觉不比罚函数法的效果好太多。持续取找方案。

带约束的差分进化算法(DE)

变异算子:

r1,r2,r3=rand(size_pop)
V[i]=X[r1]+F(X[r2]-X[r3])

做变异算子后,是有可能超过lb和ub的,超过后,有两种策略:

  1. 仍然用旧的值(不做变异)
  2. 重新随机初始化

scikit-opt 采用的是第一个策略

交叉算子:变异后的值和原始值随机互换,所以这个算子不可能让结果超过lb,ub

penalty_eq,constraint_ueq 的实现同GA,靠罚函数来调整,所以有相同的缺点。(不过DE的特殊性,等式约束相比GA效果稍微好一点,不过也好不到哪里去)

带约束的粒子群算法 (PSO)

lb和ub有2种策略实现

  1. 当粒子“撞墙”后,粘在墙上。当然速度不清空,不会一直粘在墙上
  2. 当粒子“撞墙”后,按照物理规律反弹。也就是说,位置上“弹”回一半距离,速度上取相反数。

虽然2更加符合物理规律,但实测发现,如果同时有上下界,偶尔会在反弹时,速度和距离趋于无穷,(离散地去模拟经典力学偶尔都会发生这种情况)。即使不发生这种bug,2的效果实测也不如1

scikit-opt选用的是1策略

constraint_eq、constraint_ueq 未在 PSO 中实现。但读到了一些材料,觉得很有潜力,下一个版本放进去。

模拟退火、蚁群、免疫优化这几个算法放到下期写。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值