商品運送最小成本計算

場景

  • 有三地配銷商 (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

問題

    1. 求算滿足三地供給量下最少成本。

    2. 求算配銷商運送商品數量組合。

解答輸出

最小成本 = 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]) } } }