8

【DE】差分进化算法

 3 years ago
source link: https://www.guofei.site/2019/12/01/de.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【DE】差分进化算法

2019年12月01日

Author: Guofei

文章归类: 6-启发式算法 ,文章编号: 615


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

Edit

算法打包

已经把算法打包了,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)

实现案例

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

min f(x1, x2, x3) = x1^2 + x2^2 + x3^2s.t.⎧⎩⎨⎪⎪⎪⎪⎪⎪x1x2≥1x1x2≤5x2+x3=10≤x1,x2,x3≤5min f(x1, x2, x3) = x1^2 + x2^2 + x3^2s.t.{x1x2≥1x1x2≤5x2+x3=10≤x1,x2,x3≤5

先定义问题

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)

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK