Necesitas añadirlos como constraints: for i in soldados: prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, rhs=poblacion[i])
Explicación: en Python a < b se ejecuta de inmediato, Pulp necesita la expresión de alguna forma "simbólica", de ahí que tengas que dividirlo en la variable que estás restringiendo y el valor, o rhs (right hand side, la parte derecha de la expresión). Sense is el tipo de restricción, en este caso, LE less or equal, menor o igual. La documentación en cuestión, no la más clara que podría ser: https://www.coin-or.org/PuLP/pulp.html#pulp.LpConstraint Nótese que fácilmente lo puedes convertir en una restricción elástica, es decir, puedes comprarle unos pocos soldados Jian a tu vecino por un precio mayor, particularmente útil para ayudar la convergencia en problemas más complicados (el tuyo se puede resolver analíticamente). /David. 2017-11-15 12:10 GMT+01:00 Carlos Agullo <cm.agu...@gmail.com>: > Hola, estoy intentando resolver un problema típico de "Blending Problem" > con Pulp y no consigo poner bien las variables (concretamente el > diccionario de variables) > > Este es el diccionario que quiero crear: > > num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, > cat='Integer') > > pero me gustaría poner un límite superior para cada variable que tengo en > un diccionario llamado poblacion. > > He intentado poner la restricción dentro de la definición del diccionario > de variables así: > > num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, > upBound=poblacion[soldados], cat='Integer') > > y también he intentado ponerlo al agregar el resto de restricciones del > problema: > > prob += (num_soldados[i] < poblacion[i] for i in soldados > > y en ambos me da error. ¿cómo puedo poner un límite superior a las > variables? > > A continuación pongo el código completo que no me da error por si sirve de > ayuda: > > > from pulp import * > > # Declarar variables > soldados = ['Feng', 'Liu', 'Zhao', 'Jian'] > presupuesto = 10000 > > #Diccionario con los costes de cada tipo de soldado > coste = {'Feng':13, > 'Liu':21, > 'Zhao':17, > 'Jian':100} > > #Diccionario con la fuerza de cada tipo de soldado > fuerza = {'Feng':6, > 'Liu':10, > 'Zhao':8, > 'Jian':40} > > #Diccionario con la población máxima de cada tipo de soldado > poblacion = {'Feng':1000, > 'Liu':400, > 'Zhao':500, > 'Jian':150} > > #Crear la variable 'prob' que contiene los datos del problema > prob = LpProblem ("A Blending Problem", LpMaximize) > > #Crear un diccionario llamado "num_soldados" donde se definen las variables > num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, > cat='Integer') > > #Función objetivo > prob += lpSum(fuerza[i]*num_soldados[i] for i in soldados), "Fuerza total > del ejército" > > #Agregar las restricciones al 'prob' > prob += lpSum(coste[i]*num_soldados[i] for i in soldados) <= presupuesto > > > #Resolver el problema > status = prob.solve() > LpStatus[status] > > # imprimir resultados > for v in prob.variables(): > print(v.name, "=", v.varValue) > > print("La fuerza total del ejército es: ", value(prob.objective)) > > > > > _______________________________________________ > Python-es mailing list > Python-es@python.org > https://mail.python.org/mailman/listinfo/python-es > >
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es