Optimización lineal continua en PuLP (Python)

En una publicación anterior demostré cómo resolver un problema de optimización lineal en Python, usando SciPy.optimize con la función linprog. En esta publicación, quiero proporcionar un ejemplo de codificación en Python, usando el módulo PuLP para resolver el siguiente problema:

Este problema es lineal y se puede resolver usando Pulp en Python. La sintaxis de modelado es bastante diferente de SciPy.optimize, como puede ver en el siguiente ejemplo de codificación:

# importando PuLP (se puede instalar con pip install, por ejemplo, en el indicador de anaconda)
import pulp

# use la función LpProblem para inicializar una declaración de nuestro problema de optimización lineal 
linearProblem = pulp.LpProblem ("some title", pulp.LpMaximize) # maximizamos, y por lo tanto usamos LpMaximize como parámetro

# usando el módulo PuLP, las variables de optimización deben declararse con la función LpVariable
x1 = pulp.LpVariable ("x1", lowBound = 0) # x1 solo tiene límite inferior, sin límite superior
x2 = pulp.LpVariable ("x2", lowBound = 0) # x2 solo tiene límite inferior, sin límite superior

# usando el operador + = podemos agregar la función objetivo al problema declarado
linearProblem + = 2 * x1 + 3 * x2 

# el mismo enfoque es válido para agregar restricciones
linearProblem + = x1 + x2 <= 10
linearProblem + = 2 * x1 + x2 <= 15

# podemos revisar nuestro problema ahora
linearProblem
some_title:
MAXIMIZAR
2 * x1 + 3 * x2 + 0
SUJETO A
_C1: x1 + x2 <= 10

_C2: 2 x1 + x2 <= 15

VARIABLES
x1 continuo
x2 continuo

Como podemos ver, la función objetivo es 2 X1 + 3 X2, como se documenta en el enunciado inicial del problema matemático en sintaxis escalar. Las restricciones están marcadas con _C1 y _C2. Ellos también son consistentes con el enunciado del problema matemático al comienzo de esta publicación. Además, es correcto que X1 y X2 son variables de optimización continuas y no discretas.

Ahora podemos resolver el problema, usando PuLP en Python:

# resuelva el problema, utilizando el solucionador PuLP estándar para problemas de optimización lineal continua
solution = linearProblem.solve ()

# ver si la ejecución de la optimización fue exitosa, usando LpStatus del módulo PuLP
pulp.LpStatus [solution]
'Óptimo'

La solución es óptima. Veamos el valor óptimo de la función objetivo:

# se accede al valor óptimo de la función objetivo con la función valor de la siguiente manera
pulp.value(linearProblem.objective)
30,0
# También se accede a la solución óptima para x1 con la función value (pero ya tenemos x1 como manejador)
pulp.value(x1)
0.0
# por último, a continuación muestro la solución óptima para x2
pulp.value(x2)
10.0

En mi blog también puede encontrar publicaciones que demuestran la programación lineal en R, usando lpSolve y FuzzyLP (por ejemplo, con crispLP o FCLP.sampledBeta). Además, he proporcionado ejemplos de optimización cuadrática con quadprog en R y cvxopt en Python. Por último, resolví problemas de optimización no lineal con descenso de gradiente en R, usando el paquete nloptr.

Leave a Reply

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Close

Meta