2015-12-21 62 views
1

我试图弄清楚什么是错我的执行意想不到的解决方案,我希望得到的结果是[5, 10],我不明白它是如何得到[7.5, 7.5]x1应该是一半x2。从笔者线性规划,等式约束

from scipy.optimize import linprog 
import numpy as np 

c = [-1, -1] 

A_eq = np.array([ 
    [1, 0.5], 
    [1, -0.5], 
]) 

b_eq = [15, 0] 

x0_bounds = (0, None) 
x1_bounds = (0, None) 

res = linprog(
    c, 
    A_eq=A_eq.transpose(), 
    b_eq=b_eq, 
    bounds=(x0_bounds, x1_bounds), 
    options={"disp": True}) 

print res.x 
# =>                                             
# Optimization terminated successfully.                                    
#   Current function value: -15.000000                                   
#   Iterations: 2                                        
# [ 7.5 7.5]                                     

更新:

正如有人说这里不需要矩阵转置。 问题是在基质本身中,为了获得期望的结果,这是[5, 10],它必须是:

A_eq = np.array([ 
    [1, 1], 
    [1, -0.5], 
]) 

回答

2

scipy linprog docs

最小化:C^T * X

除:

A_ub * X < = b_ub

A_eq * X == b_eq

所以,你现在解以下公式:

Minimize -x1 -x2 

符合,*

x1 + x2 = 15 (i) 
0.5 * x1 - 0.5 * x2 = 0 (ii) 

现在,(二)意味着,X1 = X2 (所以你想要的解决方案是不可行的),然后(i)修正x1 = x2 = 7.5。所以,linprog()返回的解决方案确实是正确的。既然你期待着不同的结果,也许你应该看看你将问题转化为代码的方式,因为我认为这就是你会发现问题和解决方案的地方。

*)由于您正在进行转置。

+0

谢谢,原来的问题是没有矩阵换位,这样做可能是因为晚上不知不觉,可能是因为晚了,基本上找到了如何达到预期结果,矩阵的第一行必须是'[1,1]',再次感谢。 –

+0

@RustyRobot很高兴听到您发现问题出在哪里。不用谢! :) –

2

您的问题是:

x1 + x2 == 15 
0.5 * x1 - 0.5 * x2 == 0 

minimize -x1 -x2 

所以,很显然你有x1 == x2(第二个制约因素),从而x1 = x2 = 7.5(第一约束)。

看着你的问题,你可能不想转A

res = linprog(
    c, 
    A_eq=A_eq, 
    b_eq=b_eq, 
    bounds=(x0_bounds, x1_bounds), 
    options={"disp": True} 
) 

为什么给你的问题:

x1 + 0.5 * x2 == 15 
x1 - 0.5 * x2 == 0 

minimize -x1 -x2 

,你会得到x1 = 7.5x2 = 15(唯一可能的值)。