线性规划,具有等式约束的意外解
Linear programming, unexpected solution with equality constraint
我想弄清楚我的实现有什么问题,我希望结果是 [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],
])
Minimize: c^T * x
Subject to:
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)
现在,(ii) 暗示 x1 = x2(因此您想要的解决方案不可行),然后 (i) 修正 x1 = x2 = 7.5。所以,linprog()
返回的解确实是正确的。由于您期望不同的结果,也许您应该研究将问题转化为代码的方式,因为我认为这就是您可以找到问题和解决方案的地方。
*) 因为你正在进行转置。
您的问题是:
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.5
和 x2 = 15
(唯一可能的值)。
我想弄清楚我的实现有什么问题,我希望结果是 [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],
])
Minimize: c^T * x
Subject to:
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)
现在,(ii) 暗示 x1 = x2(因此您想要的解决方案不可行),然后 (i) 修正 x1 = x2 = 7.5。所以,linprog()
返回的解确实是正确的。由于您期望不同的结果,也许您应该研究将问题转化为代码的方式,因为我认为这就是您可以找到问题和解决方案的地方。
*) 因为你正在进行转置。
您的问题是:
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.5
和 x2 = 15
(唯一可能的值)。