Extracción minera#

Tags: Parámetro binario, Mezcla, Recurso

Hide 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).

\[\begin{split} \bbox[5px, border:2px solid black]{ \begin{array} {cccccc} \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{\ 1\ } & \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{\ 2\ } & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{\ 3\ } & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{\ 4\ } & \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{\ 5\ } & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{\ 6\ } \\ \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{\ 7\ } & \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{\ 8\ } & \bbox[Plum, 5px, border:2px solid Plum]{\ 9\ } & \bbox[Plum, 5px, border:2px solid Plum]{10} & \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{11} & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{12} \\ \bbox[Plum, 5px, border:2px solid Plum]{13} & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{14} & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{15} & \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{16} & \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{17} & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{18} \\ \bbox[Plum, 5px, border:2px solid Plum]{19} & \bbox[LightGoldenRodYellow, 5px, border:2px solid LightGoldenRodYellow]{20} & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{21} & \bbox[Plum, 5px, border:2px solid Plum]{22} & \bbox[Plum, 5px, border:2px solid Plum]{23} & \bbox[Plum, 5px, border:2px solid Plum]{24} \\ \bbox[Plum, 5px, border:2px solid Plum]{25} & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{26} & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{27} & \bbox[LightGoldenRodYellow, 5px, border:2px solid LightGoldenRodYellow]{28} & \bbox[LightGoldenRodYellow, 5px, border:2px solid LightGoldenRodYellow]{29} & \bbox[LightGoldenRodYellow, 5px, border:2px solid LightGoldenRodYellow]{30} \\ \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{31} & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{32} & \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{33} & \bbox[Plum, 5px, border:2px solid Plum]{34} & \bbox[LightGoldenRodYellow, 5px, border:2px solid LightGoldenRodYellow]{35} & \bbox[Plum, 5px, border:2px solid Plum]{36} \\ \end{array} } \end{split}\]
\[ \bbox[5px, border:2px solid black]{ \begin{array} {cccc} \bbox[Plum, 5px, border:2px solid Plum]{\ \text{1: Antracita}\ } & \bbox[SkyBlue, 5px, border:2px solid SkyBlue]{\ \text{2: Hulla}\ } & \bbox[PaleGreen, 5px, border:2px solid PaleGreen]{\ \text{3: Turba}\ } & \bbox[LightGoldenRodYellow, 5px, border:2px solid LightGoldenRodYellow]{\ \text{4: Lignito}\ } \end{array} } \]

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