You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:41:59