<div dir="ltr"><div>Estás añadiendo una restricción por cada tipo de soldado, así que tienes que instanciar cuatro LpConstraints:<br><br></div>for i in soldados: prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, rhs=poblacion[i])<br> <br></div><div class="gmail_extra"><br><div class="gmail_quote">2017-11-15 13:25 GMT+01:00 Carlos Agullo <span dir="ltr"><<a href="mailto:cm.agullo@gmail.com" target="_blank">cm.agullo@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Muchas gracias David!!!<div><br></div><div>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í:</div><div><br></div><div>prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, rhs=poblacion[i]) for i in soldados<br></div><div><br></div><div>me dice "invalid syntax"</div><div><br></div><div>y si lo pongo dentro del paréntesis, así:</div><div><br></div><div>prob += LpConstraint(num_soldados[i] for i in soldados, sense=LpConstraintLE, rhs=poblacion[i] )<br></div><div><br></div><div>me dice "<span style="color:rgb(0,0,0);font-size:14px;white-space:pre-wrap">Generator expression must be parenthesized if not sole argument"</span></div><div><span style="color:rgb(0,0,0);font-size:14px;white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);font-size:14px;white-space:pre-wrap">Así que aunque entiendo lo de las "constraints" no consigo usarlo bien</span></div><div><br></div><div><br></div><div><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">El 15 de noviembre de 2017, 13:04, Daπid <span dir="ltr"><<a href="mailto:davidmenhur@gmail.com" target="_blank">davidmenhur@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Necesitas añadirlos como constraints:<br></div><div><br></div><div>for i in soldados:<br>    prob += LpConstraint(num_soldados[i], sense=LpConstraintLE, rhs=poblacion[i])<br></div><div><br></div><div>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.</div><div><br></div><div>La documentación en cuestión, no la más clara que podría ser:<br></div><div></div><div><a href="https://www.coin-or.org/PuLP/pulp.html#pulp.LpConstraint" target="_blank">https://www.coin-or.org/PuLP/p<wbr>ulp.html#pulp.LpConstraint</a></div><div><br></div><div>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).</div><div><br></div><div><br></div><div>/David.<br></div><div><br></div><br><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="m_-5026404530680981244h5">2017-11-15 12:10 GMT+01:00 Carlos Agullo <span dir="ltr"><<a href="mailto:cm.agullo@gmail.com" target="_blank">cm.agullo@gmail.com</a>></span>:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-5026404530680981244h5"><div dir="ltr">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) <div><br></div><div>Este es el diccionario que quiero crear:</div><div><font color="#0000ff"><br></font></div><div><div><font color="#0000ff">num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, cat='Integer')</font></div></div><div><br></div><div>pero me gustaría poner un límite superior para cada variable que tengo en un diccionario llamado poblacion. </div><div><br></div><div>He intentado poner la restricción dentro de la definición del diccionario de variables así: </div><div><br></div><div><div><font color="#0000ff">num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, upBound=poblacion[soldados], cat='Integer')</font></div></div><div><br></div><div>y también he intentado ponerlo al agregar el resto de restricciones del problema:</div><font color="#0000ff"><br>prob += (num_soldados[i] < poblacion[i]  for i in soldados</font><div><br></div><div>y en ambos me da error. ¿cómo puedo poner un límite superior a las variables?</div><div><br></div><div>A continuación pongo el código completo que no me da error por si sirve de ayuda:</div><div><br></div><div><br></div><div><div><span style="background-color:rgb(0,255,255)">from pulp import *</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)"># Declarar variables</span></div><div><span style="background-color:rgb(0,255,255)">soldados = ['Feng', 'Liu', 'Zhao', 'Jian']</span></div><div><span style="background-color:rgb(0,255,255)">presupuesto = 10000</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)">#Diccionario con los costes de cada tipo de soldado</span></div><div><span style="background-color:rgb(0,255,255)">coste = {'Feng':13,</span></div><div><span style="background-color:rgb(0,255,255)">          'Liu':21,</span></div><div><span style="background-color:rgb(0,255,255)">          'Zhao':17,</span></div><div><span style="background-color:rgb(0,255,255)">          'Jian':100}</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)">#Diccionario con la fuerza de cada tipo de soldado</span></div><div><span style="background-color:rgb(0,255,255)">fuerza = {'Feng':6,</span></div><div><span style="background-color:rgb(0,255,255)">          'Liu':10,</span></div><div><span style="background-color:rgb(0,255,255)">          'Zhao':8,</span></div><div><span style="background-color:rgb(0,255,255)">          'Jian':40}</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)">#Diccionario con la población máxima de cada tipo de soldado</span></div><div><span style="background-color:rgb(0,255,255)">poblacion = {'Feng':1000,</span></div><div><span style="background-color:rgb(0,255,255)">          'Liu':400,</span></div><div><span style="background-color:rgb(0,255,255)">          'Zhao':500,</span></div><div><span style="background-color:rgb(0,255,255)">          'Jian':150}</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)">#Crear la variable 'prob' que contiene los datos del problema</span></div><div><span style="background-color:rgb(0,255,255)">prob = LpProblem ("A Blending Problem", LpMaximize)</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)">#Crear un diccionario llamado "num_soldados" donde se definen las variables</span></div><div><span style="background-color:rgb(0,255,255)">num_soldados = LpVariable.dicts("soldiers", soldados, lowBound=0, cat='Integer')</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)">#Función objetivo</span></div><div><span style="background-color:rgb(0,255,255)">prob += lpSum(fuerza[i]*num_soldados[i<wbr>] for i in soldados), "Fuerza total del ejército"</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)">#Agregar las restricciones al 'prob'</span></div><div><span style="background-color:rgb(0,255,255)">prob += lpSum(coste[i]*num_soldados[i] for i in soldados) <= presupuesto</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)">#Resolver el problema</span></div><div><span style="background-color:rgb(0,255,255)">status = prob.solve()</span></div><div><span style="background-color:rgb(0,255,255)">LpStatus[status]</span></div><div><span style="background-color:rgb(0,255,255)"><br></span></div><div><span style="background-color:rgb(0,255,255)"># imprimir resultados</span></div><div><span style="background-color:rgb(0,255,255)">for v in prob.variables():</span></div><div><span style="background-color:rgb(0,255,255)">    print(<a href="http://v.name" target="_blank">v.name</a>, "=", v.varValue)</span></div><div><span style="background-color:rgb(0,255,255)">    </span></div><div><span style="background-color:rgb(0,255,255)">print("La fuerza total del ejército es: ", value(prob.objective))  </span></div></div><div><br></div><div><br></div><div><br></div></div>
<br></div></div>______________________________<wbr>_________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/python-es</a><br>
<br></blockquote></div><br></div>
<br>______________________________<wbr>_________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/python-es</a><br>
<br></blockquote></div><br></div>
</div></div><br>______________________________<wbr>_________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-es</a><br>
<br></blockquote></div><br></div>