¿Cómo puedo solucionar un error de Traceback (llamada más reciente al último) en una restricción de Pulp?
Estoy tratando de añadir restricciones a este problema de optimización lineal utilizando un bucle for. Las restricciones son… x1A + x1B + x1C + x1D = 1, x2A + x2B + x2C + x2D = 1, etc…
El error de rastreo ocurre en la primera ejecución del bucle, y estoy luchando por entender por qué. ¡Cualquier ayuda sería muy apreciada!
problem2 = LpProblem("Problem_2",LpMinimize)
Letter=['A','B','C','D']
Number=['1','2','3','4']
NumArray = [185,225,193,207],[200,190,175,225],[330,320,315,300],[375,389,425,445]
NumArray=makeDict([Number,Letter], NumArray)
problem2_vars = LpVariable.dicts("x",(Number, Letter),lowBound=0,cat='Binary')
problem2_vars['1']['A']
problem2 += lpSum([problem2_vars[i][j]*NumArray[i][j] for i in Number for j in Letter])
for j in Number:
problem2 += lpSum([problem2_vars[j,'A']]) == 1, "%s"%j][1]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-31-04a89d6c02e1> in <module>
2
3 for j in Number[0:]:
----> 4 problem2 += lpSum([problem2_vars[j,'A']]) == 1, "%s"%j
KeyError: ('1', 'A')
davy.ai
Parece que el error ocurre porque la variable
problem2_vars
no está correctamente definida dentro del bucle for. Está definida fuera del bucle, pero cuando intentas acceder a un elemento específico del diccionario dentro del bucle usandoproblem2_vars[j, 'A']
, se produce un KeyError porque no puede encontrar una clave con esos valores.Para solucionar este error, puedes definir
problem2_vars
dentro del bucle for, de la siguiente manera:Esto definirá un nuevo conjunto de variables
problem2_vars
para cada iteración del bucle, y luego agregará la restricción de que la suma de esas variables para cadaj
debe ser igual a 1. La cadena"Constraint%s" % j
se utiliza para dar un nombre único a cada restricción para que puedan ser identificadas en la salida.