运筹学研究提供了一系列算法,用于确定离散仓库位置问题的精确最优解。然而,这些算法需要一个成本矩阵,指定从仓库j向客户i供货的成本,对于每个客户和每个仓库来说。
下面,我提出了一种指定这个成本矩阵的算法,这样就可以应用这些算法。计算是基于欧氏距离作为成本度量,即假设基于欧氏距离的线性缩放可变成本。
# 一个计算欧氏距离的函数,基于两个数字向量作为输入。
euclidean_distance <- function(df1,df2){
sqrt((df1[,1]-df2[,1])**2+(df1[,2]-df2[,2])**2)
}
# 参数:df为仓库坐标,df为客户坐标。
cost_matrix <- function(warehouses,customers){
matrix <- as.data.frame(matrix(nrow=nrow(customers),ncol=nrow(warehouses)))
# 应用欧氏距离
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)
}
# 返回成本矩阵
matrix
}
我在下面的代码片段中进行简单的测试,并在底部打印成本矩阵。
# 按经度和纬度分列的候选仓库地点;
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
# 客户地点
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
#测试成本矩阵函数
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
在我的一些其他文章中,你可以找到如何在质量中心定位仓库(R中的质量中心计算)以及如何将客户分配到最近的仓库(客户分配问题)的例子。我还提供了一个例子,说明如何根据客户的空间接近度,将客户聚成一组(R中的空间接近度客户分组)。
最后,我还写了一篇关于如何在每个仓库的质量中心定位多个仓库的文章(定位多个仓库的质量中心)。
专业领域为优化和仿真的工业工程师(R,Python,SQL,VBA)
Leave a Reply