如何在scipy线性规划求解器中表示依赖其他变量的变量边界?
处理Scipy Linprog中变量依赖的边界约束
嘿,这个问题很典型!Scipy的linprog求解器本身只支持固定数值的变量上下界(也就是bounds参数只能传常数),所以你遇到的这种变量边界依赖其他变量的情况,不能直接写在bounds里,得把这些依赖关系转化成线性不等式约束,放到A_ub和b_ub参数里。
具体转化步骤
你的约束条件可以拆成两部分:固定边界和变量依赖边界:
- 固定边界:
0 ≤ i ≤ 100、j ≥ 0、k ≥ 0,这些可以直接写到bounds参数中。 - 变量依赖的边界:
j ≤ i - 1变形为:-i + j ≤ -1(完全符合linprog要求的A_ub @ x ≤ b_ub格式)k ≤ j - 1变形为:-j + k ≤ -1
代码示例
假设我们的目标是最小化线性函数 z = i + 2j + 3k,下面是完整的实现代码:
from scipy.optimize import linprog # 目标函数系数(linprog默认求最小值,若求最大值需对系数取负) c = [1, 2, 3] # 不等式约束矩阵A_ub:每一行对应一个约束的系数 A_ub = [ [-1, 1, 0], # 对应 -i + j ≤ -1 [0, -1, 1] # 对应 -j + k ≤ -1 ] # 不等式约束的右侧值b_ub b_ub = [-1, -1] # 变量的固定上下界:(下界, 上界),None表示无界 bounds = [ (0, 100), # i的边界 (0, None), # j的下界0,上界由约束限制,设为None即可 (0, None) # k的下界0,上界由约束限制 ] # 求解线性规划(推荐用highs方法,性能更稳定) result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs') # 输出结果 print("最优解:", result.x) print("最优目标值:", result.fun)
注意事项
- 约束符号别搞反:
linprog默认处理的是A_ub @ x ≤ b_ub,一定要把变量依赖的边界严格转化成这种形式,否则求解结果会出错。 - 最大化目标的处理:如果你的需求是最大化某个线性函数,记得把目标系数
c取负数,求解后再把目标值取负得到最终的最大值。 - 变量顺序要统一:
A_ub的列顺序、c的顺序、bounds的顺序必须和你定义的变量顺序(比如x = [i, j, k])完全对应。
内容的提问来源于stack exchange,提问作者Barnali Basak
相关产品推荐
相关产品推荐

