En una publicación anterior, demostré cómo se pueden asignar clientes al almacén más cercano utilizando un conocido algoritmo de agrupamiento . En esta publicación, demostraré cómo se puede abordar un problema de ubicación de un solo almacén aplicando el cálculo del centro de masa en R. La idea es ubicar el almacén justo en el centro de demanda promedio, teniendo en cuenta la distribución espacial de la demanda del cliente.
A continuación, defino la función de centro de masa. Tiene en cuenta las coordenadas x e y. Es decir, simplificamos el problema despreciando el eje z vertical de nuestro problema de ubicación espacial. w representa los pesos de las respectivas coordenadas. Esto podría ser, por ejemplo, la demanda por ubicación.
center_of_mass <- function(x,y,w){
c(crossprod(x,w)/sum(w),crossprod(y,w)/sum(w))
}
A continuación, creo un marco de datos que representa la demanda del cliente. Aplico coordenadas de latitud y longitud. El rango de valores de latitud es de -90 a +90. El rango de valores de longitud es de -180 a +180. Creo 40 clientes con ubicación y demanda aleatorias, en algún lugar dentro del sistema de coordenadas.
customer_df <- as.data.frame(matrix(nrow=40,ncol=3))
colnames(customer_df) <- c("lat","long","demand")
customer_df$lat <- runif(n=40,min=-90,max=90)
customer_df$long <- runif(n=40,min=-180,max=180)
customer_df$demand <- sample(x=1:100,size=40,replace=TRUE)
A continuación imprimo el encabezado de ese marco de datos:
head(customer_df)
## lat long demand
## 1 -46.40781 43.13533 4
## 2 -29.06806 98.97764 72
## 3 -75.84997 127.47619 44
## 4 -54.37377 55.16857 66
## 5 71.67371 178.98597 21
## 6 -34.03587 -42.88747 100
Usando ese conjunto de datos puedo calcular el centro de masa:
center_of_mass(customer_df$lat,customer_df$long,customer_df$demand)
## [1] -2.80068 12.49750
Para evaluar este resultado, tracé la demanda del cliente usando ggplot2:
library(ggplot2)
joint_df <- rbind(customer_df,c(center_of_mass(customer_df$lat,customer_df$long,customer_df$demand),50))
joint_df$type <- c(rep(x="customer",times=40),"warehouse")
ggplot(data=joint_df) + geom_point(mapping=aes(x=lat,y=long,size=demand,color=type))
El método del centro de masa se puede combinar bien con la visualización de mapas de calor de la distribución espacial de la demanda del cliente. Para esto, puedes leer mi entrada de blog sobre cómo crear mapas de calor en R, usando el paquete Leaflet: Leaflet heatmaps in R
También uso otros paquetes para visualizar la distribución espacial de la demanda del cliente, incluido deckgl: Uso de deckgl en R para la visualización de datos espaciales.
Ingeniero industrial especializado en optimización y simulación (R, Python, SQL, VBA)
Leave a Reply