Método del Centro de gravedad utilizando R
Problema de localización de instalaciones
Cuando escribí el artículo método del centro de gravedad hice esta anotación: «Recuerdo que cuando utilicé este algoritmo en la Universidad, utilizamos la copia de un mapa de la región, sobre ella trazamos un plano cartesiano, definimos las ubicaciones del caso, registramos las coordenadas y como resultado obtuvimos las coordenadas de la localización ideal. La dificultad subyace en la falta de practicidad».
El objetivo de este artículo es precisamente ese, apoyarnos en las nuevas herramientas que nos proporciona la tecnología, para abordar un problema de localización de una instalación aplicando el algoritmo de centro de gravedad de una manera práctica. Para ello utilizaremos R, de hecho, utilizaremos las librerías de R en un cuaderno virtual de Python.
El resultado de nuestro código nos arrojará la localización, de acuerdo al sistema de coordenadas que empleemos, además de que graficará la misma, y los puntos ponderados del modelo (peso de acuerdo a su demanda, producción, capacidad, etc.).
Ejemplo de aplicación del Centro de gravedad
La empresa GASOL S.A desea ubicar una instalación intermedia que requiere de disponibilidad de gasolina, desea ubicar esta instalación entre la ciudad de Barrancabermeja y sus principales distribuidores. En el siguiente cuadro se relaciona la información acerca de las coordenadas y el aporte de galones de gasolina de cada distribuidor.
Ubicación de las puntos en el plano cartesiano:
Los cálculos empleados en el algoritmo manual pueden ser consultados en: Modelo de Centro de Gravedad.
Requerimientos para ejecutar el modelo
En este caso sugerimos utilizar un entorno virtual de programación. Recomendamos el uso de Colaboratory de Google, un entorno que cuenta con todas las herramientas necesarias para nuestros desarrollos en Python. No tendremos que instalar nada en nuestro equipo, y aprovecharemos la potencia de las máquinas de Google, y su capacidad para ejecutar R.
Programación del modelo de Centro de Gravedad en R
Vamos a asumir que utilizarán el entorno virtual de Colaboratory, así que vayamos allá: Abrir cuaderno nuevo.
Ya que este entorno está desarrollado para escribir y ejecutar códigos en Python, lo primero que debemos hacer es ejecutar el siguiente comando en nuestro cuaderno, para así poder utilizar R en nuestro entorno:
import rpy2
rpy2.__version__
import rpy2.robjects.conversion
%load_ext rpy2.ipython
Después de eso, cada vez que desee usar R, agregue %%R al comienzo de cada celda. Veamos.
Lo primero que crearemos será a función del cálculo del Centro de Gravedad, la matemática detrás de esto no es nada especial, se trata de un producto cruzado de matrices para cada coordenada, para lo que utilizaremos crossprod de R.
%%R
centro_gravedad <- function(x,y,w){
c(crossprod(x,w)/sum(w),crossprod(y,w)/sum(w))
}
x = Coordenada en x (Que puede ser una coordenada cartesiana, latitud, etc.)
y = Coordenada en y (Que puede ser una coordenada cartesiana, longitud, etc.)
w = Representa el peso de cada punto dado (Que puede ser la demanda, la capacidad, la producción)
En nuestro caso, x y y serán coordenadas cartesianas, y w será la capacidad de suministro de gasolina de cada distribuidor. La función anterior calculará el centro de gravedad de acuerdo a los datos de entrada del modelo.
Ahora crearemos el marco de datos (dataframe al cual llamaremos estaciones_df) en el que se consignarán nuestros datos de entrada:
%%R
estaciones_df <- as.data.frame(matrix(nrow=5,ncol=3))
encabezados(estaciones_df) <- c("x","y","galones")
estaciones_df$x <- c(58.7, 26.2, 32.9, 42.5, 36.4)
estaciones_df$y <- c(4.4, 5.2, 3.8, 4.1, 6.2)
estaciones_df$galones <- c(3800, 2700, 310, 420, 250)
El código anterior crea un marco de datos (matrix) de 5 filas y 3 columnas. Las filas representan el número de estaciones de gasolina que nos da el ejemplo, y las columnas servirán para consignar 3 valores: coordenada en x, coordenada en y y el suministro de gasolina en galones de cada estación.
Consignaremos los datos de entrada del ejemplo cuidando el orden estricto en el que registramos la información. Al finalizar tendremos toda la información consignada en nuestro marco de datos; para comprobarlo ejecutaremos el siguiente código:
%%R
(estaciones_df)
Al ejecutarlo, tendremos la siguiente salida:
Podemos corroborar que la información se ha consignado adecuadamente.
El siguiente paso consiste en calcular el centro de gravedad del modelo, para eso asignaremos los datos de entrada a la función inicial de centro de gravedad:
%%R
centro_gravedad(estaciones_df$x,estaciones_df$y,estaciones_df$galones)
Recordemos que de acuerdo a la función inicial, esta necesita 3 argumentos: x, y, w (coordenada en x, coordenada en y, peso). Esta información se encuentra en el marco de datos de entrada (estaciones_df).
Al ejecutarlo, tendremos la siguiente salida:
Esto quiere decir que en el sistema de coordenadas utilizado para establecer las ubicaciones propuestas en el ejercicio, la instalación óptima se ubicaría en las coordenadas X = 44,2 – Y = 4,7. podemos confirmar que son las mismas coordenadas obtenidas mediante el modelo matemático original de Centro de Gravedad.
Tanto el resultado obtenido, como las ubicaciones de entrada (estaciones) pueden graficarse para una mayor comprensión del modelo. Utilizaremos un gráfico utilizando la librería ggplot2 que nos muestre las instalaciones con un marcador de acuerdo a su ponderación. Veamos:
%%R
library(ggplot2)
grafico_df <- rbind(estaciones_df,c(centro_gravedad(estaciones_df$x,estaciones_df$y,estaciones_df$galones),2500))
grafico_df$tipo <- c(rep(x="distribuidores",times=5),"instalacion")
ggplot(data=grafico_df) + geom_point(mapping=aes(x=x,y=y,size=galones,color=tipo))
Al ejecutar tendremos el siguiente resultado:
El marcador azul representa la ubicación sugerida por el modelo, de acuerdo a la ubicación del suministro de acuerdo a las estaciones. Podemos ver como el tamaño de las estaciones varía de acuerdo a su capacidad de suministro. Esta forma de desarrollar el modelo de Centro de Gravedad puede complementarse con diversas fuentes de datos, mapas de calor, tipos de coordenadas, etc.
Puedes ver el cuaderno de este módulo en nuestro Colaboratory: Problema de localización de instalaciones mediante Centro de Gravedad.
Consideraciones finales
El alcance de este modelo se encuentra determinado por la localización de una sola instalación (depósito, almacén, etc.), y en los casos en los que se requiera determinar múltiples localizaciones, el modelo no aplica.
hola, no me funciona la programacion que pones de ejemplo
Hola, Adriana.
Sí, luego de una actualización de algunos paquetes necesarios se presentaba este error. Hemos actualizado el código y ahora debería funcionar perfectamente.