PuLP - ошибка COIN-CBC: как добавить ограничение с двойным неравенством и релаксацией?

Я хочу добавить этот набор ограничений:

-M (1-X_ (i, j, k, n)) ≤S_ (i, j, k, n) -ToD_ (i, j, k, n) ≤M (1-X_ (i, j, k),n)) ∀i,j,k,n

Где M - большое число, S - целочисленная переменная, которая принимает значения от 0 до 1440. ToD - это 4-мерная матрица, которая принимает значения из листа Excel. X i двойная переменная, она принимает значения 0-1.

Я пытаюсь реализовать в коде следующее:

for n in range(L):
    for k in range(M):
        for i in range(N):
            for j in range(N):
                if (i != START_POINT_S & i != END_POINT_T & j != START_POINT_S & j != END_POINT_T):
                    prob += (-BIG_NUMBER*(1-X[i][j][k][n])) <= (S[i][j][k][n] - ToD[i][j][k][n]), ""

и еще одно ограничение:

for i in range(N):
    for j in range(N):
        for k in range(M):
            for n in range(L):
                if (i != START_POINT_S & i != END_POINT_T & j != START_POINT_S & j != END_POINT_T):
                    prob += S[i][j][k][n] - ToD[i][j][k][n] <= BIG_NUMBER*(1-X[i][j][k][n]), ""

Согласно моему опыту, в коде эти два ограничения полностью эквивалентны тому, что мы хотим. Проблема в том, что PuLP и CBC не примут их. Производят следующие ошибки:

целлюлозно:

Traceback (most recent call last):
  File "basic_JP.py", line 163, in <module>
    prob.solve()
  File "C:\Users\dimri\Desktop\Filesystem\Projects\deliverable_B4\lib\site-packa
ges\pulp\pulp.py", line 1643, in solve
    status = solver.actualSolve(self, **kwargs)
  File "C:\Users\dimri\Desktop\Filesystem\Projects\deliverable_B4\lib\site-packa
ges\pulp\solvers.py", line 1303, in actualSolve
    return self.solve_CBC(lp, **kwargs)
  File "C:\Users\dimri\Desktop\Filesystem\Projects\deliverable_B4\lib\site-packa
ges\pulp\solvers.py", line 1366, in solve_CBC
    raise PulpSolverError("Pulp: Error while executing "+self.path)
pulp.solvers.PulpSolverError: Pulp: Error while executing C:\Users\dimri\Desktop
\Filesystem\Projects\deliverable_B4\lib\site-packages\pulp\solverdir\cbc\win\64\
cbc.exe

и CBC:

Welcome to the CBC MILP Solver
Version: 2.9.0
Build Date: Feb 12 2015

command line - C:\Users\dimri\Desktop\Filesystem\Projects\deliverable_B4\lib\sit
e-packages\pulp\solverdir\cbc\win\64\cbc.exe 5284-pulp.mps branch printingOption
s all solution 5284-pulp.sol (default strategy 1)
At line 2 NAME          MODEL
At line 3 ROWS
At line 2055 COLUMNS
Duplicate row C0000019 at line 10707 <     X0001454  C0000019  -1.000000000000e+
00 >
Duplicate row C0002049 at line 10708 <     X0001454  C0002049  -1.000000000000e+
00 >
Duplicate row C0000009 at line 10709 <     X0001454  C0000009   1.000000000000e+
00 >
Duplicate row C0001005 at line 10710 <     X0001454  C0001005   1.000000000000e+
00 >
At line 14153 RHS
At line 16204 BOUNDS
Bad image at line 17659 <  UP BND       X0001454   1.440000000000e+03 >
At line 18231 ENDATA
Problem MODEL has 2050 rows, 2025 columns and 5968 elements
Coin0008I MODEL read with 5 errors
There were 5 errors on input
** Current model not valid
Option for printingOptions changed from normal to all
** Current model not valid
No match for 5284-pulp.sol - ? for list of commands
Total time (CPU seconds):       0.02   (Wallclock seconds):       0.02

Я не знаю, в чем проблема, любая помощь? Я новичок в этом, если информации недостаточно, дайте мне знать, что я должен добавить.

1 ответ

Решение

Хорошо, я искал несколько часов, но сразу после того, как я разместил этот вопрос, я нашел ответ. Проблемы такого рода происходят главным образом из-за имен переменных или ограничений. Вот что заставило что-то дублировать. Я действительно не привык к такому программному обеспечению, поэтому мне понадобилось так много времени, чтобы найти и ответить. Во всяком случае, проблема для меня была, когда я определял переменные:

**# define X[i,j,k,n]
lower_bound_X = 0 # lower bound for variable X
upper_bound_X = 1 # upper bound for variable X
X = LpVariable.dicts(name="X", indexs=(range(N), range(N), range(M), range(L)), lowBound=lower_bound_X, upBound=upper_bound_X, cat=LpInteger)**

а также

# define S[i,j,k,n]
lower_bound_S = 0       # lower bound for variable S
upper_bound_S = 1440    # upper bound for variable S
S = LpVariable.dicts(name="X", indexs=(range(N), range(N), range(M), range(L)), lowBound=lower_bound_S, upBound=upper_bound_S, cat=LpInteger)

Как вы видите в определении SI, очевидно, забыл изменить название cariable на S, потому что я скопировал его. В любом случае правильный способ определения S таков:

**# define S[i,j,k,n]
lower_bound_S = 0       # lower bound for variable S
upper_bound_S = 1440    # upper bound for variable S
S = LpVariable.dicts(name="S", indexs=(range(N), range(N), range(M), range(L)), lowBound=lower_bound_S, upBound=upper_bound_S, cat=LpInteger)**

Вот как я запустил свой код.

Другие вопросы по тегам