Importar parámetros web#
Librería#
Para empezar, la guía se realizará en base al problema de Family Knapsack que se introdujo como ejemplo en la guía Matemáticas en MS Office. El primer paso es importar las librerías pandas y requests con las siguientes líneas de código:
import pandas as pd
import requests as rq
Motivación#
Resulta conveniente publicar los datos de los que depende la ejecución de nuestro código como contenido web de acceso remoto. De esta forma podemos estar seguros de que la ejecución del código será consistente entre usuarios y nos permite desempeñar control de versionamiento sobre los datos, no solo el código.
Tablas en HTML#
Lo siguiente es importar la tablas en formato HTML donde se encuentran los parámetros del problema de optimización a resolver. En este caso, podemos ver las tablas en el siguiente enlace. El contenido de la página, según su código HTML, lo solicitamos con la función get().content y lo guardamos en la variable HTML.
url = 'https://copa-uniandes.github.io/Family-Knapsack-Model-Parameters-Web/'
html = rq.get(url).content
Ahora que tenemos el código de la página, le pedimos a pandas que haga una lectura e identifique las posibles tablas embemidas en la página con la función pd.read_html().
df_list = pd.read_html(html)
La variable df_list contiene una lista de todas las tablas en el documento HTML. Extraemos cada tabla de la lista y la guardamos en sus respectivas variables. Note que estas tablas son data frames de pandas.
preferencia_df = df_list[0]
peso_df = df_list[1]
capacidad_df = df_list[2]
preferencia_df
Preferencia | Papá | Mamá | Hijo | Hija | |
---|---|---|---|---|---|
0 | Botella de agua | 8 | 2 | 11 | 8 |
1 | Carpa | 2 | 9 | 5 | 4 |
2 | Lata de atún | 6 | 12 | 7 | 3 |
3 | Botiquín | 12 | 4 | 6 | 12 |
4 | Protector solar | 11 | 1 | 12 | 7 |
5 | Lata de salchichas | 7 | 10 | 10 | 6 |
6 | Bolsa de dormir | 3 | 7 | 3 | 10 |
7 | Linterna | 10 | 8 | 2 | 2 |
8 | Repelente | 9 | 3 | 9 | 9 |
9 | Brújula | 5 | 5 | 1 | 1 |
10 | Cobija | 4 | 11 | 4 | 11 |
11 | Balón | 1 | 6 | 8 | 5 |
peso_df
Objeto | Peso | |
---|---|---|
0 | Botella de agua | 2 |
1 | Carpa | 8 |
2 | Lata de atún | 2 |
3 | Botiquín | 2 |
4 | Protector solar | 1 |
5 | Lata de salchichas | 2 |
6 | Bolsa de dormir | 4 |
7 | Linterna | 3 |
8 | Repelente | 2 |
9 | Brújula | 1 |
10 | Cobija | 6 |
11 | Balón | 3 |
capacidad_df
Excursionista | Capacidad | |
---|---|---|
0 | Papá | 12 |
1 | Mamá | 12 |
2 | Hijo | 6 |
3 | Hija | 6 |
Parámetros#
Con lo anterior, se procede a guardar los parámetros en diccionarios. Para cada parámetro se debe seguir el siguiente procedimiento:
Crear el diccionario donde se guardará su información.
Realizar uno o dos recorridos para pasar por los valores de cada uno de los índices del parámetro.
Dentro del recorrido se guarda el valor del índice en el diccionario donde los índices serán las llaves.
Dado el índice, se le asigna un valor dentro del diccionario.
En la primera tabla se encuentra el parámetro \(q_{i,j}\) que hace referencia a la preferencia de cada integrante de la familia por cada uno de los objetos.
Como este parámetro esta indexado en el conjunto de integrantes y en el conjunto de objetos, debemos realizar un doble recorrido.
q = {(preferencia_df["Preferencia"][i], j): preferencia_df[j][i]
for i in range(len(preferencia_df["Preferencia"]))
for j in preferencia_df.columns[1:] }
q
{('Botella de agua', 'Papá'): 8,
('Botella de agua', 'Mamá'): 2,
('Botella de agua', 'Hijo'): 11,
('Botella de agua', 'Hija'): 8,
('Carpa', 'Papá'): 2,
('Carpa', 'Mamá'): 9,
('Carpa', 'Hijo'): 5,
('Carpa', 'Hija'): 4,
('Lata de atún', 'Papá'): 6,
('Lata de atún', 'Mamá'): 12,
('Lata de atún', 'Hijo'): 7,
('Lata de atún', 'Hija'): 3,
('Botiquín', 'Papá'): 12,
('Botiquín', 'Mamá'): 4,
('Botiquín', 'Hijo'): 6,
('Botiquín', 'Hija'): 12,
('Protector solar', 'Papá'): 11,
('Protector solar', 'Mamá'): 1,
('Protector solar', 'Hijo'): 12,
('Protector solar', 'Hija'): 7,
('Lata de salchichas', 'Papá'): 7,
('Lata de salchichas', 'Mamá'): 10,
('Lata de salchichas', 'Hijo'): 10,
('Lata de salchichas', 'Hija'): 6,
('Bolsa de dormir', 'Papá'): 3,
('Bolsa de dormir', 'Mamá'): 7,
('Bolsa de dormir', 'Hijo'): 3,
('Bolsa de dormir', 'Hija'): 10,
('Linterna', 'Papá'): 10,
('Linterna', 'Mamá'): 8,
('Linterna', 'Hijo'): 2,
('Linterna', 'Hija'): 2,
('Repelente', 'Papá'): 9,
('Repelente', 'Mamá'): 3,
('Repelente', 'Hijo'): 9,
('Repelente', 'Hija'): 9,
('Brújula', 'Papá'): 5,
('Brújula', 'Mamá'): 5,
('Brújula', 'Hijo'): 1,
('Brújula', 'Hija'): 1,
('Cobija', 'Papá'): 4,
('Cobija', 'Mamá'): 11,
('Cobija', 'Hijo'): 4,
('Cobija', 'Hija'): 11,
('Balón', 'Papá'): 1,
('Balón', 'Mamá'): 6,
('Balón', 'Hijo'): 8,
('Balón', 'Hija'): 5}
Realizamos el mismo procedimiento para las otras dos tablas (\(p_i\) y \(b_j\)).
p = {peso_df["Objeto"][i]: peso_df["Peso"][i]
for i in range(len(peso_df["Objeto"]))}
p
{'Botella de agua': 2,
'Carpa': 8,
'Lata de atún': 2,
'Botiquín': 2,
'Protector solar': 1,
'Lata de salchichas': 2,
'Bolsa de dormir': 4,
'Linterna': 3,
'Repelente': 2,
'Brújula': 1,
'Cobija': 6,
'Balón': 3}
b = {capacidad_df["Excursionista"][j]: capacidad_df["Capacidad"][j]
for j in range(len(capacidad_df["Excursionista"]))}
b
{'Papá': 12, 'Mamá': 12, 'Hijo': 6, 'Hija': 6}
Conjuntos#
Finalmente, se construyen los conjuntos a partir de las llaves de los diccionarios que ya se crearon para los parámetros. Como el parametro \(p_i\) esta indexado en el conjunto de objetos, éste tiene como llaves a todos los objetos. Por lo tanto, el conjunto de objetos, que se declarará como una lista, se construye con la siguiente línea de código:
O = list(p.keys())
# Se imprime la lista para verificar que se haya construido correctamente el conjunto
O
['Botella de agua',
'Carpa',
'Lata de atún',
'Botiquín',
'Protector solar',
'Lata de salchichas',
'Bolsa de dormir',
'Linterna',
'Repelente',
'Brújula',
'Cobija',
'Balón']
Lo mismo para construir el conjunto de excursionistas, pero en este caso a partir del parametro \(b_j\) ya que este está indexado en el conjunto deseado.
E = list(b.keys())
# Se imprime la lista para verificar que se haya construido correctamente el conjunto
E
['Papá', 'Mamá', 'Hijo', 'Hija']
Siguiente paso#
Con los parámetros importados y los conjuntos construidos se puede proceder a la implementación y solución del problema de optimización.
Créditos#
Equipo de Optimización
Desarrollo: Alejandro Mantilla
Fecha: 25/04/2021