Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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.
El modelo es el siguiente:
𝑥𝑥𝐼𝐼 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑑𝑑𝑑𝑑 𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑢𝑢𝑢𝑢 𝑑𝑑í𝑎𝑎 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡
𝑥𝑥𝐸𝐸 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑑𝑑𝑑𝑑 𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑢𝑢𝑢𝑢 𝑑𝑑𝑑𝑑𝑑𝑑 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡
𝑥𝑥𝐸𝐸 + 2𝑥𝑥𝐼𝐼 ≤ 6
2𝑥𝑥𝐸𝐸 + 𝑥𝑥𝐼𝐼 ≤ 8
−𝑥𝑥𝐸𝐸 + 𝑥𝑥𝐼𝐼 ≤ 1
𝑥𝑥𝐼𝐼 ≥ 2
𝑥𝑥𝐼𝐼 , 𝑥𝑥𝐸𝐸 ≥ 0
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:
2. Modelar
2.1. Crear el modelo: Crearemos el modelo y le daremos un nombre.
𝑥𝑥𝐼𝐼 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑑𝑑𝑑𝑑 𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑢𝑢𝑢𝑢 𝑑𝑑í𝑎𝑎 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡
𝑥𝑥𝐸𝐸 : 𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇𝑇 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑑𝑑𝑑𝑑 𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸𝐸 𝑎𝑎 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑒𝑒𝑒𝑒 𝑢𝑢𝑢𝑢 𝑑𝑑í𝑎𝑎 𝑑𝑑𝑑𝑑 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑗𝑗𝑗𝑗
Gurobi – Phyton - Spyder
model.setObjective(3*xi+2*xi,GRB.MAXIMIZE)
𝑥𝑥𝐸𝐸 + 2𝑥𝑥𝐼𝐼 ≤ 6
2𝑥𝑥𝐸𝐸 + 𝑥𝑥𝐼𝐼 ≤ 8 4
−𝑥𝑥𝐸𝐸 + 𝑥𝑥𝐼𝐼 ≤ 1
𝑥𝑥𝐼𝐼 ≥ 2
𝑥𝑥𝐼𝐼 , 𝑥𝑥𝐸𝐸 ≥ 0
model.addConstr(2*xe + xi <=8)
model.addConstr(-xe + xi <=1)
model.addConstr(xi >=2)
Gurobi – Phyton - Spyder
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:
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:
5
Funciones extra de GurobiPy
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()
Plan de producción
Máquina A B C
Máquina 1 0.002 0.02 0.05
Máquina 2 0.05 0.02 0.04
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:
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.
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}
4. Importar Gurobi
from gurobipy import *
5. Crear el modelo
m=Model('modelo')
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.addConstrs(quicksum(tiempos[i,j]*x[i,j] for i in
partes)<=40 for j in maquinas)
9. Resolver el modelo
m.optimize()
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
El modelo es el siguiente:
1. Importar Gurobi
2. Modelar
2.1. Crear el modelo
model = Model ('model')
Gurobi – Phyton - Spyder
model.setObjective(450*xg+120*xt+22*va+28*xa-28*ca,GRB.MAXIMIZE)
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
model.getVars()
print(xg.x)
1.4. Valor de la función objetivo usando comando print:
12
print("Valor FO: ", str(model.objVal))
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.
print(xt.varname)
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()
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))
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
14
Con este informe de Phyton que incluye análisis de sensibilidad, se pueden resolver
preguntas como las siguientes:
Gurobi – Phyton - Spyder
Valor FO: 2480000.0 indica que el beneficio óptimo será $2.480.000 (unidades
monetarias)
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.-