統計與計量‎ > ‎應用總覽‎ > ‎

商品運送最小成本計算

場景

  • 有三地配銷商 (M1, M2, M3),要運送商品至三個地點 (P1, P2, P3):
    • 配銷商 M1 最大供給量為 60。
    • 配銷商 M2 最大供給量為 85。
    • 配銷商 M3 最大供給量為 55。
    • 地點 P1 最大需求量為 50。
    • 地點 P最大需求量為 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])
    }
  }
}
ċ
LP-04.R
(1k)
李智,
2013年6月16日 下午10:26