[Python-es] Problema de variables con Pulp

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


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.agullo en 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 <davidmenhur en 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.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
>>>
>>>
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
>>
>
> _______________________________________________
> 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/3dbd0cce/attachment.html>


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