Programación lineal simple con Google ortools en Python

En otras publicaciones he demostrado cómo se puede resolver, p. Ej. Problemas de optimización lineal utilizando módulos como SciPy y PuLP en Python. En R también he demostrado, p. Ej. el paquete lpSolve.

En esta publicación quiero demostrar cómo se puede usar el solucionador Glop de Google desde el módulo ortools en Python.

El problema a resolver se indica a continuación:

Para poder resolver el problema con el solucionador Glop de Google, primero necesito instalar todo el módulo de ortools en Python. ortools es el módulo de la herramienta OR de Google en Python.

Después de instalar ortools, importo el submódulo pywraplp de ortools.linear_solver en Python:

from ortools.linear_solver import pywraplp

A continuación, creo una instancia de solucionador (usando el solucionador GLOP) y almaceno su referencia a un controlador de referencia:

solver = pywraplp.Solver.CreateSolver('linear_programming_examples', 'GLOP')

Ahora tengo que declarar variables de optimización relevantes. En este ejemplo, las variables de optimización son x, y y z:

# declarar la variable x, con límite inferior 0 y sin límite superior
x = solver.NumVar(0, solver.infinity(), "x")
# declarar variable y, con límite inferior 0 y sin límite superior
y = solver.NumVar(0, solver.infinity(), "y")
# declarar la variable z, con límite inferior 0 y sin límite superior
z = solver.NumVar(0, solver.infinity(), "z")

Como se explicó en los comentarios anteriores, uno debe especificar el límite inferior y superior al declarar la variable de optimización. Por lo tanto, el solucionador ya considera la restricción de no negatividad después de haber declarado las variables de optimización.

Habiendo declarado las variables de optimización, ahora puedo declarar la función objetivo:

# agregar un objetivo al solucionador
objective = solver.Objective()
# agregar términos al objetivo de manera que la función objetivo resulte de él
objective.SetCoefficient(x, 1)
objective.SetCoefficient(y, 2)
objective.SetCoefficient(z, 3)
# declarar el problema como un problema de maximización
objective.SetMaximization()

Después de haber definido la función objetivo, ahora tengo que agregar restricciones relevantes al solucionador:

# agregar restricción: 2x + y + z <= 20
constraint = solver.Constraint(-solver.infinity(), 20)
constraint.SetCoefficient(x, 2)
constraint.SetCoefficient(y, 1)
constraint.SetCoefficient(z, 1)
# agregar restricción: x + y + z <= 15
constraint = solver.Constraint(-solver.infinity(),15)
constraint.SetCoefficient(x, 1)
constraint.SetCoefficient(y, 1)
constraint.SetCoefficient(z, 1)
# agregar restricción: x - y - z> = 0
constraint = solver.Constraint(0,solver.infinity())
constraint.SetCoefficient(x, 1)
constraint.SetCoefficient(y, -1)
constraint.SetCoefficient(z, -1)

La modelo ahora está completa.

Podemos proceder a resolver el problema. Esto se hace en la línea de código a continuación:

solver.Solve()
0

La solución óptima para x se muestra a continuación:

print("x_opt: ", x.solution_value())
x_opt:  6.666666666666667

La solución óptima para y se muestra a continuación:

print("y_opt: ", y.solution_value())
y_opt:  0.0

La solución óptima para z se muestra a continuación:

print("z_opt: ", z.solution_value())
z_opt:  6.666666666666667

El valor óptimo de la función objetivo se calcula a continuación:

print("optimal value: " + str(x.solution_value()+2*y.solution_value()+3*z.solution_value()))
optimal value: 26.666666666666668

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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