Hecho y entendido!!!! muchas gracias

El 15 de noviembre de 2017, 13:37, Daπid <davidmen...@gmail.com> escribió:

> 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
>
>
_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es

Responder a