2016-07-07 168 views
1

我想添加這組約束: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我是雙變量,它取值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

好吧,我已經搜索了幾個小時,但是在我發佈這個問題之後,我找到了答案。這些問題主要是由於變量的名稱或約束。這是什麼導致重複。我真的不習慣那種軟件,這就是爲什麼我花了很長時間才找到和回答。無論如何,對我來說,問題是,當我定義vaiables:

**# 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的正確方式是這樣的:

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

這就是我如何讓我的代碼運行。