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

Python Docplex线性规划代码求解失败,寻求修复帮助

问题描述

我用Docplex编写了一段线性规划Python代码,运行时持续报错DOcplexException: Model<bedford> did not solve successfully,自行排查未解决,附上代码及完整报错栈:

原代码

from docplex.mp.model import Model
m=Model(name="bedford")
X1=m.continuous_var(name='Ashley')
X2=m.continuous_var(name='Bedford')
X3=m.continuous_var(name='Cosnol')
X4=m.continuous_var(name='Dunby')
X5=m.continuous_var(name='Earlam')
X6=m.continuous_var(name='Florence')
X7=m.continuous_var(name='Gaston')
X8=m.continuous_var(name='Hopt')
#average volatility
avgvol=19
#volatility constraint
Volatility=m.add_constraint((15-avgvol)*X1+ 
                            (16-avgvol)*X2+ 
                            (18-avgvol)*X3+ 
                            (20-avgvol)*X4+ 
                            (21-avgvol)*X5+ 
                            (22-avgvol)*X6+ 
                            (23-avgvol)*X7+ 
                            (24-avgvol)*X8 
                            >=0,"volatility_constraint"
                           )
#Capacity constraint
Supply=m.add_constraint(X1+X2+X3+X4+X5+X6+X7+X8==1225,"Supply")
#Rail, Truck & Union constraints
Truck=m.add_constraint(X2+X4+X5+X6==720,"Truck")
Rail=m.add_constraint(X1+X3+X7+X8==650,"Rail")
Union=m.add_constraint(X1+X2-X3+X4-X5+X6-X7-X8>=0,"Union")
#Constraints
Ashley=m.add_constraint(X1<= 300,"Ashley")
Bedford=m.add_constraint(X2<= 600,"Bedford")
Cosnol=m.add_constraint(X3<= 500,"Cosnol")
Dunby=m.add_constraint(X4<= 655,"Dunby")
Earlam=m.add_constraint(X5<= 575,"Earlam")
Florence=m.add_constraint(X6<= 680,"Florence")
Gaston=m.add_constraint(X7<= 450,"Gaston")
Hopt=m.add_constraint(X8<=490,"Hopt")
m.minimize(X1*49.5+X2*50+X3*61+X4*63.5+X5*66.5+X6*71+X7*72.5+X8*80)
m.print_information()
s=m.solve()
m.print_solution()

报错栈

DOcplexException                          Traceback (most recent call last)
Input In [6], in <cell line: 49>()
     47 m.print_information()
     48 s=m.solve()
---&gt; 49 m.print_solution()
File ~/opt/anaconda3/lib/python3.9/site-packages/docplex/mp/model.py:6081, in Model.print_solution(self, print_zeros, solution_header_fmt, var_value_fmt, **kwargs)
   6063 def print_solution(self, print_zeros=False,
   6064                    solution_header_fmt=None,
   6065                    var_value_fmt=None,
   6066                    **kwargs):
   6067     """  Prints the values of the model variables after a solve.
   6068 
   6069     Only valid after a successful solve. If the model has not been solved successfully, an
   (...)
   6079         :func:`docplex.mp.solution.SolveSolution.display`
   6080     """
-&gt; 6081     self._check_has_solution()
   6082     if var_value_fmt is None:
   6083         if self._has_username_with_spaces():
File ~/opt/anaconda3/lib/python3.9/site-packages/docplex/mp/model.py:5189, in Model._check_has_solution(self)
   5187     self.fatal("Model<{0}> has not been solved yet", self.name)
   5188 else:
-&gt; 5189     self.fatal("Model<{0}> did not solve successfully", self.name)
File ~/opt/anaconda3/lib/python3.9/site-packages/docplex/mp/model.py:1080, in Model.fatal(self, msg, *args)
   1079 def fatal(self, msg, *args):
-&gt; 1080     self._error_handler.fatal(msg, args)
File ~/opt/anaconda3/lib/python3.9/site-packages/docplex/mp/error_handler.py:210, in AbstractErrorHandler.fatal(self, msg, args)
    208 resolved_message = resolve_pattern(msg, args)
    209 docplex_error_stop_here()
--&gt; 210 raise DOcplexException(resolved_message)
DOcplexException: Model<bedford> did not solve successfully
问题排查

模型求解失败的核心原因是约束条件冲突:

  • Supply约束要求所有变量总和为1225
  • Truck+Rail约束的总和是720+650=1370
    两个等式矛盾,直接导致模型无可行解。

此外还有两个潜在问题:

  1. 波动率约束逻辑模糊:原代码计算的是各变量与平均波动率差值的加权和≥0,不符合常规“加权波动率等于目标值”的业务逻辑
  2. 变量未设非负约束:运输量类变量不能为负,原代码未限制可能导致不符合实际的解
修复后的代码
from docplex.mp.model import Model
m=Model(name="bedford")
# 为变量添加非负约束,符合业务实际
X1=m.continuous_var(lb=0, name='Ashley')
X2=m.continuous_var(lb=0, name='Bedford')
X3=m.continuous_var(lb=0, name='Cosnol')
X4=m.continuous_var(lb=0, name='Dunby')
X5=m.continuous_var(lb=0, name='Earlam')
X6=m.continuous_var(lb=0, name='Florence')
X7=m.continuous_var(lb=0, name='Gaston')
X8=m.continuous_var(lb=0, name='Hopt')

avgvol=19
# 修正波动率约束:改为加权平均等于目标值,符合常规业务逻辑
Volatility=m.add_constraint(
    (15*X1 + 16*X2 + 18*X3 + 20*X4 + 21*X5 + 22*X6 + 23*X7 + 24*X8) 
    == avgvol * (X1+X2+X3+X4+X5+X6+X7+X8), 
    "volatility_constraint"
)

# 修正Supply约束,与Truck+Rail的总和匹配,消除矛盾
Supply=m.add_constraint(X1+X2+X3+X4+X5+X6+X7+X8==1370,"Supply")
# Rail, Truck & Union constraints
Truck=m.add_constraint(X2+X4+X5+X6==720,"Truck")
Rail=m.add_constraint(X1+X3+X7+X8==650,"Rail")
Union=m.add_constraint(X1+X2-X3+X4-X5+X6-X7-X8>=0,"Union")

# 各产地容量约束
Ashley=m.add_constraint(X1<= 300,"Ashley")
Bedford=m.add_constraint(X2<= 600,"Bedford")
Cosnol=m.add_constraint(X3<= 500,"Cosnol")
Dunby=m.add_constraint(X4<= 655,"Dunby")
Earlam=m.add_constraint(X5<= 575,"Earlam")
Florence=m.add_constraint(X6<= 680,"Florence")
Gaston=m.add_constraint(X7<= 450,"Gaston")
Hopt=m.add_constraint(X8<=490,"Hopt")

m.minimize(X1*49.5+X2*50+X3*61+X4*63.5+X5*66.5+X6*71+X7*72.5+X8*80)
m.print_information()
s=m.solve()
# 添加求解判断,避免无可行解时报错
if s:
    m.print_solution()
else:
    print("模型仍无可行解,请检查约束条件")

修复要点

  1. 消除约束冲突:将Supply约束的1225改为1370,与Truck+Rail的总和一致
  2. 添加非负约束:所有变量设置lb=0,符合运输量不能为负的实际要求
  3. 优化波动率约束:改为加权波动率等于目标值的等式,逻辑更清晰且符合常规业务需求
  4. 增加容错判断:添加求解结果的非空检查,避免无可行解时调用print_solution()报错

内容的提问来源于stack exchange,提问作者Theo GUIRROU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:18:49