python-2.7 - 使用 PuLP 的递归错误
问题描述
我目前正在构建一个代码,可以将现有的混合整数线性规划表格矩阵转换为与 PuLP 兼容的模型。尽管该程序在一台计算机上运行,但由于另一台计算机上的最大递归深度错误,它一再失败。两台计算机都使用最大递归深度 1000。此代码复制的模型并不大,因为它是一个包含大约 250 个变量和 90 个约束的测试模型。
该代码生成模型的 x 变量和目标函数,但在用于生成空约束的代码块的第一次迭代期间失败。模型的约束不返回值
# Import PuLP modeler functions
from pulp import *
# base model
model = LpProblem("MASTRS_LP",LpMinimize)
# shape of existing tableau matrix
[m,n]=np.shape(A)
# positive X variables
xVar = {}
for i in range(1,n+1):
if i-1 in e[:,1]: # if i is in array holding indexes of integer variables
xVar[i] = LpVariable(name='xNodeI_%s' % (i),lowBound=0, upBound=1,cat=LpInteger) #Integers
else:
xVar[i] = LpVariable(name='xRoute_%s' % (i),lowBound=0, upBound=None,cat=LpContinuous) # Routes
# Objective Function
model += lpSum([0]), "Sum of Total Supply Chain"
for i in range(1,n):
model.objective.addterm(xVar[i+1], c[0,i])
# Constraints
for i in range(0,m):
# Create empty constraint
if s[i]==1:
model += lpSum([0]) <= b[i]
if s[i]==0:
model += lpSum([0]) == b[i]
if s[i]==-1:
model += lpSum([0]) >= b[i]
# add variables to constraint
for j in range(0,n):
if A[i,j]!=0:
model.constraints['_C'+str(i+1)].addterm(xVar[j+1], A[i,j])
# delete existing transshipment variables
del A,b,s,c
# solve transshipment model
status = model.solve()
错误的第一行重复了很多次,
错误看起来像:
File "C:\Python27\ArcGIS10.3\lib\site-packages\pulp\pulp.py", line 735, in subInPlace
self.subInPlace(e)
File "C:\Python27\ArcGIS10.3\lib\site-packages\pulp\pulp.py", line 735, in subInPlace
self.subInPlace(e)
File "C:\Python27\ArcGIS10.3\lib\site-packages\pulp\pulp.py", line 733, in subInPlace
or isinstance(other, Iterable)):
File "C:\Python27\ArcGIS10.3\lib\abc.py", line 132, in __instancecheck__
if subclass is not None and subclass in cls._abc_cache:
File "C:\Python27\ArcGIS10.3\lib\_weakrefset.py", line 75, in __contains__
return wr in self.data
RuntimeError: maximum recursion depth exceeded in cmp
解决方案
如果我是你,我会改变生成约束和目标的方式
# Constraints
for i in range(0,m):
# Create constraint lhs
lhs = lpSum([A[i,j] * xVar[j+1] for j in range(0,n) if A[i,j]])
if s[i]==1:
model += lhs <= b[i]
if s[i]==0:
model += lhs == b[i]
if s[i]==-1:
model += lhs >= b[i]
推荐阅读
- simulation - 什么时候不重建轮子?
- sql - 根据唯一 id 从连接的多个表中汇总 SQL Server 中的某些列
- swift - 从 AVCapturePhotoOutput 裁剪 CGRect (resizeAspectFill)
- c# - C# ImageMagick 使用自定义字体
- c++ - 您应该使用包装类还是继承来扩展用户的类
- scala - 无法与 Scala 中的 avro 模式演变保持向后兼容性
- python - 'user_image' 属性没有与之关联的文件 | 姜戈
- r - 数字作为标题中的列名:使用 select() 时出现问题
- python - 机器人不和谐:嵌入消息中的颜色
- python - Python 字典/Hashmap 搜索优化问题