Estás añadiendo una restricción por cada tipo de soldado, así que tienes que instanciar cuatro LpConstraints:
for i in soldados: prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, rhs=poblacion[i]) 2017-11-15 13:25 GMT+01:00 Carlos Agullo <cm.agu...@gmail.com>: > Muchas gracias David!!! > > Ahora he aprendido algo más (lo de las 'Constraints') lo único es que > cuando pongo sólo lo que tú me dices me da error diciendo que "i" no está > definida. Si lo pongo así: > > prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, > rhs=poblacion[i]) for i in soldados > > me dice "invalid syntax" > > y si lo pongo dentro del paréntesis, así: > > prob += LpConstraint(num_soldados[i] for i in soldados, > sense=LpConstraintLE, rhs=poblacion[i] ) > > me dice "Generator expression must be parenthesized if not sole argument" > > Así que aunque entiendo lo de las "constraints" no consigo usarlo bien > > > > > El 15 de noviembre de 2017, 13:04, Daπid <davidmen...@gmail.com> escribió: > >> 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 >> >> > > _______________________________________________ > 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