商品運送最小成本計算
場景:
有三地配銷商 (M1, M2, M3),要運送商品至三個地點 (P1, P2, P3):
配銷商 M1 最大供給量為 60。
配銷商 M2 最大供給量為 85。
配銷商 M3 最大供給量為 55。
地點 P1 最大需求量為 50。
地點 P2 最大需求量為 80。
地點 P3 最大需求量為 70。
配銷商 M1 運送商品至 地點 P1 成本為 14。
配銷商 M2 運送商品至 地點 P1 成本為 15。
配銷商 M3 運送商品至 地點 P1 成本為 12。
配銷商 M1 運送商品至 地點 P2 成本為 16。
配銷商 M2 運送商品至 地點 P2 成本為 18。
配銷商 M3 運送商品至 地點 P2 成本為 19。
配銷商 M1 運送商品至 地點 P3 成本為 16。
配銷商 M2 運送商品至 地點 P3 成本為 20。
配銷商 M3 運送商品至 地點 P3 成本為 12。
問題:
求算滿足三地供給量下最少成本。
求算配銷商運送商品數量組合。
解答輸出:
最小成本 = 3030 配銷商(1) 地點(2)=60 配銷商(2) 地點(1)=50 地點(2)=20 地點(3)=15 配銷商(3) 地點(3)=55
GNU-R:
library(lpSolveAPI) # 限制條件數目, 效益變數數目 lprec <- make.lp(0, 9) # 求最大值 lp.control(lprec, sense='min') # 目標係數 set.objfn(lprec, c(14, 16, 19, 15, 18, 20, 12, 17, 12)) # 資源限制條件 add.constraint(lprec, c(1, 1, 1, 0, 0, 0, 0, 0, 0), "<=", 60) add.constraint(lprec, c(0, 0, 0, 1, 1, 1, 0, 0, 0), "<=", 85) add.constraint(lprec, c(0, 0, 0, 0, 0, 0, 1, 1, 1), "<=", 55) add.constraint(lprec, c(1, 0, 0, 1, 0, 0, 1, 0, 0), ">=", 50) add.constraint(lprec, c(0, 1, 0, 0, 1, 0, 0, 1, 0), ">=", 80) add.constraint(lprec, c(0, 0, 1, 0, 0, 1, 0, 0, 1), ">=", 70) lprec # 變數為正整數 set.bounds(lprec, lower = c(0,0,0, 0,0,0, 0,0,0), columns = seq(1:9)) set.type(lprec, seq(1:9), "integer") # 解算 solve(lprec) # 輸出線性規劃表格 lprec # 解答 Ans.Optimization <- get.objective(lprec) Ans.Varibles <- get.variables(lprec) # 輸出最大值 print(sprintf("最小成本=%d", Ans.Optimization)) # 輸出最大值下作業組合 for (i in seq(1:3)) { # 輸出緩衝區 output <- c(sprintf("配銷商(%d)", i)) # 是否存在解 found <- 0 for (j in seq(1:3)) { k <- (i-1)*3 + j if (Ans.Varibles[k] > 0) { output <- c(output, sprintf(" 地點(%d)=%.0f", j, Ans.Varibles[k])) found <- 1 } } # 若有解,則輸出 if (found == 1) { for (n in seq(1:length(output))) { print(output[n]) } } }