ALVIN BURHANI BLOGSITE  

My Shares, Knowledge, & Experiences

Pada postingan kali ini akan dibahas tentang masalah lokasi gudang. Mengingat sekumpulan pelanggan berada disebuah lokasi dan dilokasi tersebut akan dibangun gudang. Tugasnya adalah memutuskan dimana gudang tersebut akan dibangun, kemudian dari gudang tersebut akan disupply barang-barang yang harus dikirim ke pelanggan yang ada disekitarnya.

Sebagai contoh praktis adalah ketika menjalankan usaha supply distribusi barang,  dan logistik untuk LSM (Logistics Supply Management)  dan ingin mendistribusikan barang yang akan disupply secara teratur kepada orang yang membutuhkan, maka lokasi tersebut harus diidentifikasi dulu dimana akan dibangun gudang yang memungkinkan untuk menyiapkan hub distribusi tersebut. Namun jika tidak yakin di mana membuatnya, maka model seperti itu mungkin bisa membantu. Dalam prakteknya harus tetap dimasukkan aspek aspek yang menjadi pertimbangan lokasi tersebut.

Video berikut adalah bagaimana cara membuat simulasinya dengan menggunakan python dengan lokasi seperti gambar dibawah ini:

Dimulaii dengan sekelompok pelanggan C= { 1 … n } dan satu set gudang yang memungkinkan W= { 1 … m } untuk bisa dibangun. Selain itu, ada fungsi biaya yang memberikan info biaya transportasi dari gudang ke pelanggan. Selanjutnya ada biaya tetap yang terkait dengan masing-masing gudang jika akan dibangun.

Diasumsikan bahwa pelanggan berada di grid dengan jarak euclidian:

#data customer sebegai contoh

set.seed(1234)
grid_size <- 1000
n <- 100
customer_locations <- data.frame(
id = 1:n,
x = round(runif(n) * grid_size),
y = round(runif(n) * grid_size)
)
Lokasi Pelanggan dan rencana Gudang
#data lokasi gudang sebagai contoh dengan estimasi biaya

m <- 20
warehouse_locations <- data.frame(
id = 1:m,
x = round(runif(m) * grid_size),
y = round(runif(m) * grid_size)
)
fixedcost <- round(rnorm(m, mean = grid_size * 10, sd = grid_size * 5))

Gudang juga secara acak ditempatkan di grid. Biaya tetap untuk gudang juga dihasilkan secara acak dengan biaya rata-rata 10.000.

fixedcost

Biaya tetap untuk mendirikan gudang adalah sebagai berikut:

transportcost <- function(i, j) {
customer <- customer_locations[i, ]
warehouse <- warehouse_locations[j, ]
round(sqrt1)customer$x - warehouse$x)^2 + (customer$y - warehouse$y)^2
}
transportcost(1, 3)

Langkah selanjutnya adalah membangun fungsi yang membawa pelanggan dan gudang dan mengembalikan biaya transportasi.

library(ggplot2)
options(repr.plot.width = 14, repr.plot.height = 8)
p <- ggplot(customer_locations, aes(x, y)) + 
geom_point(size=3) + 
geom_point(data = warehouse_locations, color = "red", alpha = 0.5, size=4,shape = 17) +
scale_x_continuous(limits = c(0, grid_size)) +
scale_y_continuous(limits = c(0, grid_size)) +
theme(axis.title = element_blank(), 
axis.ticks = element_blank(), 
axis.text = element_blank(), panel.grid = element_blank())
p + ggtitle("Masalah Lokasi Gudang", 
"Titik hitam adalah contoh lokasi customer. Segitiga merah adalah calon lokasi gudang.")

Titik hitam adalah pelanggan dan titik merah adalah kemungkinan lokasi gudang.

library(ompr)
library(magrittr)
model <- MIPModel() %>%
# 1 iff i gets assigned to warehouse j
add_variable(x[i, j], i = 1:n, j = 1:m, type = "binary") %>%

# 1 iff warehouse j is built
add_variable(y[j], j = 1:m, type = "binary") %>%

# maximize the preferences
set_objective(sum_expr(transportcost(i, j) * x[i, j], i = 1:n, j = 1:m) + 
sum_expr(fixedcost[j] * y[j], j = 1:m), "min") %>%

# every customer needs to be assigned to a warehouse
add_constraint(sum_expr(x[i, j], j = 1:m) == 1, i = 1:n) %>% 

# if a customer is assigned to a warehouse, then this warehouse must be built
add_constraint(x[i,j] <= y[j], i = 1:n, j = 1:m)
model

Modelnya ompr kemudian terlihat seperti ini:

Mixed integer linear optimization problem
Variables:
  Continuous: 0 
  Integer: 0 
  Binary: 2020 
Model sense: minimize 
Constraints: 2100

Pecahkan modelnya dengan GLPK, dalam R tersedia paket aplikasi yang dapat menyeleasikan masalah linear programming (LP) seperti dalam rumus rumus riset operasional.

library(ompr.roi)
library(ROI.plugin.glpk)
result <- solve_model(model, with_ROI(solver = "glpk", verbose = TRUE))

nilai obyektif 33222.

GLPK Simplex Optimizer, v4.47
2100 rows, 2020 columns, 6000 non-zeros
      0: obj =  0.000000000e+000  infeas = 1.000e+002 (100)
*   101: obj =  5.223300000e+004  infeas = 0.000e+000 (100)
*   500: obj =  5.223300000e+004  infeas = 0.000e+000 (0)
*  1000: obj =  3.413000000e+004  infeas = 0.000e+000 (0)
*  1075: obj =  3.322200000e+004  infeas = 0.000e+000 (0)
OPTIMAL SOLUTION FOUND
GLPK Integer Optimizer, v4.47
2100 rows, 2020 columns, 6000 non-zeros
2020 integer variables, all of which are binary
Integer optimization begins...
+  1075: mip =     not found yet >=              -inf        (1; 0)
+  1075: >>>>>  3.322200000e+004 >=  3.322200000e+004   0.0% (1; 0)
+  1075: mip =  3.322200000e+004 >=     tree is empty   0.0% (0; 1)
INTEGER OPTIMAL SOLUTION FOUND

Langkah terakhir adalah menambahkan tugas ke plot sebelumnya yang kita buat.

suppressPackageStartupMessages(library(dplyr))
matching <- result %>% 
get_solution(x[i,j]) %>%
filter(value > .9) %>% 
select(i, j)
Penunjukan Gudang dan Biaya Optimal
plot_assignment <- matching %>% 
inner_join(customer_locations, by = c("i" = "id")) %>% 
inner_join(warehouse_locations, by = c("j" = "id"))
customer_count <- matching %>% group_by(j) %>% summarise(n = n()) %>% rename(id = j)
plot_warehouses <- warehouse_locations %>% 
mutate(costs = fixedcost) %>% 
inner_join(customer_count, by = "id") %>% 
filter(id %in% unique(matching$j))
p + 
geom_segment(data = plot_assignment, aes(x = x.y, y = y.y, xend = x.x, yend = y.x)) + 
geom_point(data = plot_warehouses, color = "green", size = 4, shape = 17) +
ggrepel::geom_label_repel(data = plot_warehouses, 
aes(label = paste0("fixed costs:", costs, "; customers: ", n)), 
size = 3, nudge_y = 20) + 
ggtitle(paste0("Grafik Biaya Optimal Lokasi Gudang dan Distribusi ke Customer"),
"Segitiga Hijau adalah lokasi gudang yang akan dibangun, Segitiga merah adalah lokasi gudang yang tidak jadi dibangun. 
Titik hitam adalah tempat customer yang nanti akan disupply dari gudang tersebut.")

Biaya tetap untuk menyiapkan 4 gudang adalah: 11285 $


sum(fixedcost[unique(matching$j)])

****** SELAMAT MENCOBA ******

References

1 customer$x - warehouse$x)^2 + (customer$y - warehouse$y)^2
One thought on “Logistics Supply Management”
  1. apakah ini sama seperti metode untuk menghitung transportasi di operasi riset? apakah bisa digunakan untuk menghitung biaya transportasi model LC (Least Cost) atau Biaya Minimum, atau menghitung solusi transportasi dengan metode VAM dan RAM. VAM adalah Vogel Aproximation Method, dan RAM adalag Russel Approximation Method. Mohon pencerahannya.

Leave a Reply

Your email address will not be published. Required fields are marked *