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