【DE】差分进化算法



2019年12月01日    Author:Guofei

文章归类: 0x60_启发式算法    文章编号: 615

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2019/12/01/de.html


算法打包

已经把算法打包了,scikit-opt

PyPI release Build Status codecov PyPI_downloads Stars Forks Join the chat at https://gitter.im/guofei9987/scikit-opt

算法步骤

初始化种群

种群用实数表示

x=lb+rand(0,1)*(ub-lb)

变异

常见的差分策略是随机选取种群中两个不同的个体,将其向量差缩放后与待变异个体进行向量合成。

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

F是缩放因子,是一个确定的常数,V是下一代

另一个资料加上了一句:i,r1,r2,r3各不相等

然后,还要判断是否溢出了边界条件,如果溢出边界条件,那么需要随机重新产生(与初始种群的产生方法相同)

交叉

if rand<prob_crossover:
    U[i,j]=V[i,j]
else:
    U[i,j]=x[i,j] # X是上一代的

每个ij去独立的做(也就是每个i,j,都生成rand)

选择

贪婪选择的策略,即选择较优的个体作为新的个体。

if f(U[i,:])<=f(X[i,:])
    X[i,:]=U[i,:]
else:
    pass

额外

为了避免早熟,做自适应变异

l=exp(1-max_iter/(1+max_iter+iter))
F=F_max*pow(2,l)

实现案例

这是个非线性约束最优化问题

\[\text{min f(x1, x2, x3) = x1^2 + x2^2 + x3^2}\\ s.t.\left \{ \begin{array}{ll} x1x2 \geq 1\\ x1x2 \leq 5\\ x2+x3 = 1\\ 0 \leq x1, x2, x3 \leq 5 \end{array}\right.\]

先定义问题

def obj_func(p):
    x1, x2, x3 = p
    return x1 ** 2 + x2 ** 2 + x3 ** 2


constraint_eq = [
    lambda x: 1 - x[1] - x[2]
]

constraint_ueq = [
    lambda x: 1 - x[0] * x[1],
    lambda x: x[0] * x[1] - 5
]

然后调用算法求解

from sko.DE import DE

de = DE(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0], ub=[5, 5, 5],
        constraint_eq=constraint_eq, constraint_ueq=constraint_ueq)

best_x, best_y = de.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

您的支持将鼓励我继续创作!