使用Scipy的linprog与单纯形法求解Tableau为何结果不符预期?
问题原因
Scipy的linprog默认求解最小化目标函数,且默认不等式约束为A_ub @ x ≤ b_ub。但你的原问题约束应为A @ x ≥ b——此时[0,0,0,0]不满足约束(比如0≥42不成立),不会被选为可行解;而你直接传入A和b作为A_ub和b_ub,相当于把约束设为A @ x ≤ b,[0,0,0,0]是该约束下的可行解且目标函数值最小,因此得到了不符合预期的结果。
解决方法
将原约束转换为linprog支持的格式:把A @ x ≥ b取反,得到-A @ x ≤ -b,再传入对应参数即可:
c = [7, 9, 18, 17] A = [ [2, 4, 5, 7], [1, 1, 2, 2], [1, 2, 3, 3] ] b = [42, 17, 24] from scipy.optimize import linprog # 转换约束方向:A@x >= b → -A@x <= -b res = linprog( c, A_ub=[[-elem for elem in row] for row in A], b_ub=[-val for val in b], method='simplex' ) print(res)
运行后会得到符合预期的结果:
- 变量解:
x: array([3., 0., 7., 0.]) - 目标函数值:
fun: 147.0
注:linprog默认要求变量x ≥ 0,这和你的预期解一致,无需额外设置bounds参数。
内容的提问来源于stack exchange,提问作者NEWO-o
相关产品推荐
相关产品推荐

