1

제가 제약 세트를 추가 할 ,PuLP - COIN-CBC 오류 : 이중 불평등 및 완화가있는 제약 조건을 추가하는 방법은 무엇입니까?</p> <p>-M (1- X_ (I, J, K, N)) ≤S_ (I, J, K, N) -ToD_ (I, J, K :

여기서 M은 큰 수이고, S는 0과 1440 사이의 값을 취하는 정수 변수입니다 (0, 1, 0, 1, 0, ToD는 Excel 시트에서 값을 취하는 4 차원 행렬입니다. 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 

내가 문제 야 모르겠어요, 어떤 도움이되는 다음과 같은 오류가 발생? 나는 정보가 충분하지 않다면 나에게 내가 무엇을 추가해야하는지 알려주는이 새로운 것이다.

답변

0

그래, 몇 시간 동안 수색했지만이 질문을 게시 한 직후 나는 대답을 찾았습니다. 이러한 종류의 문제는 주로 변수 또는 제약 조건의 이름 때문에 발생합니다. 그게 뭔가 중복가 발생합니다. 나는 정말로 그런 종류의 소프트웨어에 익숙하지 않아서 왜 그렇게 오래 걸려서 대답을 찾지 못했습니다. 당신이 SI의 정의에서 보듯이 분명히 내가 있기 때문에 S에 cariable의 이름을 변경하는 것을 잊었다

**# 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) 

: 어쨌든, 나를 위해 문제는 내가 vaiables을 정의 할 때였다 복사 붙여 넣기. 어쨌든 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)** 

이것은 코드 실행 방법입니다.