창고 할당 문제 : 고객을 가장 가까운 창고에 할당 (R 사용)

이 게시물에서는 용량이 무제한 인 고정 창고 세트를 고려하여 고객 그룹을 각각 하나의 창고에 할당 할 수있는 방법에 대한 코딩 예제를 제공합니다. 기본 가정은 고정 비용이 없으며 비용은 고객과 창고 사이의 유클리드 거리에만 의존한다는 것입니다. 또한이 문제에서는 리드 타임 요구 사항이나 기타 서비스 수준 관련 제약이 고려되지 않습니다. 알고리즘은 매우 간단하며 클러스터링 알고리즘 중 하나를 상기시킵니다. 모든 고객을 반복하고 유클리드 거리와 위도-경도 시스템을 고려하여 각 고객을 가장 가까운 창고에 할당합니다. 아래에서이 알고리즘을 함수로 정의합니다.

# 유클리드 거리를 계산하는 함수
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의 각 질량 중심에서 여러 창고를 찾는 데 사용됩니다.

Leave a Reply

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

Close

메타