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