python中差分进化对参数的约束

时间:2017-04-07 18:35:06

标签: optimization constraints mathematical-optimization genetic-algorithm differential-evolution

我正在尝试使用差异进化来根据成本优化可用性。但是,我在这里有三个未知参数(a,b,c),我可以使用bounds定义范围。但是,我想将附加约束定义为+ b + c <= 10000.我使用python来执行此操作,并尝试在差异进化中使用选项“args”,但它不起作用。任何信息将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是一个黑客。我使用了documentation中的最后一个示例并约束了sum(x)&gt; 4.1(没有此约束,优化的解决方案是(0,0)):

from scipy.optimize import differential_evolution
import numpy as np
def ackley(x):
    arg1 = -0.2 * np.sqrt(0.5 * (x[0] ** 2 + x[1] ** 2))
    arg2 = 0.5 * (np.cos(2. * np.pi * x[0]) + np.cos(2. * np.pi * x[1]))

    if x[0]+x[1] > 4.1: #this is the constraint, where you would say a+b+c <=1000
        return -20. * np.exp(arg1) - np.exp(arg2) + 20. + np.e
    else:
        return 1000 #some high value

bounds = [(-5, 5), (-5, 5)]
result = differential_evolution(ackley, bounds)
result.x, result.fun

答案 1 :(得分:0)

使用差分进化定义约束对于我上面描述的问题不是一个合适的解决方案。为此,我们可以使用Nminimize命令,该命令具有专用选项来定义约束。

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)