Código R para construir una matriz de costos para problemas de ubicación de almacén discretos

La investigación de operaciones proporciona una variedad de algoritmos para determinar las soluciones óptimas exactas para los problemas de ubicación de los almacenes. Sin embargo, estos algoritmos requieren una matriz de costos, especificando el costo de abastecimiento del cliente i desde el almacén j, para cada cliente y cada almacén.

A continuación, propongo un algoritmo para especificar esta matriz de costos de manera que se puedan aplicar estos algoritmos. El cálculo se basa en distancias euclidianas como medida de costo, es decir, asume costos variables escalados linealmente basados ​​en distancias euclidianas.

# una función para calcular distancias euclidianas, basada en dos vectores numéricos como entrada
euclidean_distance <- function(df1,df2){
  sqrt((df1[,1]-df2[,1])**2+(df1[,2]-df2[,2])**2)
}

# parámetros: df con coordenadas de almacén, df con coordenadas de clientes
cost_matrix <- function(warehouses,customers){
  matrix <- as.data.frame(matrix(nrow=nrow(customers),ncol=nrow(warehouses)))
  # applying euclidean distances
  for(i in 1:nrow(customers)){
    df <- as.data.frame(matrix(nrow=nrow(warehouses),ncol=2))
    df[,1] <- as.numeric(rep(customers[i,1],times=nrow(df)))
    df[,2] <- as.numeric(rep(customers[i,2],times=nrow(df)))
    matrix[i,] <- euclidean_distance(df,warehouses)
  }
  # matriz de costo de retorno
  matrix
}

Realizo una prueba simple en el fragmento de código a continuación e imprimo la matriz de costos en la parte inferior.

# ubicaciones de almacenes candidatos discretos, por latitud y longitud
warehouse_df <- as.data.frame(matrix(nrow=3,ncol=2))
colnames(warehouse_df)<-c("lat","long")
warehouse_df$lat <- runif(n=3,min=-90,max=90)
warehouse_df$long <- runif(n=3,min=-180,max=180)
head(warehouse_df)
##         lat       long
## 1 -44.17554  102.08728
## 2 -58.51864 -160.25027
## 3 -56.54944  -11.30273
# ubicaciones de clientes
customers_df <- as.data.frame(matrix(nrow=4,ncol=2))
colnames(customers_df)<-c("lat","long")
customers_df$lat <- runif(n=4,min=-90,max=90)
customers_df$long <- runif(n=4,min=-180,max=180)
head(customers_df)
##         lat      long
## 1 -15.70044  171.1968
## 2 -87.68773 -156.7455
## 3 -62.35740  117.7821
## 4 -85.57747 -102.7820
# prueba de función de matriz de costos
cost_matrix(warehouse_df,customers_df)
##          V1        V2       V3
## 1  74.74596 334.20139 187.0153
## 2 262.46471  29.37890 148.7387
## 3  24.01888 278.05884 129.2154
## 4 209.01088  63.51993  95.9744

En algunas de mis otras publicaciones, puede encontrar ejemplos sobre cómo ubicar almacenes en el centro de masa (cálculo del centro de masa en R) y cómo asignar clientes al almacén más cercano (problema de asignación de clientes). También proporcioné un ejemplo sobre cómo agrupar a los clientes en grupos, en función de su proximidad espacial (agrupación de clientes de proximidad espacial en R).

Por último, también he escrito una publicación sobre cómo ubicar varios almacenes en cada centro de masa (ubicar varios almacenes en el centro de masa).

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.