Está en la página 1de 16

Phyton

Toledo, G. (2021). Phyton [apunte]. Chile. UNAB


Gurobi – Phyton - Spyder

GUROBI – PHYTON - SPYDER

Gurobi es un solucionador de optimización matemática más utilizado por su


rapidez y potencia. “Gurobi Optimizer” es utilizado por las principales compañías
globales en más de 40 sectores diferentes para resolver rápidamente sus complejos
problemas del mundo real y tomar decisiones automatizadas que optimizan su eficiencia
y rentabilidad.

Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en


la legibilidad de su código. Se trata de un lenguaje de programación multiparadigma,
ya que soporta parcialmente la orientación a objetos, programación imperativa y, en
menor medida, programación funcional. Es un lenguaje interpretado, dinámico y
multiplataforma.

Spyder (Scientific Python Development Environment). Este es un potente entorno de


desarrollo interactivo para el lenguaje Python. Posé funciones avanzadas de edición,
pruebas interactivas, depuración e introspección y un entorno informático numérico.

Ejercicios de resolución de modelos de investigación de operaciones.

Para programar y ejecutar los ejercicios debe tener instalado: Gurobi, Python y Spyder,
en documento “acin112_s2_phyton” está disponible el tutorial de instalación. 1

Los siguientes ejercicios, son ejemplos de cómo escribir y resolver un modelo de


programación lineal en sus formas: extendido, parametrizado y entendido con análisis
de sensibilidad e interpretación de los resultados.
Gurobi – Phyton - Spyder

Ejercicio 1: Modelo de programación lineal extendido

El siguiente material es un tutorial de como escribir y resolver un modelo de


programación lineal extendido a través de Python con solucionador Gurobi, basado en
el video del siguiente enlace https://www.youtube.com/watch?v=WpTNh7yW09g
(Taha 5° Edición)

Reddy Mikks Company posee una pequeña fábrica de pinturas para interiores y
exteriores de casas para su distribución al mayoreo. Se utilizan dos materiales básicos,
A y B, para producir pinturas. La disponibilidad máxima de A es de 6 toneladas diarias;
la de B es de 8 toneladas por día. La necesidad diaria de materia prima por tonelada de
pintura para interiores y exteriores se resumen en la tabla que sigue.

Tabla 1: Toneladas de materia prima por Toneladas de Pintura

Exterior Interior Disponibilidad


Máxima (toneladas)
Materia Prima A 1 2 6
Materia Prima B 2 1 8

Un estudio de mercado ha establecido que la demanda diaria de pintura para interiores


no puede ser mayor que la pintura para exteriores en más de una tonelada. Asimismo,
2
el estudio señala que la demanda máxima de pintura para interiores está limitada a dos
toneladas diarias. El precio al mayoreo por tonelada es 3000 para la pintura de
exteriores y 2000 para la pintura de interiores ¿Cuánta pintura para exteriores e
interiores debe producir la compañía todos los días para maximizar el ingreso bruto?
Gurobi – Phyton - Spyder

El modelo es el siguiente:

𝑥𝑥𝐼𝐼 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑑𝑑𝑑𝑑 𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑢𝑢𝑢𝑢 𝑑𝑑í𝑎𝑎 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡
𝑥𝑥𝐸𝐸 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑑𝑑𝑑𝑑 𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑢𝑢𝑢𝑢 𝑑𝑑𝑑𝑑𝑑𝑑 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡

𝑀𝑀𝑀𝑀𝑀𝑀 𝑍𝑍 = 3𝑥𝑥𝐸𝐸 + 2𝑥𝑥𝐼𝐼

𝑥𝑥𝐸𝐸 + 2𝑥𝑥𝐼𝐼 ≤ 6

2𝑥𝑥𝐸𝐸 + 𝑥𝑥𝐼𝐼 ≤ 8

−𝑥𝑥𝐸𝐸 + 𝑥𝑥𝐼𝐼 ≤ 1

𝑥𝑥𝐼𝐼 ≥ 2

𝑥𝑥𝐼𝐼 , 𝑥𝑥𝐸𝐸 ≥ 0

A continuación, se detallará el paso a paso para escribir el modelo de programación


lineal por extensión a través de Spyder usando solucionador Gurobi:

1. Importar Gurobi: Este paso nos permitirá importar toda la librería de GurobiPy,
permitiendo la conexión con el motor de optimización de Gurobi. 3
Se utiliza el siguiente código:

from gurobipy import *

2. Modelar
2.1. Crear el modelo: Crearemos el modelo y le daremos un nombre.

model = Model ('Modelo 1')

2.2. Variables: Crear las variables de decisión continuas del modelo

𝑥𝑥𝐼𝐼 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑑𝑑𝑑𝑑 𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑢𝑢𝑢𝑢 𝑑𝑑í𝑎𝑎 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡

𝑥𝑥𝐸𝐸 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑑𝑑𝑑𝑑 𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑢𝑢𝑢𝑢 𝑑𝑑í𝑎𝑎 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑗𝑗𝑗𝑗
Gurobi – Phyton - Spyder

Se utiliza el siguiente código:

xi = model.addVar(vtype = GRB.CONTINUOUS, name= 'xi')

xe = model.addVar(vtype = GRB.CONTINUOUS, name='xe')

2.3. Función Objetivo: Crear la función objetivo de tipo maximización del


modelo.

𝑀𝑀𝑀𝑀𝑀𝑀 𝑍𝑍 = 3𝑥𝑥𝐸𝐸 + 2𝑥𝑥𝐼𝐼

Se utiliza el siguiente código:

model.setObjective(3*xi+2*xi,GRB.MAXIMIZE)

2.4. Restricciones: Crear cada una restricción del modelo.

𝑥𝑥𝐸𝐸 + 2𝑥𝑥𝐼𝐼 ≤ 6

2𝑥𝑥𝐸𝐸 + 𝑥𝑥𝐼𝐼 ≤ 8 4
−𝑥𝑥𝐸𝐸 + 𝑥𝑥𝐼𝐼 ≤ 1

𝑥𝑥𝐼𝐼 ≥ 2

𝑥𝑥𝐼𝐼 , 𝑥𝑥𝐸𝐸 ≥ 0

Se utiliza el siguiente código:

model.addConstr(xe + 2*xi <=6)

model.addConstr(2*xe + xi <=8)

model.addConstr(-xe + xi <=1)

model.addConstr(xi >=2)
Gurobi – Phyton - Spyder

3. Ejecutar el modelo: Para resolver el modelo creado se utiliza el siguiente código:

model.optimize()

4. Visualizar resultados: Para poder ver los resultados de las variables y función
objetivo en la consola se utilizan los siguientes códigos:

model.ObjVal #Para valor función objetivo


model.getVars() #Para valor de todas las variables
print(xe.x) #Para valor de una variable

Si se quiere ver los resultados de una manera más completa se debe utilizar el
comando print de Python, como el siguiente ejemplo de código el cual permite
ver el valor de la función objetivo redondeado en 2 decimales y el valor de cada
variable de forma ordenada redondeadas en 2 decimales:

print("Función objetivo: ", str(round(model.objVal, 2)))


for v in model.getVars():
print(str(v.VarName)+ "=" +str(round(v.x,2)))

5
Funciones extra de GurobiPy

• Importar el modelo: Gurobi permite importar el modelo a un archivo para poder


compartir con otras personas, para eso se utiliza el siguiente código:

model.write('Modelo 1.lp')

• Visualizar el modelo: Gurobi permite ver el modelo y así verificar que cada parte
de él se creó con éxito, para eso se utiliza el siguiente código:

model.display()

Resolución del modelo

Al tener escrito los comandos en terminal de Spyder y ejecutar con el botón


Gurobi – Phyton - Spyder

Se visualizarán los resultados del modelo:

Ejercicio 2: Modelo de programación lineal parametrizado

El siguiente material es un tutorial de como escribir y resolver un modelo de


programación lineal parametrizado a través de Python con solucionador Gurobi, basado
en el video del siguiente enlace https://www.youtube.com/watch?v=f7APSo3r6GA

Plan de producción

Ed Butler es gerente de producción de Bilvo Corporation, que produce tres tipos de 6


relaciones para automóviles. La manufactura de cada parte se puede procesar en
cualquiera de las 2 máquinas, con los siguientes tiempos de procesado (en horas):

Tabla 1: Tiempo de cada pieza por máquina

Máquina A B C
Máquina 1 0.002 0.02 0.05
Máquina 2 0.05 0.02 0.04

Tabla 2: Utilidad por parte

A B C
Utilidad 300 250 200

¿En qué máquina se debe producir cada parte para maximizar la utilidad?

El modelo es el siguiente:

𝑥𝑥𝑖𝑖𝑖𝑖 : 𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶 𝑑𝑑𝑑𝑑 𝑙𝑙𝑙𝑙 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑖𝑖 ∈ 𝐼𝐼 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑙𝑙𝑙𝑙 𝑚𝑚á𝑞𝑞𝑞𝑞𝑞𝑞𝑞𝑞𝑞𝑞 𝑗𝑗 ∈ 𝐽𝐽


Gurobi – Phyton - Spyder

𝑀𝑀𝑀𝑀𝑀𝑀 𝑍𝑍 = � � 𝑐𝑐𝑖𝑖 𝑥𝑥𝑖𝑖


𝑖𝑖∈𝐼𝐼 𝑗𝑗∈𝐽𝐽

� 𝑎𝑎𝑖𝑖𝑖𝑖 𝑥𝑥𝑖𝑖𝑖𝑖 ≤ 40 ∀𝑗𝑗 ∈ 𝐽𝐽


𝑖𝑖∈𝐼𝐼

A continuación, se detallará el paso a paso para escribir el modelo de programación lineal


paramétrico a través de Python usando solucionador Gurobi:

1. Identificar los sets o conjuntos de nuestro modelo, en este caso las partes y las
máquinas.

partes = [1,2,3]
maquinas = [1,2]

2. Crear los arcos: Este paso es importante porque las variables de decisión están
compuesta por un arco formado por el conjunto i,j que corresponde a partes y 7
máquinas.

arcos = [(i,j) for i in partes for j in maquinas]

3. Creamos los parámetros del modelo, en este caso tiempo (tabla 1) y utilidad
(tabla 2).

tiempos={(1,1):0.02,(1,2):0.05,(2,1):0.03,(2,2):0.02,(3,1):0.05,(3,2):0.04}

utilidad = {1:300, 2:250, 3:200}

4. Importar Gurobi
from gurobipy import *

5. Crear el modelo
m=Model('modelo')

6. Crear variables: Se crearán variables de forma paramétrica y continuas


Gurobi – Phyton - Spyder

𝑥𝑥𝑖𝑖𝑖𝑖 : 𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶 𝑑𝑑𝑑𝑑 𝑙𝑙𝑙𝑙 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑖𝑖 ∈ 𝐼𝐼 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑙𝑙𝑙𝑙 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚 𝑗𝑗 ∈ 𝐽𝐽

x= m.addVars(arcos, vtype=GRB.CONTINUOUS,name='x')

7. Crear la función objetivo: Se creará la función objetivo con las sumatorias que
ya tiene descritas. Para esto utilizamos un nuevo comando llamado quicksum
identificando los conjuntos de la sumatoria a través de un ciclo for.
𝑀𝑀𝑀𝑀𝑀𝑀 𝑍𝑍 = � � 𝑐𝑐𝑖𝑖 𝑥𝑥𝑖𝑖
𝑖𝑖∈𝐼𝐼 𝑗𝑗∈𝐽𝐽

m.setObjective(quicksum(utilidad[i]*x[i,j] for i in partes


for j in maquinas), GRB.MAXIMIZE)

8. Crear restricciones: Se creará la restricción con las sumatorias ya descritas y


permitiendo que se repita para cada máquina. Para esto utilizamos quicksum
identificando el conjunto de la sumatoria a través de un ciclo for, y por último se
utiliza otro ciclo for para indicar que se repite la restricción para cada máquina.

� 𝑎𝑎𝑖𝑖𝑖𝑖 𝑥𝑥𝑖𝑖𝑖𝑖 ≤ 40 ∀𝑗𝑗 ∈ 𝐽𝐽 8


𝑖𝑖∈𝐼𝐼

m.addConstrs(quicksum(tiempos[i,j]*x[i,j] for i in
partes)<=40 for j in maquinas)

9. Resolver el modelo
m.optimize()

10. Visualizar resultados: para modelos paramétricos lo mejor es visualizar a través


de comando print, sobre todo si se tiene un gran número de variables. A
continuación, el código para este ejercicio:
print("Función Objetivo: ",str(round(m.objVal, 2)))
for v in m.getVars():
print(str(v.VarName)+ "=" + str(round(v.x,2)))
Gurobi – Phyton - Spyder

Resolución del modelo

Al tener escrito los comandos en terminal de Spyder y ejecutar con el botón.


Se visualizarán los resultados del modelo:

Ejercicio 3: Análisis de sensibilidad

El siguiente material es un tutorial de cómo hacer análisis de sensibilidad a través de


Python con solucionador Gurobi, basado en el video del siguiente enlace
https://www.youtube.com/watch?v=KDiZoVPo6Ro 9

Búster Sod

Considere el Modelo de Búster Sod, que opera una granja de 800 acres en Arizona. Las
principales actividades de Búster Sod son el cultivo de Trigo, el cultivo de alfalfa y la
crianza de ganado vacuno. La autoridad de las aguas de Arizona asigna 1000 acre-pie
a Búster Sod para el próximo año. Los ejecutivos de Búster Sod, planifican la producción
del próximo año. Calculan que el precio de ganado de vacuno se conservará en 500 por
tonelada y que el trigo venderá a 2 por paca. Las estimaciones más precisas indican que
la alfalfa podría venderse a 22 la tonelada, pero el Búster Sod llegara a necesitar más
alfalfa que la que puede producir para alimentar a su ganado, tendría que pagar 28 por
cada tonelada que adquiere para esos propósitos. Algunas características del negocio
calculan un rendimiento para el trigo de 70 pacas por acre y para alfalfa de 4 toneladas
acre.
Gurobi – Phyton - Spyder

Tabla 1: Toneladas de materia prima por Tonelada de Pintura

M.O+ Req. Req. De Req.


Maq+ Agua Terreno Alfalfa
Costos
1 Acre trigo 20 2 1
1 Acre 25 3 1
Alfalfa
1 tonelada 50 0.05 0.1 5
de Vacuno

El modelo es el siguiente:

𝑥𝑥𝑡𝑡 : 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑 𝑎𝑎𝑎𝑎 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡

𝑥𝑥𝑎𝑎 : 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑 𝑎𝑎 𝑙𝑙𝑙𝑙 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎

𝑥𝑥𝑔𝑔 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔 𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣

𝑐𝑐𝑐𝑐: 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐


10
𝑣𝑣𝑣𝑣: 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣

𝑀𝑀𝑀𝑀𝑀𝑀 𝑍𝑍 = 450𝑥𝑥𝑔𝑔 + 120𝑥𝑥𝑡𝑡 + 22𝑣𝑣𝑣𝑣 + 28𝑥𝑥𝑎𝑎 − 28𝑐𝑐𝑐𝑐

𝑥𝑥𝑡𝑡 + 𝑥𝑥𝑎𝑎 + 0.1𝑥𝑥𝑔𝑔 ≤ 800

2𝑥𝑥𝑡𝑡 + 3𝑥𝑥𝑎𝑎 + 0.05𝑥𝑥𝑔𝑔 ≤ 1000

4𝑥𝑥𝑎𝑎 + 𝑐𝑐𝑐𝑐 − 5𝑥𝑥𝑔𝑔 − 𝑣𝑣𝑣𝑣 = 0

A continuación, se repiten los pasos escribir el modelo de programación lineal por


extensión del Ejercicio 1 a través de Python usando solucionador Gurobi:

1. Importar Gurobi

from gurobipy import *

2. Modelar
2.1. Crear el modelo
model = Model ('model')
Gurobi – Phyton - Spyder

2.2. Crear variable

𝑥𝑥𝑡𝑡 : 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑 𝑎𝑎𝑎𝑎 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡

𝑥𝑥𝑎𝑎 : 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑 𝑎𝑎 𝑙𝑙𝑙𝑙 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎

𝑥𝑥𝑔𝑔 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔𝑔 𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣

𝑐𝑐𝑐𝑐: 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑎𝑎

𝑣𝑣𝑣𝑣: 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣

xt = model.addVar(vtype = GRB.CONTINUOUS, name='xt')

xa = model.addVar(vtype = GRB.CONTINUOUS, name='xa')

xg = model.addVar(vtype = GRB.CONTINUOUS, name='xg')

ca = model.addVar(vtype = GRB.CONTINUOUS, name='ca')

va = model.addVar(vtype = GRB.CONTINUOUS, name='va') 11

2.3. Crear función objetivo


𝑀𝑀𝑀𝑀𝑀𝑀 𝑍𝑍 = 450𝑥𝑥𝑔𝑔 + 120𝑥𝑥𝑡𝑡 + 22𝑣𝑣𝑣𝑣 + 28𝑥𝑥𝑎𝑎 − 28𝑐𝑐𝑐𝑐

model.setObjective(450*xg+120*xt+22*va+28*xa-28*ca,GRB.MAXIMIZE)

2.4. Crear restricciones

𝑥𝑥𝑡𝑡 + 𝑥𝑥𝑎𝑎 + 0.1𝑥𝑥𝑔𝑔 ≤ 800

2𝑥𝑥𝑡𝑡 + 3𝑥𝑥𝑎𝑎 + 0.05𝑥𝑥𝑔𝑔 ≤ 1000

4𝑥𝑥𝑎𝑎 + 𝑐𝑐𝑐𝑐 − 5𝑥𝑥𝑔𝑔 − 𝑣𝑣𝑣𝑣 = 0

model.addConstr(xt+xa+0.1*xg <=800)

model.addConstr(2*xt+3*xa+0.05*xg <=1000)

model.addConstr(4*xa+ca-5*xg-va==0)
Gurobi – Phyton - Spyder

3. Ejecutar el modelo:

model.optimize()

Desde aquí se empieza a detallar el paso a paso para realizar el análisis de sensibilidad
en Spyder con Gurobi.

1. Visualizar resultado
1.1. Valor de función objetivo:

model.objVal

1.2. Valor de todas las variables

model.getVars()

1.3. Valor de una variable

print(xg.x)
1.4. Valor de la función objetivo usando comando print:
12
print("Valor FO: ", str(model.objVal))

1.5. Valor de las variables usando comando ciclo for:

for v in model.getVars():
print(str(v.varName)+"="+str(v.x))

2. Conocer el estado del modelo, donde puede indicar hasta 15 estados distintos,
que puede ver en el siguiente enlace
https://www.gurobi.com/documentation/9.1/refman/optimization_status_codes.
html#sec:StatusCodes.

print(model.status)

Para este caso entrega un valor de 2 que significa que el modelo tiene un óptimo.

3. Conocer el nombre de la variable: es decir aquel que le di al momento de crear


la variable.
Gurobi – Phyton - Spyder

print(xt.varname)

4. Conocer el costo reducido de una variable


print(xt.RC)

Si se quiere conocer el costo reducido de todas las variables se debe escribir el


siguiente ciclo for.

for v in model.getVars():
print(str(v.varname)+ ' Costos Reducido: '+ str(v.RC))

5. Obtener las variables de holgura: Para esto se deben seguir los siguientes pasos
5.1. Obtener las restricciones del modelo

model.getConstrs()

5.2. Obtener las holguras de cada restricción


for r in model.getConstrs():
print(str(r)[-3:-1] + " Holgura: "+str(r.slack))

6. Obtener los valores o precios duales: Para esto se debe ir nuevamente a cada 13
restricción y crear un ciclo for similar como en las holguras.

for r in model.getConstrs():
print(str(r)[-3:-1] + " Precio Dual: "+str(r.pi))

7. Extraer la información del análisis de sensibilidad


7.1. Análisis de sensibilidad de los coeficientes: Se tiene que realizar un ciclo
for para ver la cota inferior y superior de todas las variables

for v in model.getVars():
print(str(v.varName)+" Sensibilidad inferior:
"+str(v.SAObjLow)+"| superior "+str(v.SAObjUp))

7.2. Análisis de sensibilidad del lado derecho de las restricciones: Se tiene que
realizar un ciclo for para ver el valor actual del lado derecho y sus cotas
superiores e inferiores de todas las restricciones.

for r in model.getConstrs():
Gurobi – Phyton - Spyder

print(str(r)[-3:-1] + "Lado derecho: "+str(r.RHS)+ "


intervalo "+str(r.SARHSLow)+ " "+str(r.SARHSUp))

Resolución del modelo

Al tener escrito los comandos en terminal de Spyder y ejecutar con el botón.


Se visualizarán los resultados del modelo:

14

Con este informe de Phyton que incluye análisis de sensibilidad, se pueden resolver
preguntas como las siguientes:
Gurobi – Phyton - Spyder

1. ¿Cuál es el beneficio optimo que se obtendrá?

Valor FO: 2480000.0 indica que el beneficio óptimo será $2.480.000 (unidades
monetarias)

2. ¿Quedará terreno disponible sin ocupar?


R0 Holgura: 0.0 indica que se ocupará el total del terreno, por lo tanto, no quedará
terreno disponible sin ocupar.
3. ¿Cuánta agua será necesaria utilizar?
R1 Holgura: 600.0 indica que quedarán 600 acre -pie de la asignación de agua,
de los 1000 asignados se ocuparán 400 acre-pie.

4. El administrador desea agregar 180 acres para producir y aumentar la ganancia


¿En cuánto aumentará el beneficio con este terreno adicional?
R0 Precio Dual: 3100.0 corresponde al precio sombra, o sea por cada acre
adicional obtendrá un beneficio de $3100, por lo tanto, el beneficio por aumentar
los 180 acres será de: 180*$3100 = $ 558.000, el beneficio total quedara en
$2.480.000 + $558.000 = $3.038.000

5.- El administrador ha conseguido que las autoridades le aumenten la asignación


de agua en 200 acre-pie. ¿En cuánto le aumentará el beneficio?
R1 Precio Dual: 0.0 el precio dual o precio sombra de la restricción de agua es
15
cero, por lo tanto, no habrá aumento de beneficio.

6.- Si el precio del trigo se triplica o sea queda en $360. ¿En cuánto aumentará el
beneficio para la empresa?
Que el precio aumento, en el modelo se interpreta que el factor de la variable xt,
aumenta de $120 a $360, en la función objetivo, pero considerando que el
informe entrega:
xt=0.0, significa que xt (acres de tierra destinado al trigo), dio como resultado
cero, al multiplicar los $360.- por “cero” da “cero”, significa que el aumento
del precio no varía el beneficio total, o sea se mantiene en $2.480.000.-

7. El directorio de la empresa para el próximo año está pensando en aumentar los


acres para producción a 2500. ¿Cuál sería el beneficio obtenido?

R0Lado derecho: 800.0 intervalo 0.0 2000.0 significa que, en el modelo


actual, los acres se podrían aumentar hasta 2000. Para el aumento de 2500, el
modelo no considera eso, por lo tanto, se debe cambiar el modelo y ejecutar
nuevamente Python.

También podría gustarte