[Python-es] Problema de variables con Pulp

Daπid davidmenhur en gmail.com
Mie Nov 15 07:04:02 EST 2017


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.agullo en 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 en python.org
> https://mail.python.org/mailman/listinfo/python-es
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20171115/6d5a91a4/attachment.html>


Más información sobre la lista de distribución Python-es