2016-03-03 87 views
0

我希望尽量减少与多个参数和约束功能与Scipy.optimize.minimizeScipy最小化:如何将x限制为0和1?

def f(x): 
    return -1*(0.9*x[0] + 0.8*x[1] + 0.85*x[2])*(0.95*x[3] + 0.8*x[4] + 0.7*x[5])*(0.98*x[6] + 0.94*x[7]) 

x0 = [0, 0, 1, 0, 0, 1, 0, 1] 

cons=({'type': 'eq', 
    'fun': lambda x: x[0] + x[1] + x[2] - 1}, 
    {'type': 'eq', 
    'fun': lambda x: x[3] + x[4] + x[5] - 1}, 
    {'type': 'eq', 
    'fun': lambda x: x[6] + x[7] - 1}, 
    {'type': 'ineq', 
    'fun': lambda x: -1*(3*x[0] + x[1] + 2*x[2] + 3*x[3] + 2*x[4] + x[5] + 3*x[6] + 2*x[7] - 6)}) 

我怎么告诉蟒蛇是X [I]只能是0和1?

+0

另请参阅:http://stackoverflow.com/questions/17864474/how-to-minimize-a-function-with-discrete-variable-values-in-scipy – cel

回答

1

在理论上可以增加等式约束:

x[i] * (x[i]-1) = 0 

在实践中,因为这增加了讨厌的非凸度模型,不很好地工作。看起来你有一个非线性的客观和线性约束和二元变量,所以这表明我们需要看一个MINLP(混合整数非线性规划)求解器。这种求解器容易获得(例如,BonminCouenneBaron,Antigone)。

但是有些事情我们可以做。我们可以扩展你的目标,并写入

maximize 0.9*0.95*0.98*x[0]*x[3]*x[6] + 0.9*0.95*0.94*x[0]*x[3]*x[7] + ... 

maximize c1*(x[0]*x[3]*x[6]) + c2*(x[0]*x[3]*x[7]) + ... 

这些产品,如x[0]*x[3]*x[6],所有的X [I]是0-1或二进制变量可以线性化如下:

maximize c1*y1 + c2*y2 + .... 
y1 <= x[0] 
y1 <= x[3] 
y1 <= x[6] 
y2 <= x[0] 
y2 <= x[3] 
y2 <= x[7] 
... 
y1,y2,... binary variables 

如果我们想让y1,y2,...连续变量在0和1之间,它们将自动为零或一。更多细节是here

我们现在所拥有的是线性目标和线性约束以及二元变量x[i], y[j]。这可以通过MIP(混合整数规划)求解器来解决,这些求解器很容易获得。非常好的是CplexGurobi,但也有公共领域的,如CBCGLPK。他们中的很多人都有Python绑定。