es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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')

Tags:  , ,

Answer

  1. Avatar for 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 usando problem2_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:

    for j in Number:
        problem2_vars = LpVariable.dicts("x%s" % j, Letter, lowBound=0, cat='Binary')
        problem2 += lpSum([problem2_vars[j, letter] for letter in Letter]) == 1, "Constraint%s" % j
    

    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 cada j 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.

Comments are closed.