python linprog,lp似乎是无限的

时间:2018-01-28 21:00:15

标签: python scipy linear-programming

我试图在Python中编写一个简单的LP来解决石头剪刀,这是我之前的代码:

from scipy.optimize import linprog

obj = [0, 0, 0, -1]

A = [[0, 1, -1, -1], [-1, 0, 1, -1], [1, -1, 0, -1], [1, 1, 1, 0]]
b = [0, 0, 0, 1]
pb = (0.0, 1)
wb = (None, None)

res = linprog(obj, A_ub=A, b_ub=b, bounds=(pb,pb,pb,wb),options={"disp": True})
print(res)

不幸的是,当我运行它时,我收到以下消息:

    'Optimization failed. The problem appears to be unbounded.'

但考虑到我的LP如下:

f = -w

pp - ps - w = 0
-pr + -ps - w = 0
pr - pp - w = 0
pr + pp + ps = 1
0 < pr, pp, ps < 1

我不明白为什么这是无限的。如果我弄乱了我的LP的构造,或者有语法错误,有人可以告诉我。

1 个答案:

答案 0 :(得分:0)

你在电话里写道:

res = linprog(obj, A_ub=A, b_ub=b, bounds=(pb,pb,pb,wb),options={"disp": True})

所以这意味着你写了一个A_ub * x <= b_ub而不是A_eq * x = b_eq。结果你的程序看起来像:

minimize f = -w
wrt.
    pp - ps - w <= 0
    -pr + -ps - w <= 0
    pr - pp - w <= 0
    pr + pp + ps = 1
    0 < pr, pp, ps < 1

由于我们这里有最后一行... - w <= 0,我们的目标是最小化-w,这意味着最优的是w为正无穷大。

但是你的程序建议你想要平等边界。我们可以使用A_eqb_eq参数来写这个:

res = linprog(obj, A_eq=A, b_eq=b, bounds=(pb,pb,pb,wb),options={"disp": True})

然后给我们:

>>> res = linprog(obj, A_eq=A, b_eq=b, bounds=(pb,pb,pb,wb),options={"disp": True})
Optimization terminated successfully.
         Current function value: -0.000000   
         Iterations: 4
>>> print(res)
     fun: -0.0
 message: 'Optimization terminated successfully.'
     nit: 4
   slack: array([0.66666667, 0.66666667, 0.66666667])
  status: 0
 success: True
       x: array([0.33333333, 0.33333333, 0.33333333, 0.        ])

这意味着我们有:

pr = 1/3
pp = 1/3
ps = 1/3
w = 0