Le code ci-dessous montre une erreur de syntaxe après la boucle for sur cette ligne

model += x[int((str((i*2)-1)+str(j)))] + x[int((str(i*2)+str(j)))]] <= 1

Je veux que la variable soit déclarée comme tableau 2 D x11, x12, x13 est-ce que j'obtiens une erreur à cause de cela.

KeyError   
Traceback (most recent call last)
<ipython-input-95-19b3a6e81910> in <module>()
     19 for i in range (1, (Box//2)+1):
     20      for j in range (1,Pallet+1):
---> 21        model += x[int((str((i*2)-1)+str(j)))] + x[int((str(i*2)+str(j)))] <= 1
     22 
     23 

KeyError: 11

J'ai vérifié toutes les options possibles, tout semble correct, veuillez aider.

'' '

from pulp import *
Box=6
Pallet=3
Variable_range=Box*Pallet

from pulp import LpMaximize, LpProblem, LpStatus, lpSum, LpVariable
# Define the model
model = LpProblem(name="Container Loading", sense=LpMaximize)

# Define the decision variables
for i in range(1, Box+1):
    for j in range (1,Pallet+1):
      x = {int((str(i)+str(j))):LpVariable(name=f"x{i}_{j}",lowBound=0,upBound=1,cat='Integer')}
      print(x)

# Add constraints
for i in range (1, (Box//2)+1):
     for j in range (1,Pallet+1):
       model += x[int((str((i*2)-1)+str(j)))] + x[int((str(i*2)+str(j)))]] <= 1 # error at this line
        

#Set the objective
model += lpSum(x.values())

# Solve the optimization problem
status = model.solve()

# Get the results
print(f"status: {model.status}, {LpStatus[model.status]}")
print(f"objective: {model.objective.value()}")

for var in x.values():
    print(f"{var.name}: {var.value()}")


for name, constraint in model.constraints.items():
    print(f"{name}: {constraint.value()}")

'' '

0
user11150618 27 août 2020 à 13:50

2 réponses

Meilleure réponse

Essayez d'utiliser ce code ci-dessous. J'ai changé le style de définition des variables de décision. Ce n'est pas une erreur.

from pulp import *
Box=6
Pallet=3
Variable_range=Box*Pallet
x = {}
from pulp import LpMaximize, LpProblem, LpStatus, lpSum, LpVariable
# Define the model
model = LpProblem(name="Container Loading", sense=LpMaximize)

# Define the decision variables
for i in range(1, Box+1):
    for j in range (1,Pallet+1):
      x[(i,j)] = pulp.LpVariable('x' + str(i) + '_' + str(j), 0, 1, LpBinary)
      print(x[(i,j)])

# Add constraints
for i in range (1, (Box//2)+1):
     for j in range (1,Pallet+1):
       model += x[(i*2-1,j)] + x[(i*2,j)] <= 1 # error at this line
        

#Set the objective
model += lpSum(x.values())

# Solve the optimization problem
status = model.solve()
1
Monojit Mandal 27 août 2020 à 12:40

Il s'agit de boucles de malentendu. Dans:

# Define the decision variables
for i in range(1, Box+1):
    for j in range (1,Pallet+1):
      x = {int((str(i)+str(j))):LpVariable(name=f"x{i}_{j}",lowBound=0,upBound=1,cat='Integer')}

print(x)

Vous écrasez à chaque fois x. Donc, vous finissez par x contenant un seul élément. Vous pouvez voir cela en déplaçant l'instruction d'impression vers après la boucle.

Mieux vaut:

# Define the decision variables
x = {int((str(i)+str(j))):LpVariable(name=f"x{i}_{j}",lowBound=0,upBound=1,cat='Integer') 
        for i in range(1, Box+1) for j in range (1,Pallet+1) }

print(x) 
1
Erwin Kalvelagen 27 août 2020 à 12:05