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