1

私は最適化が初めてで、単純なシナリオで実装する必要があります。

5 種類の乗用車/バンを生産できる自動車メーカーが存在します。生産できる各モデルには、必要な労働時間数と必要な鉄鋼のトン数、およびそのような車/バンを 1 台販売することで得られる利益が関連付けられています。製造業者は現在、一定量の鉄鋼と労働力を利用できます。これらは、総利益を最適化するように使用する必要があります。

これが私がこだわっている部分です - 各車には最低注文数もあります。企業は、そのモデルを生産/販売することが経済的に実行可能になる前に、各モデルを一定数製造する必要があります。optim()`lower = ...' 引数には最小注文数量のベクトルを指定できるため、最終条件がなければこれは簡単に に送信されますが、0 はオプションと見なされません。誰かが最小注文を考慮して、これを解決するのを手伝ってくれますか? 関連する情報/制約を整理した方法は次のとおりです。

Dorian <- data.frame(Model = c('SmCar', 'MdCar', 'LgCar', 'MdVan', 'LgVan'),
                   SteelReq = c(1.5,3,5,6,8), LabReq=c(30,25,40,45,55),
                   MinProd = c(1000,1000,1000,200,200),
                   Profit = c(2000,2500,3000,5500,7000))

Materials <- data.frame(Steel=6500,Labor=65000)

NetProfit<-function(x) {
  x[1]->SmCar
  x[2]->MdCar
  x[3]->LgCar
  x[4]->MdVan
  x[5]->LgVan
  np<-sum(Dorian$Profit*c(SmCar,MdCar,LgCar,MdVan,LgVan))
  np
}
LowerVec <- Dorian$MinProd #Or 0, how would I add this option?
UpperVec <- apply(rbind(Materials$Labor/Dorian$LabReq, 
                   Materials$Steel/Dorian$SteelReq),2,min)
# Attempt at using optim()
optim(c(0,0,0,0,0),NetProfit,lower=LowerVec, upper=UpperVec)

最終的には、確率変数を Profit や LabReq (必要な労働力) などのパラメーターの既知の分布に置き換え、これを関数にラップして、確率変数のパラメーターと同様に入力として使用できる Steel と Labor を取得したいと考えています。何度もシミュレートしてから、必要な利益と労働力の特定のパラメーターを指定して平均解を見つけたいと思うので、理想的には、シミュレーションを実行できるように、この最適化も高速になります。助けてくれてありがとう!

4

1 に答える 1

6

線形計画法に精通していない場合は、ここから始めてください:http: //en.wikipedia.org/wiki/Linear_programming

混合整数計画法に関する部分もご覧くださいhttp://en.wikipedia.org/wiki/Mixed_integer_programming#Integer_unknowns。その場合、解こうとしている変数はすべて連続ではなく、ブール値または整数も含まれます。


すべての面で、問題は整数を解こうとしている混合整数計画法(正確には整数計画法)です。つまり、各モデルで生産する車両の数です。

これらを解決するための既知のアルゴリズムがあり、ありがたいことに、それらはすでにRパッケージにラップされています。はその1つであり、その関数Rglpkを使用できるように問題を定式化する方法を示します。Rglpk_solve_LP


解く変数を考えてみましょうx1, x2, x3, x4, x5。各モデルで生産する車両の数です。

あなたの目的は:

Profit = 2000 x1 + 2500 x2 + 3000 x3 + 5500 x4 + 7000 x5

鋼の制約は次のとおりです。

1.5 x1 + 3 x2 + 5, x3 + 6 x4 + 8 x5 <= 6500

あなたの労働制約は次のとおりです。

30 x1 + 25 x2 + 40 x3 + 45 x4 + 55 x5 <= 65000

ここで難しい部分があります。最小の生産要件をモデル化することです。最初のものを例として取り上げましょう。の最小生産要件でx1は、少なくとも1000台の車両を生産する(x1 >= 1000)か、車両をまったく生産しない()必要がありx1 = 0ます。その要件をモデル化するために、ブール変数を導入しますz1。ブール値とは、z12つの値しかとることができないことを意味します:0または1。要件は次のようにモデル化できます。

1000 z1 <= x1 <= 9999999 z1

なぜこれが機能するのですか?次の2つの可能な値を検討してくださいz1

  1. の場合z1 = 0x1強制されます0
  2. その場合z1 = 1、 (最小生産要件)x1より1000大きく、任意の大きな数として選択した9999999よりも小さくする必要があります。

モデルごとにこれを繰り返すと、同様のブール変数(z2, z3, z4, z5)を導入する必要があります。最終的に、ソルバーはを解くだけでなくx1, x2, x3, x4, x5、も解きz1, z2, z3, z4, z5ます。


これらすべてを実践するために、ここに問題を解決するためのコードがあります。ベクトルを解きますx = (x1, x2, x3, x4, x5, z1, z2, z3, z4, z5)

library(Rglpk)

num.models <- nrow(Dorian)

# only x1, x2, x3, x4, x5 contribute to the total profit
objective  <- c(Dorian$Profit, rep(0, num.models))

constraints.mat <- rbind(
    c(Dorian$SteelReq, rep(0, num.models)),                    # total steel used
    c(Dorian$LabReq,   rep(0, num.models)),                    # total labor used
    cbind(-diag(num.models), +diag(Dorian$MinProd)),           # MinProd_i * z_i
    cbind(+diag(num.models), -diag(rep(9999999, num.models)))) # x_i - 9999999 x_i

constraints.dir <- c("<=",
                     "<=",
                     rep("<=", num.models),
                     rep("<=", num.models))

constraints.rhs <- c(Materials$Steel,
                     Materials$Labor,
                     rep(0, num.models),
                     rep(0, num.models))

var.types <- c(rep("I", num.models),  # x1, x2, x3, x4, x5 are integers
               rep("B", num.models))  # z1, z2, z3, z4, z5 are booleans

Rglpk_solve_LP(obj   = objective,
               mat   = constraints.mat,
               dir   = constraints.dir,
               rhs   = constraints.rhs,
               types = var.types,
               max   = TRUE)

# $optimum
# [1] 6408000
#
# $solution
# [1] 1000    0    0  202  471    1    0    0    1    1
#
# $status
# [1] 0

したがって、最適なソリューションは、それぞれのモデルの(1000、0、0、202、471)車両を作成し、合計で6,408,000の利益を得ることです。

于 2012-09-20T01:54:15.507 に答える