Академический Документы
Профессиональный Документы
Культура Документы
Tarea 1
Problemas de optimización con el uso de Gurobi®
Índice de Contenidos
1. Introducción 1
2. Resolución de problemas 2
2.1. Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.1.1. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.1.2. Restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.3. Función Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.4. Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. Pregunta 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.1. Parte 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3. Parte 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.1. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.2. Restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.3. Función objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3.4. Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3. Anexo 12
Lista de Figuras
1 Datos entregados por el software gurobi . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Datos entregados por el software, para 1000Hrs. . . . . . . . . . . . . . . . . . . . . 5
3 Múltiples resultados dado distinto mínimo en Ha en ”Rent” 1-20Ha . . . . . . . . . 6
4 Múltiples resultados dado distinto mínimo en Ha en ”Rent” 45-75Ha . . . . . . . . . 6
Lista de Tablas
1 Variables: Pregunta 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Valores optimización granjero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Equipos sorteados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4 Equipos clasificados Mundial 2018 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5 Grupos mundial 2018 con ranking FIFA . . . . . . . . . . . . . . . . . . . . . . . . . 10
6 Grupos mundial 2018 con ranking relativo . . . . . . . . . . . . . . . . . . . . . . . . 10
7 Grupos considerando ranking FIFA Sin restricciones de pot . . . . . . . . . . . . . . 11
Lista de Códigos
1. Pregunta 1 (Python-Gurobi) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2. Pregunta 2 (Python-Gurobi) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1. Introducción
En el presente texto se expondrá varios problemas de decisión/optimización, que se resolverán
mediante el uso algoritmos matemáticos para su resolución. Para esto se usará el software Gurobi®
, que será el encargado de recibir las variables y restricciones dadas por el usuario para entregar la
solución optima del problema.
Además se verá la resolución de estos mismos a través de su relación con la matemática aplicada.
2. Resolución de problemas
2.1. Problema 1
El problema 1 consiste en en optimizar como un granjero debe racionar y administrar sus tierras
para tener un mayor beneficio.
De una forma mas precisa el señor debe considerar que porción de sus tierras (100 Ha), deberá
usar para el cultivo de maíz o trigo; y que animales(cerdos y aves) decide criar en un espacio de
10.000 m2 , donde se decidirá respecto a sus limitaciones.
Donde cada maíz y trigo, tiene su precio y costo respectivo al igual que la crianza de animales.
Así que, se resolverá que es lo adecuado para el granjero, para obtener la relación perfecta de
tierra. Y cual será su beneficio máximo respecto a las utilidades.
2.1.1. Variables
Donde se tomará como supuesto que no hay maíz ni trigo libre, es decir,todo se vende o es
para los animales, Además que los granos que se producen se pueden usar para los animales. Esto
implica que:
T c + T p = T v + T pig + T a (1)
M c + M p = M v + M pig + M a (2)
También, por definición se dice que el total de horas de producción, es la suma de las horas
propuestas de cada uno, es decir:
Además estas variables están sujetas a restricciones, ya que el terreno es finito al igual que los
insumos y horas, entonces.
2.1.2. Restricciones
Iniciando, dado a que el terreno de cultivo es finito (100 Ha). Donde el rendimiento por hectárea
es de 60 y 95 quintales, para trigo y maíz respectivamente, tenemos que:
h i h i
Tp
quintales
Mp
quintales
i + ≤ 100 Ha (4)
h h i
60
quintales
quintales
95
Ha Ha
Los cerdos necesitan alimentarse con 25 quintales de trigo o 20 quintales de maíz (o combinación)
para poder crecer, entonces:
h i h i
T pig
quintales
M pig
quintales
h i + h i = Cerdos (5)
quintales quintales
25
cerdo 20
cerdo
Además el terreno para la crianza es de 10.000 m2 , donde cada cerdo usa 25m2 y pollo equivalente
15m2 , dando:
25 ∗ cerdos + 15 ∗ pollo_eq ≤ 10000 m2 (7)
El granjero tiene un tiempo máximo de 2000 hrs. anuales para trabajar, además puede emplear a
su familia, disponiendo de 2000 horas adicionales.
También puede contratar personal extra por $150 la hora, pero requiere su supervisión, que corres-
ponde a 0.15 Hrs por hora contratada, es decir.
Y por ultimo tenemos que ingresar el tiempo que se necesita para la producción tanto de trigo y
maíz, como para la crianza de animales.
Tp Mp
HrP rod = 4 +4 + 0,15T p + 0,7M p + 25Cerdos + 40P olloEq (11)
60 95
Donde se incluyó las 4 horas que se necesitan por Hectárea, el tiempo por quintal de trigo y maíz,
0.15 y 0.7 respectivamente. Además de las horas por crianza de cerdos y pollos equivalentes, 25 y
40 horas respectivamente.
Ahora bien, ya que se tiene las restricciones, se debe dar paso a la función objetivo.
Fobj = 175T v+95M v+4000cerdos+4000P olloEq−250T c−150M c−20T p−12M p−150HrC (12)
2.1.4. Implementación
Para su implementación se usa el software Gurobi® con lenguaje de Python, para buscar el
punto optimo de la función objetivo. Se ejecuta el Código de la pregunta 1 (Ver anexo).
Ahora bien, si se bajan las horas de trabajo anuales del granjero a 1000Hrs. el punto
óptimo que entrega el problema es:
Dando una utilidad de 1024912.6086$ con 1000 horas anuales de trabajo menos del granjero.
Esto produce que se baje el numero de pollos criados desde 66 a 41, siendo esta baja correspondiente
a 1000 hrs. ya que cada pollo equivalente requiere 40 hrs, entonces 25*40=1000 hrs. Es decir los
valores de las otras variables se mantiene igual, solo aumenta los quintales de trigo vendido debido
a que se baja el consumo de trigo por parte de los pollos, y es mas conveniente vender el excedente.
Luego el granjero tiene la opción de arrendar parte de su terreno a un vecino, para esto
se agrega la variable rent que corresponde a las hectáreas que puede arrendar y la variable precio
que es el Valor por Ha, al agregarlo a la función objetivo y a las restricciones entrega los siguientes
valores:
Como se aprecia en la figura a distintos mínimos aplicados a la variable rent, dado el uso de
lb(lower bound), se obtienen diferentes precios por Ha para que sea conveniente arrendar.
Pero generalizando, que el granjero debe arrendar como mínimo una Ha, se obtiene que le con-
viene arrendar 1 Ha por el precio de 8184$ como mínimo para que obtenga mayor utilidades.
NOTA: El proceso para que se obtenga el precio para cada lower bound distin-
to, se hace mediante una iteración mediante un for con rango de 1 a 100
2.2. Pregunta 2
Dado a las varias faltas de transparencia en torno a la FIFA, especialmente en los sorteos de la
copa del mundo, se hará un programa que entregue la combinación optima, para que los grupos en
disputa este equilibrados.
2.2.1. Parte 1
En este caso se desarrollará una heurística que permite encontrar una asignación de grupos que
cumpla con las restricciones del sorteo.
Dado a los equipos que se presentan a continuación (tabla 3), se crea un proceso que pueda orde-
narlos en grupos que cumplan las siguientes restricciones:
Entonces se crean los pot’s de la siguiente manera. El pot 1 contiene el equipo organizador +
los de mejor ranking, el pot 2 los siguientes 3 equipos de mejor ranking, y el pot 3 los restantes.
Luego se insertan en los grupos los equipos del pot 1, uno en cada grupo, después se toma el mejor
equipo(menor ranking) del pot 2 y se ingresa el grupo que contenga la mayor suma, si cumple que
el grupo no contenga un equipo de su confederación(exceptuando un equipo de la UEFA(máximo
2)), si cumple con esta restricción se ingresa finalmente al grupo.
Después se usa el equipo que lo precede para ingresarlo en uno de los dos grupos que quedan
usando el mismo criterio y así se obtiene los 3 grupos cumpliendo las restricciones.
2.3. Parte 2
En esta parte se intentará corregir el desbalance en la formación de grupos en el sorteo de la
copa del mundo de la FIFA, para esto usaremos al igual que al inicio, el software Gurobi con python
de lenguaje.
Como se tiene los equipos clasificados (Tabla 4) para el mundial, con su respectivo ranking, mode-
lamos este problema creando las siguientes variables y restricciones.
2.3.1. Variables
Conjuntos
E: Equipos
G: Grupos
P: Pot’s
C: Confederación
Variables
1 si el equipo i es puesto en el grupo g (i ∈ E, g ∈ G)
(
Ni,g =
0 si no
2.3.2. Restricciones
Dado a que el sorteo de la copa del mundo de la FIFA, esta condicionado a algunas reglas (ver
pág. 6) que se deben cumplir, se crean las siguientes restricciones:
Nig = 1 (13)
X
∀i ∈ E
g∈G
Nig = 4 (14)
X
∀g ∈ G
i∈E
(15)
X
Nig ≤ M axc ∀g ∈ G
i∈C
Nig = 1 (16)
X
∀g ∈ G
i∈P
Dado a como definimos Dmax y Dmin . Esto ayuda a calcular la suma mínima y máxima de
cada grupo
(17)
X
Dmin ≤ Ranking[i] ∗ Nig ∀g ∈ G
i∈E
(18)
X
Dmax ≥ Ranking[i] ∗ Nig ∀g ∈ G
i∈E
NOTA:Según sea el caso del ranking elegido, solo se debe cambiar en la ec. (17) y
(18)
2.3.4. Implementación
Para obtener una buena relación de grupos,se utiliza el software Gurobi mediante un código(Ver
anexo) escrito en python.
En este caso, se utilizará el ranking de la FIFA, y el ranking relativo según los clasificados.
Ejecutando el código, nos entrega los siguientes grupos, que fueron extrapolados en una tabla:
La gran diferencia(132−84 = 38) de la tabla 5, es debido a que los equipos clasificados no fueron
los mejores(según el ranking), es decir, que existe una gran diferencia en algunos equipos clasifi-
cados, ya que se inferir que hubo equipos intermedios que no clasificaron, y más las restricciones
que se deben cumplir, esta diferencia aumenta, ya que descarta algunas posibilidades de equipos
en algunos grupos.
Pero aunque este valor es grande, es la menor diferencia posible, es decir, es la mejor conformación
de grupos posible, tomando el ranking FIFA como referencia.
Y en el caso de la tabla 6, donde el ranking es tomado con solo los equipos clasificados, es de-
cir cada equipo le corresponde un lugar del 1 al 32, con el ranking de Rusia 1, Alemania 2, Brasil 3,
32
X
etc. Entonces para que los grupos estén equilibrados, se debe cumplir que i /8 = 66, lo cual
i=1
se cumple a pesar de estar sujeto a restricciones, provocando que el valor de la función objetivo sea 0.
Además esta relación de grupos optima no es única(tabla 5), ya que se pueden generar las misma
diferencia mínima con distinto equipos distribuidos en los grupos, ya que se pueden hacer la misma
suma de los grupos con distintas relacionas.
De una mirada mas matemática, la variable principal Nig que corresponde a una variable binaria,
produce varias soluciones optimas dado el poliedro que genera y su forma, además con el tema del
ranking, se tiene que equipo intermedios no clasificaron, generando que se produzca combinaciones
de equipos inferiores o menores para que igualen la suma máxima y mínima de los grupos.
Pero proponiendo una mejor manera de crear los grupos. Se considera que no existan 4 pot’s,
es decir, que exista solo 1 pot que contenga a todos los equipos clasificados para su próxima dis-
tribución, además se mantiene las restricción del máximo de equipos por confederación, ya que no
sería un buen espectáculo ver equipos de la misma confederación en un grupo, debido a que sería
igual a partidos de eliminatoria o Copas de confederación.
Entonces los grupos con la nueva forma de serían:
3. Anexo
Código 1: Pregunta 1 (Python-Gurobi)
1 from gurobipy import *
2
3 m=Model("Granjero")
4
5 ###########DICCIONARIOS###########
6
7 T={} #Trigo
8 M={} #Maiz
9
10 ###########VARIABLES###########
11
12 for i in range(5):
13 M[i]=m.addVar(vtype="C",lb=0,name=’M %d’ %i)
14
15 for i in range(5):
16 T[i]=m.addVar(vtype="C",lb=0,name=’T %d’ %i) #se usa el name
17
18 #T0=Trigo comprado M0=Maiz comprado
19 #T1=Trigo producido M1=Maiz producido
20 #T2=Trigo vendido M2=Maiz vendido
21 #T3=Trigo cerdo M3=Maiz cerdo
22 #T4=Trigo aves M4=Maiz aves
23
24
25 cerdos=m.addVar(vtype="I",lb=0,name=’cerdos’)
26 pollo_eq=m.addVar(vtype="I",lb=0,name=’pollo_eq’)
27 Hr_C=m.addVar(vtype="I",lb=0,name=’Hr_C’)#Horas contratadas
28 Hr_F=m.addVar(vtype="C",lb=0,name=’Hr_F’)#Horas familia
29 Hr_GP=m.addVar(vtype="C",lb=0,name=’Hr_GP’)#Horas granjero produccion
30 Hr_GS=m.addVar(vtype="C",lb=0,name=’Hr_GS’)#Horas granjero supervision
31 Hr_Produccion=m.addVar(vtype="C",lb=0,name=’Hr_Produccion’)#Horas totales produccion
32
33 #rent=m.addVar(vtype="I",lb=1,ub=100,name=’arriendo’) #Variable rent para parte de
arriendo
34
35
36 m.update() #Actualizar variables
37
38 ###########RESTRICCIONES###########
39
40
41 #Cultivo
42 m.addConstr(T[0]+T[1]==T[2]+T[3]+T[4],name="Trigo")#Todo el trigo se usa
43 m.addConstr(M[0]+M[1]==M[2]+M[3]+M[4],name="Maiz")#Todo el maiz se usa
44
45 m.addConstr((T[1]/60)+(M[1]/95)<=100,name="Terreno cultivo")
46
47 #Crianza
48 m.addConstr(((T[3]/25)+(M[3]/20))==cerdos,name="ec. de cerdos")
49 m.addConstr(((T[4]/10)+(M[4]/25))==pollo_eq,name="ec. de pollos eq")
50
51 m.addConstr((25*cerdos)+(15*pollo_eq)<=10000,name="terreno crianza")
52
53 #Horas
54 m.addConstr(Hr_Produccion==Hr_GP+Hr_C+Hr_F,name="Horas de produccion")
55 m.addConstr(0.15*Hr_C==Hr_GS,name="Horas de supervision del granjero")
56
57 m.addConstr(Hr_GP+Hr_GS<=2000,name="Horas granjero")
58 m.addConstr(Hr_F<=2000,name="Horas familia")
59
60 m.addConstr(Hr_Produccion==4*(T[1]/60) + 4*(M[1]/95) + (T[1]*0.15) + (M[1]*0.7) + (25*
cerdos) + (40*pollo_eq),name="Horas de producciones")
61
62
63
64 ###########OBJETIVO###########
65
71 print(’ Valor’,m.Objval)
72 print(’ Horas produccion’,Hr_Produccion.X)
73 print(’ Horas Granjero produccion’,Hr_GP.X)
74 print(’ Horas Granjero supervision’,Hr_GS.X)
75
76
97
98 print(’ Trigo pollo’,T[4].X)
6 ##############VARIABLES##############
7
8 Dmin=m.addVar(vtype="I",lb=0,name=’Wmin’)
9 Dmax=m.addVar(vtype="I",lb=0,name=’Wmax’)
10
11 N=m.addVars(32,8,vtype="B",name=’Matriz de equipos’)
12
13 #Parametros
14 Ranking={0: 65, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 10, 10: 11, 11: 12,
12: 13, 13: 16, 14: 17, 15: 18, 16: 19, 17: 21, 18: 22, 19: 25, 20: 28, 21: 30, 22:
32, 23: 34, 24: 38, 25: 41, 26: 43, 27: 44, 28: 48, 29: 49, 30: 62, 31: 63}
15
21 #Confederaciones
22 UEFA=[1,3,5,6,7,8,10,11,15,16,17,19,24]
23 Conmebol=[2,4,9,12,14]
24 Concacaf=[13,18,29]
25 Afc=[23,26,27,30,31]
26 Caf=[20,21,22,25,28]
27 organizador=[0]
28
29 #Pots
30 p1=[0,1,2,3,4,5,6,7]
31 p2=[8,9,10,11,12,13,14,15]
32 p3=[16,17,18,19,20,21,22,23]
33 p4=[24,25,26,27,28,29,30,31]
34
35 m.update()
36
37 ############RESTRICCIONES############
38
39 #Ecuacion (13)
40 for i in range(32):
41 m.addConstr(quicksum(N[i,g] for g in range(8))==1)
42
43 #Ecuacion (14)
44 for g in range(8):
45 m.addConstr(quicksum(N[i,g] for i in range(32))==4)
46
47 #Ecuacion (16)
48 for g in range(8):
49 m.addConstr(quicksum(N[i,g] for i in p1)==1)
50 m.addConstr(quicksum(N[i,g] for i in p2)==1)
51 m.addConstr(quicksum(N[i,g] for i in p3)==1)
52 m.addConstr(quicksum(N[i,g] for i in p4)==1)
53
54 #Ecuacion (15)
55 for g in range(8):
56 m.addConstr(quicksum(N[i,g] for i in UEFA)<=2)
57 m.addConstr(quicksum(N[i,g] for i in Conmebol)<=1)
58 m.addConstr(quicksum(N[i,g] for i in Concacaf)<=1)
59 m.addConstr(quicksum(N[i,g] for i in Afc)<=1)
60 m.addConstr(quicksum(N[i,g] for i in Caf)<=1)
61 m.addConstr(quicksum(N[i,g] for i in organizador)<=1)
62
63 #Ecuacion (17)
64 for g in range(8):
65 m.addConstr(Dmin<=quicksum(Ranking[i]*N[i,g] for i in range(32)))
66
67 #Ecuacion (18)
68 for g in range(8):
69 m.addConstr(Dmax>=quicksum(Ranking[i]*N[i,g] for i in range(32)))
70
71 ##########FUNCION OBJETIVO##########
72
73
74 m.setObjective(Dmax-Dmin,GRB.MINIMIZE)
75
76 m.optimize()
77
78 print(’DIFERENCIA MAXIMA ’,m.Objval)
79 #Imprimir grupos
80 for g in range(8):
81 n=0
82 print(grupos[g])
83 for i in range(32):
84 if(N[i,g].X==1):
85 print(Equipos[i]+’\t\t’)
86 n=n+Ranking[i]
87 print()
88 print(’SUMA ’,grupos[g],’=’,n)
89 print()