Localizando o armazém no centro de massa

Em uma postagem anterior, demonstrei como atribuir clientes ao armazém mais próximo usando um algoritmo de agrupamento bem conhecido . Neste post vou demonstrar como um único problema de localização de armazém pode ser abordado aplicando o cálculo do centro de massa em R. A ideia é localizar o armazém bem no centro médio de demanda, levando em conta a distribuição espacial da demanda do cliente.

Abaixo, defino a função de centro de massa. Leva em consideração as coordenadas x e y. Ou seja, simplificamos o problema negligenciando o eixo z vertical do nosso problema de localização espacial. w representa os pesos das respectivas coordenadas. Isso pode ser, por exemplo, a demanda por localização.

center_of_mass <- function(x,y,w){
  c(crossprod(x,w)/sum(w),crossprod(y,w)/sum(w))
}

Em seguida, crio um dataframe representando a demanda do cliente. Eu aplico coordenadas de latitude e longitude. A faixa de valores de latitude é de -90 a +90. A faixa de valores de longitude é de -180 a +180. Eu crio 40 clientes com localização e demanda aleatórias, em algum lugar dentro do 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)

Abaixo imprimo o cabeçalho desse dataframe:

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 esse conjunto de dados, posso calcular o centro de massa:

center_of_mass(customer_df$lat,customer_df$long,customer_df$demand)
## [1] -2.80068 12.49750

Para avaliar esse resultado, ploto a demanda do 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))

O método do centro de massa pode ser bem combinado com a visualização do mapa de calor da distribuição espacial da demanda do cliente. Para isso, você pode ler meu post no blog sobre como criar mapas de calor em R, usando o pacote Leaflet: Leaflet heatmaps in R

Eu também uso outros pacotes para visualizar a distribuição espacial da demanda do cliente, incluindo deckgl: Usando deckgl em R para visualização de dados espaciais.

Leave a Reply

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Close

Meta