以下文字针对 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
也可以这么写: