広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

【備忘録】Rで最適化する(シンプルなパターン)

Rは実用では様々な分野で活用されていると思うのですが、こと参考書となると統計ベースのものが多いため、例えば以下のような単純な話の計算手法であっても記載が少ないものです。

例題)

あるテレビメーカーが2つのサイズで新商品を計画しているとする。

・19インチのメーカー希望小売価格:339ドル/台
・21インチのメーカー希望小売価格:399ドル/台
・19インチの生産コスト:195ドル/台+固定コスト400,000ドル
・21インチの生産コスト:225ドル/台+固定コスト400,000ドル
・19インチの製品が1台売れた時に市場で平均販売価格が下がる想定の金額:19インチは1セント、21インチは0.4セント
・21インチの製品が1台売れた時に市場で平均販売価格が下がる想定の金額:21インチは1セント、19インチは0.3セント

この時、これらの製品は夫々何台生産すべきか?

計算自体はとても簡単で、夫々の台数をx1、x2とおいて、極値を手計算すれば終わりですが、せっかくRをPCに入れているのであれば使いましょう、という話です。

変数

x1 = 19インチの販売台数(1年あたり)
x2 = 21インチの販売台数(1年あたり)
p = 19インチの販売価格(ドル)
q = 21インチの販売価格(ドル)
C = 製造コスト(ドル/年)
y = 製品販売による利益(販売収入 - 製造コスト)

として、Rのoptim/optimize関数を使って y を最大化する問題として解きます。

コード

f <- function(x){
  x1 <- x[1];
  x2 <- x[2];
  ps <- (339 - 0.01*x1 - 0.003*x2)*x1;
  qt <- (399 - 0.004*x1 - 0.01*x2)*x2;
  C <- (400000 + 195*x1 + 225*x2);
  y <- ps + qt - C;
  y
}
res <- optim(c(1,1),f,control = list(fnscale=-1))
print(res)

※初期値(c(1,1))は適当に入れています。
※デフォルトでは最小化なので引数として(control = list(fnscale=-1))を指定して最大化にしています。

結果

$par
[1] 4735.687 7042.825

$value
[1] 553641

$counts
function gradient 
     133       NA 

$convergence
[1] 0

$message
NULL

確認

> f(x=c(4735,7043))
[1] 553641
> f(x=c(4736,7043))
[1] 553641

19インチは 4725台、21インチは7043台で、販売収入は 553,641ドル ということになります。
手計算するよりはとても早いですね。

本当はグラフにして本当に極値で最大化しているのか? 1箇所なのか? 等々、
確認した方が良いのですが、取り急ぎ。

-----------------------

この問題は、以下の本から引用しました。
「数理モデリング入門 ~ファイブ・ステップ法」(2015,Mark M. Meerschaert,共立出版株式会社)
p21
第2章 多変量の最適化 2.1 制約なしの最適化
より

数理モデリング入門 ―ファイブ・ステップ法― 原著第4版

数理モデリング入門 ―ファイブ・ステップ法― 原著第4版

 

 -------------------

optim関数の使い方については、Rwikiが一番分かりやすかったです。