我试图在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的构造,或者有语法错误,有人可以告诉我。
答案 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_eq
和b_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