【DE】差分进化算法
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.
【DE】差分进化算法
2019年12月01日Author: Guofei
文章归类: 6-启发式算法 ,文章编号: 615
版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2019/12/01/de.html
算法打包
已经把算法打包了,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)
实现案例
这是个非线性约束最优化问题
先定义问题
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)
您的支持将鼓励我继续创作!
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK