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

Scipy线性规划无法得到总和为100的结果求助

线性规划求解异常问题分析与修复

问题核心

你当前的真实数据案例中,求解结果全是接近0的极小值,本质是目标函数的最小值落在了原点附近,且你缺失了关键的“变量总和为100”的约束条件,同时约束设置存在逻辑偏差。

正常运行的简单示例代码

from scipy.optimize import linprog
# sample data
c = [90, 190]
A = [[12, 50], [4.4, 1.2]]
b = [22, 3.6]
res = linprog(c, A_eq=A, b_eq=b)
res.x
# Output array([0.74708171, 0.26070039]) 

这个示例使用等式约束(A_eq)强制满足两个等式条件,变量成本系数的差异也带来了合理的非零解,因此结果符合预期。

异常案例的问题排查

你的真实数据代码存在两个关键问题:

  1. 缺失总和约束:你明确要求结果总和为100,但当前代码未添加x0+x1+x2+x3=100的等式约束。linprog会在满足现有不等式约束的前提下最小化成本——由于所有成本系数都是正数,最优解自然是尽可能让变量取0。
  2. 约束逻辑矛盾:现有不等式约束与“总和为100”的目标完全冲突:
    • 第二个约束:3.4x0 +3.5x1 +3.3x2 +3.5x3 ≤2.0,哪怕只取成本最低的x0,满足该约束的最大x0仅为2.0/3.4≈0.588,远小于你期望的总和100,这意味着当前约束下根本不存在总和为100的可行解。

修复方案

  1. 添加总和约束:新增等式约束,强制变量总和为100:

    # 总和约束:x0 + x1 + x2 + x3 = 100
    A_eq = [[1, 1, 1, 1]]
    b_eq = [100]
    
  2. 调整约束匹配目标:重新核对业务逻辑中的指标定义,将约束调整为与总和100匹配的数值。例如:

    • 若原b=[15,2.0]是每单位变量对应的指标上限,则总和为100时,约束右侧需放大100倍,即b_ub=[15*100, 2.0*100];
    • 若b是总量指标上限,则当前约束与总和100的目标矛盾,需重新确认业务规则。
  3. 修正后的完整代码:

    from scipy.optimize import linprog
    
    # 成本系数
    c = [15, 16, 22, 90]
    # 调整后的不等式约束(假设原指标为单位变量值,放大至总和100的总量)
    A_ub = [
        [8, 8, 12, 41], 
        [3.4, 3.5, 3.3, 3.5]
    ]
    b_ub = [1500, 200]
    # 总和约束
    A_eq = [[1, 1, 1, 1]]
    b_eq = [100]
    # 变量边界
    bounds = [(0, 50), (0, 25), (0, 10), (0, 3)]
    
    res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds)
    print(res.x)
    print("总和:", res.x.sum())
    print("求解状态:", res.success, res.message)
    

额外提示

  • 每次求解后查看res.success和res.message,可以快速判断是否存在可行域为空、求解失败等问题;
  • 若调整后仍异常,需重新核对业务指标的定义(是单位变量指标还是总量指标),确保约束与目标逻辑一致。

内容的提问来源于stack exchange,提问作者Muhammad Abdullah Nabeel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:45:37