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)强制满足两个等式条件,变量成本系数的差异也带来了合理的非零解,因此结果符合预期。
异常案例的问题排查
你的真实数据代码存在两个关键问题:
- 缺失总和约束:你明确要求结果总和为100,但当前代码未添加
x0+x1+x2+x3=100的等式约束。linprog会在满足现有不等式约束的前提下最小化成本——由于所有成本系数都是正数,最优解自然是尽可能让变量取0。 - 约束逻辑矛盾:现有不等式约束与“总和为100”的目标完全冲突:
- 第二个约束:
3.4x0 +3.5x1 +3.3x2 +3.5x3 ≤2.0,哪怕只取成本最低的x0,满足该约束的最大x0仅为2.0/3.4≈0.588,远小于你期望的总和100,这意味着当前约束下根本不存在总和为100的可行解。
- 第二个约束:
修复方案
添加总和约束:新增等式约束,强制变量总和为100:
# 总和约束:x0 + x1 + x2 + x3 = 100 A_eq = [[1, 1, 1, 1]] b_eq = [100]调整约束匹配目标:重新核对业务逻辑中的指标定义,将约束调整为与总和100匹配的数值。例如:
- 若原
b=[15,2.0]是每单位变量对应的指标上限,则总和为100时,约束右侧需放大100倍,即b_ub=[15*100, 2.0*100]; - 若
b是总量指标上限,则当前约束与总和100的目标矛盾,需重新确认业务规则。
- 若原
修正后的完整代码:
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
相关产品推荐
相关产品推荐

