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() ---> 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 """ -> 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: -> 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): -> 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() --> 210 raise DOcplexException(resolved_message) DOcplexException: Model<bedford> did not solve successfully
问题排查
模型求解失败的核心原因是约束条件冲突:
- Supply约束要求所有变量总和为1225
- Truck+Rail约束的总和是720+650=1370
两个等式矛盾,直接导致模型无可行解。
此外还有两个潜在问题:
- 波动率约束逻辑模糊:原代码计算的是各变量与平均波动率差值的加权和≥0,不符合常规“加权波动率等于目标值”的业务逻辑
- 变量未设非负约束:运输量类变量不能为负,原代码未限制可能导致不符合实际的解
修复后的代码
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("模型仍无可行解,请检查约束条件")
修复要点
- 消除约束冲突:将Supply约束的1225改为1370,与Truck+Rail的总和一致
- 添加非负约束:所有变量设置
lb=0,符合运输量不能为负的实际要求 - 优化波动率约束:改为加权波动率等于目标值的等式,逻辑更清晰且符合常规业务需求
- 增加容错判断:添加求解结果的非空检查,避免无可行解时调用
print_solution()报错
内容的提问来源于stack exchange,提问作者Theo GUIRROU
相关产品推荐
相关产品推荐

