이 게시물에서는 용량이 무제한 인 고정 창고 세트를 고려하여 고객 그룹을 각각 하나의 창고에 할당 할 수있는 방법에 대한 코딩 예제를 제공합니다. 기본 가정은 고정 비용이 없으며 비용은 고객과 창고 사이의 유클리드 거리에만 의존한다는 것입니다. 또한이 문제에서는 리드 타임 요구 사항이나 기타 서비스 수준 관련 제약이 고려되지 않습니다. 알고리즘은 매우 간단하며 클러스터링 알고리즘 중 하나를 상기시킵니다. 모든 고객을 반복하고 유클리드 거리와 위도-경도 시스템을 고려하여 각 고객을 가장 가까운 창고에 할당합니다. 아래에서이 알고리즘을 함수로 정의합니다.
# 유클리드 거리를 계산하는 함수
euclidean_distance <- function(vc,df){
sqrt((as.numeric(rep(vc[1],times=nrow(df)))-df[,1])^2+(as.numeric(rep(vc[2],times=nrow(df)))-df[,2])^2)
}
# 고객을 창고에 할당하는 기능
assignment_algorithm <- function(customers,warehouses){
return_df <- as.data.frame(matrix(nrow=nrow(customers),ncol=3))
colnames(return_df)<-c("lat","long","warehouses")
for(i in 1:nrow(customers)){
return_df[i,] <- c(customers[i,1],customers[i,2],which.min(euclidean_distance(customers[i,],warehouses)))
}
return_df
}
테스트를 위해 먼저 고객과 창고를 무작위로 배치하여 두 세트를 빌드합니다.
customer_df <- as.data.frame(matrix(nrow=1000,ncol=2))
colnames(customer_df) <- c("lat","long")
warehouse_df <- as.data.frame(matrix(nrow=4,ncol=2))
colnames(warehouse_df) <- c("lat","long")
customer_df[,c(1,2)] <- cbind(runif(n=1000,min=-90,max=90),runif(n=1000,min=-180,max=180))
warehouse_df[,c(1,2)] <- cbind(runif(n=4,min=-90,max=90),runif(n=4,min=-180,max=180))
고객 위치 데이터 프레임의 헤더 아래 :
head(customer_df)
## lat long
## 1 -35.42042 -33.68156
## 2 -50.63025 -64.52526
## 3 43.71663 -36.22302
## 4 -53.30511 135.56315
## 5 -46.32125 84.83210
## 6 83.85849 -60.70374
경기장 위치 데이터 프레임의 헤더 아래 :
head(warehouse_df)
## lat long
## 1 -41.007642 118.5673
## 2 81.968627 116.1495
## 3 11.971601 103.5034
## 4 -6.619224 -103.6206
이제 고객을 창고에 지정합니다.
# 기능 적용
results_df <- assignment_algorithm(customer_df,warehouse_df)
# 결과의 헤더 표시
head(results_df)
## lat long warehouses
## 1 -35.42042 -33.68156 4
## 2 -50.63025 -64.52526 4
## 3 43.71663 -36.22302 4
## 4 -53.30511 135.56315 1
## 5 -46.32125 84.83210 1
## 6 83.85849 -60.70374 4
또한 ggplot2에서 결과를 시각화합니다.
library(ggplot2)
ggplot(data = results_df) +
geom_point(mapping = aes(x=lat,y=long,color=as.character(warehouses))) +
scale_color_manual(values=c("darkblue","darkgreen","darkred","yellow")) +
xlim(-90,90) + ylim(-180,180)
창고 위치는 다음과 같습니다.
ggplot(data = warehouse_df) + geom_point(mapping = aes(x=lat,y=long)) + xlim(-90,90) + ylim(-180,180)
다른 포스트에서는 질량 중심에서 창고를 찾는 방법을 보여줍니다. 고객 수요의 중심에있는 I : 단일 창고 문제 – 질량 중심에서 창고 찾기 (R에서 질량 중심 계산) 또한 공간적 근접성을 기반으로 고객 그룹을 여러 개의 작은 클러스터로 나누는 방법에 대한 게시물을 작성했습니다. 이 접근 방식은 예를 들어 R의 각 질량 중심에서 여러 창고를 찾는 데 사용됩니다.
최적화 및 시뮬레이션을 전문으로하는 산업 엔지니어 (R, Python, SQL, VBA)
Leave a Reply