2

この一連の制約を追加したい:

-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 は、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]), ""

私の経験によると、コードでは、これら 2 つの制約は、私たちが望むものと完全に同等です。問題は、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

何が問題なのかわからないのですが、助けてもらえますか? 私はこれに不慣れです。情報が十分でない場合は、何を追加すればよいか教えてください。

4

1 に答える 1

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)

の定義でわかるようにS、変数の名前を変更するのを明らかに忘れていました。これは、変数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)

これが私のコードを実行する方法です。

于 2016-07-07T23:20:49.823 に答える