Ошибка рекурсии при использовании PuLP - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время я создаю код, который может преобразовать существующую смешанную целочисленную матрицу таблиц линейного программирования в 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

1 Ответ

0 голосов
/ 30 апреля 2018

На вашем месте я бы изменил способ создания ограничений и цели

# 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]
...