Extracción minera#
Tags: Parámetro binario, Mezcla, Recurso
Show code cell source
import os
# Por precaución, cambiamos el directorio activo de Python a aquel que contenga este notebook
if "optimizacion" in os.listdir():
os.chdir(r"optimizacion/Formulaciones/7. Extraccion minera/")
Enunciado - Punto 1#
La minería de cielo abierto es una actividad industrial que consiste en remover grandes cantidades de suelo para extraer el mineral deseado. Este tipo de minas son comunes en la extracción de materiales como: arena, arcilla, cobre y carbón. Las directivas de una empresa de extracción minera desean explotar un conjunto de zonas (\(M\)), de las cuales se puede extraer un conjunto de diferentes tipos de carbón (\(K:\{1\): Antracita, \(2\): Hulla, \(3\): Turba, \(4\): Lignito\(\})\). Se sabe que de la zona \(i\in M\) sólo puede extraerse el carbón tipo \(j\in K\). Para ello, suponga que \(a_{ij}\) es un parámetro binario que toma el valor de 1 si en la zona \(i\in M\) se puede extraer carbón del tipo \(j\in K\) y 0 en el caso contrario. La Figura 1 presenta un ejemplo en el cual hay 36 zonas y 4 tipos de carbón. Por ejemplo, para la zona uno se tiene que \(a_{11}=0\), \(a_{12}=1\), \(a_{13}=0\) y \(a_{14}=0\) ya que de la zona 1 sólo puede extraerse el tipo de carbón 2 (hulla).
Cada tonelada de carbón extraída de la zona \(i\in M\) le cuesta a la empresa \(c_i\) pesos. Adicionalmente, cada zona tiene una capacidad máxima de extracción de carbón de \(n_i\) toneladas. La Tabla 1 muestra la información de capacidades máximas y costos para cada zona.
Tabla 1. Información de extracción de cada zona
Zona |
Capacidad máxima de extracción de carbón (ton) |
Costo por tonelada de carbón extraído ($) |
---|---|---|
1 |
189 |
16 |
2 |
196 |
6 |
3 |
143 |
11 |
4 |
136 |
8 |
5 |
106 |
5 |
6 |
151 |
25 |
7 |
170 |
16 |
8 |
129 |
17 |
9 |
184 |
25 |
10 |
122 |
8 |
11 |
146 |
15 |
12 |
190 |
8 |
13 |
160 |
10 |
14 |
109 |
20 |
15 |
133 |
6 |
16 |
198 |
17 |
17 |
138 |
6 |
18 |
107 |
20 |
19 |
117 |
5 |
20 |
150 |
8 |
21 |
171 |
25 |
22 |
103 |
11 |
23 |
157 |
8 |
24 |
143 |
7 |
25 |
170 |
7 |
26 |
130 |
28 |
27 |
140 |
26 |
28 |
126 |
27 |
29 |
180 |
9 |
30 |
153 |
24 |
31 |
108 |
15 |
32 |
132 |
14 |
33 |
105 |
22 |
34 |
145 |
20 |
35 |
145 |
19 |
36 |
114 |
8 |
Por último. Supon que las directivas desean explotar un mínimo de \(b_j\) toneladas de cada tipo de carbón \(j\in K\). La Tabla 2 presenta dichas cantidades.
Tabla 2. Requerimiento mínimo de cada tipo de carbón
Tipo de carbón |
Mínimo de toneladas a explotar |
---|---|
Antracita |
862 |
Huila |
898 |
Turba |
562 |
Lignito |
742 |
Formula un programa lineal que le permita a la empresa decidir cuánto deben extraer en cada zona de manera que se cumplan los requerimientos a un mínimo costo.
Formulación#
a. Formula matemáticamente un modelo de optimización de forma general que represente la situación anterior. Defina clara y rigurosamente:
Conjuntos
Parámetros
Variables de decisión
Restricciones
Naturaleza de las variables
Función objetivo
Implementación#
b. Resuelve el modelo planteado utilizando la librería de PuLP en Python. ¿Cuál es la solución óptima del problema?
Librerías#
Importa la librería pulp
para crear y resolver el modelo.
# Escriba aquí el código en python de su formulación.
Conjuntos#
Define los conjuntos M
y K
que representan las zonas y los tipos de carbón respectivamente.
Recuerda que por conveniencia de preservar el orden de los elementos de los conjuntos, no siempre deberás definirlos con el tipo set
.
# Zonas
M = list(range(1, 37))
# Tipos de carbón
K = ["Antracita", "Hulla", "Turba", "Lignito"]
Parámetros#
Define o importa los parámetros del modelo.
# Si en la zona i en M se puede extraer carbón tipo j en K
a = {
(1, "Hulla"): 1,
(2, "Hulla"): 1,
(3, "Turba"): 1,
(4, "Turba"): 1,
(5, "Hulla"): 1,
(6, "Turba"): 1,
(7, "Hulla"): 1,
(8, "Hulla"): 1,
(9, "Antracita"): 1,
(10, "Antracita"): 1,
(11, "Hulla"): 1,
(12, "Turba"): 1,
(13, "Antracita"): 1,
(14, "Turba"): 1,
(15, "Turba"): 1,
(16, "Hulla"): 1,
(17, "Hulla"): 1,
(18, "Turba"): 1,
(19, "Antracita"): 1,
(20, "Lignito"): 1,
(21, "Turba"): 1,
(22, "Antracita"): 1,
(23, "Antracita"): 1,
(24, "Antracita"): 1,
(25, "Antracita"): 1,
(26, "Turba"): 1,
(27, "Turba"): 1,
(28, "Lignito"): 1,
(29, "Lignito"): 1,
(30, "Lignito"): 1,
(31, "Hulla"): 1,
(32, "Turba"): 1,
(33, "Hulla"): 1,
(34, "Antracita"): 1,
(35, "Lignito"): 1,
(36, "Antracita"): 1,
}
for i in M:
for j in K:
if (i, j) not in a:
a[i, j] = 0
# Costo por tonelada de carbón en la zona i en M
c = {
1: 16,
2: 6,
3: 11,
4: 8,
5: 5,
6: 25,
7: 16,
8: 17,
9: 25,
10: 8,
11: 15,
12: 8,
13: 10,
14: 20,
15: 6,
16: 17,
17: 6,
18: 20,
19: 5,
20: 8,
21: 25,
22: 11,
23: 8,
24: 7,
25: 7,
26: 28,
27: 26,
28: 27,
29: 9,
30: 24,
31: 15,
32: 14,
33: 22,
34: 20,
35: 19,
36: 8,
}
# Máximas toneladas a extraer de la zona i en M
n = {
1: 189,
2: 196,
3: 143,
4: 136,
5: 106,
6: 151,
7: 170,
8: 129,
9: 184,
10: 122,
11: 146,
12: 190,
13: 160,
14: 109,
15: 133,
16: 198,
17: 138,
18: 107,
19: 117,
20: 150,
21: 171,
22: 103,
23: 157,
24: 143,
25: 170,
26: 130,
27: 140,
28: 126,
29: 180,
30: 153,
31: 108,
32: 132,
33: 105,
34: 145,
35: 145,
36: 114,
}
# Mínimo de toneladas a explotar del tipo de carbón j en K
b = {
"Antracita": 862,
"Hulla": 898,
"Turba": 562,
"Lignito": 742,
}
Objeto del modelo#
Construye un problema al que luego agregarás las restricciones y la función objetivo.
# Escriba aquí el código en python de su formulación.
Variables de decisión#
Define las variables del problema de manera que estén contenidas en diccionarios indexados en los conjuntos de sus variables respectivas.
# Escriba aquí el código en python de su formulación.
Función objetivo#
Agrega al problema la función objetivo. Recuerda que al definir el problema, ya definiste si este es de maximización o minimización.
# Escriba aquí el código en python de su formulación.
Restricciones#
Agrega al problema las restricciones del modelo.
# Escriba aquí el código en python de su formulación.
Resolver el problema#
Invoca el optimizador. Este paso le asigna un valor a las variables incluidas en las restricciones o función objetivo del modelo.
# Escriba aquí el código en python de su formulación.
Imprimir resultados#
Antes de estudiar el óptimo del modelo, identifica en el estado del optimizador si pudo resolver el problema.
# Escriba aquí el código en python de su formulación.
Identifica también el valor de la función objetivo.
# Escriba aquí el código en python de su formulación.
Por último, imprime de manera estructurada el valor de las variables de decisión y otras expresiones de interés.
# Escriba aquí el código en python de su formulación.
Enunciado - Punto 2#
Ahora considera el escenario en que la empresa incurre en un costo fijo de \(q_i\) pesos cuando decide extraer carbón de la zona \(i\in M\). Por lo tanto, si se decide explotar la mina \(i\in M\), no se pueden extraer más de (\(n_i\)) toneladas de carbón. Pero si no se decide explotar, la extracción de carbón en esa zona debe ser igual a cero (0). La Tabla 3 presenta la información sobre los costos fijos de extraer cada zona.
Tabla 3. Costo fijo por extracción para cada zona
Zona |
Costo fijo de extracción en la zona |
---|---|
1 |
240 |
2 |
155 |
3 |
240 |
4 |
125 |
5 |
177 |
6 |
342 |
7 |
157 |
8 |
457 |
9 |
396 |
10 |
411 |
11 |
341 |
12 |
469 |
13 |
402 |
14 |
186 |
15 |
404 |
16 |
344 |
17 |
290 |
18 |
340 |
19 |
482 |
20 |
472 |
21 |
394 |
22 |
102 |
23 |
330 |
24 |
433 |
25 |
205 |
26 |
394 |
27 |
156 |
28 |
298 |
29 |
134 |
30 |
462 |
31 |
432 |
32 |
362 |
33 |
127 |
34 |
203 |
35 |
417 |
36 |
215 |
Formulación#
a. Agrega a la formulación matemática los componentes de un modelo de optimización de forma general que represente la nueva situación. Defina clara y rigurosamente:
Conjuntos
Parámetros
Variables de decisión
Restricciones
Naturaleza de las variables
Función objetivo
Implementación#
b. Resuelve el nuevo modelo planteado utilizando la librería de PuLP en Python. ¿Cuál es la solución óptima del problema?
Librerías#
Importa la librería pulp
para crear y resolver el modelo.
# Escriba aquí el código en python de su formulación.
Conjuntos#
Define los conjuntos M
y K
que representan las zonas y los tipos de carbón respectivamente.
Recuerda que por conveniencia de preservar el orden de los elementos de los conjuntos, no siempre deberás definirlos con el tipo set
.
# Zonas
M = list(range(1, 37))
# Tipos de carbón
K = ["Antracita", "Hulla", "Turba", "Lignito"]
Parámetros#
Define o importa los parámetros del modelo.
# Si en la zona i en M se puede extraer carbón tipo j en K
a = {
(1, "Hulla"): 1,
(2, "Hulla"): 1,
(3, "Turba"): 1,
(4, "Turba"): 1,
(5, "Hulla"): 1,
(6, "Turba"): 1,
(7, "Hulla"): 1,
(8, "Hulla"): 1,
(9, "Antracita"): 1,
(10, "Antracita"): 1,
(11, "Hulla"): 1,
(12, "Turba"): 1,
(13, "Antracita"): 1,
(14, "Turba"): 1,
(15, "Turba"): 1,
(16, "Hulla"): 1,
(17, "Hulla"): 1,
(18, "Turba"): 1,
(19, "Antracita"): 1,
(20, "Lignito"): 1,
(21, "Turba"): 1,
(22, "Antracita"): 1,
(23, "Antracita"): 1,
(24, "Antracita"): 1,
(25, "Antracita"): 1,
(26, "Turba"): 1,
(27, "Turba"): 1,
(28, "Lignito"): 1,
(29, "Lignito"): 1,
(30, "Lignito"): 1,
(31, "Hulla"): 1,
(32, "Turba"): 1,
(33, "Hulla"): 1,
(34, "Antracita"): 1,
(35, "Lignito"): 1,
(36, "Antracita"): 1,
}
for i in M:
for j in K:
if (i, j) not in a:
a[i, j] = 0
# Costo por tonelada de carbón en la zona i en M
c = {
1: 16,
2: 6,
3: 11,
4: 8,
5: 5,
6: 25,
7: 16,
8: 17,
9: 25,
10: 8,
11: 15,
12: 8,
13: 10,
14: 20,
15: 6,
16: 17,
17: 6,
18: 20,
19: 5,
20: 8,
21: 25,
22: 11,
23: 8,
24: 7,
25: 7,
26: 28,
27: 26,
28: 27,
29: 9,
30: 24,
31: 15,
32: 14,
33: 22,
34: 20,
35: 19,
36: 8,
}
# Máximas toneladas a extraer de la zona i en M
n = {
1: 189,
2: 196,
3: 143,
4: 136,
5: 106,
6: 151,
7: 170,
8: 129,
9: 184,
10: 122,
11: 146,
12: 190,
13: 160,
14: 109,
15: 133,
16: 198,
17: 138,
18: 107,
19: 117,
20: 150,
21: 171,
22: 103,
23: 157,
24: 143,
25: 170,
26: 130,
27: 140,
28: 126,
29: 180,
30: 153,
31: 108,
32: 132,
33: 105,
34: 145,
35: 145,
36: 114,
}
# Mínimo de toneladas a explotar del tipo de carbón j en K
b = {
"Antracita": 862,
"Hulla": 898,
"Turba": 562,
"Lignito": 742,
}
# Costo fijo de explotación de la zona i en M
q = {
1: 240,
2: 155,
3: 240,
4: 125,
5: 177,
6: 342,
7: 157,
8: 457,
9: 396,
10: 411,
11: 341,
12: 469,
13: 402,
14: 186,
15: 404,
16: 344,
17: 290,
18: 340,
19: 482,
20: 472,
21: 394,
22: 102,
23: 330,
24: 433,
25: 205,
26: 394,
27: 156,
28: 298,
29: 134,
30: 462,
31: 432,
32: 362,
33: 127,
34: 203,
35: 417,
36: 215,
}
Objeto del modelo#
Construye un problema al que luego agregarás las restricciones y la función objetivo.
# Escriba aquí el código en python de su formulación.
Variables de decisión#
Define las variables del problema de manera que estén contenidas en diccionarios indexados en los conjuntos de sus variables respectivas.
# Escriba aquí el código en python de su formulación.
Función objetivo#
Agrega al problema la función objetivo. Recuerda que al definir el problema, ya definiste si este es de maximización o minimización.
# Escriba aquí el código en python de su formulación.
Restricciones#
Agrega al problema las restricciones del modelo.
# Escriba aquí el código en python de su formulación.
Resolver el problema#
Invoca el optimizador. Este paso le asigna un valor a las variables incluidas en las restricciones o función objetivo del modelo.
# Escriba aquí el código en python de su formulación.
Imprimir resultados#
Antes de estudiar el óptimo del modelo, identifica en el estado del optimizador si pudo resolver el problema.
# Escriba aquí el código en python de su formulación.
Identifica también el valor de la función objetivo.
# Escriba aquí el código en python de su formulación.
Por último, imprime de manera estructurada el valor de las variables de decisión y otras expresiones de interés.
# Escriba aquí el código en python de su formulación.
Créditos#
Equipo Principios de Optimización
Autores: Alfaima Solano, Alejandro Mantilla
Desarrollo:Alfaima Solano, Alejandro Mantilla, Juan Felipe Rengifo
Última fecha de modificación: 08/04/2023