問題解決の数理

放送大学教養学部 主任講師:大西 仁

Rについて

Rはオープンソースの統計解析ソフトウェアで,Windows, Mac OS, Linuxなど様々なプラットフォーム上で使用できる.また多くの研究者が開発に参加しており,新しい手法や機能が加えられている.また,Rに関する書籍やWebサイトも充実している.

Rは統計解析ソフトウェアとされているが,一般のプログラミング言語としても使うことができる.行列演算,各種乱数の発生,複素数演算が可能なので,数値計算やシミュレーションまた,グラフィック機能も充実している.印刷教材の例題や演習問題の計算,作図は主にRにより行った.

Rのインストール

R本体のインストール

R本体のインストールは,Windows や Mac OSX なら最新版をダウンロードして,ダブルクリックするだけでインストールできる.日本でインストールする場合は,本家CRANではなく,日本のミラーサイト(統計数理研究所)からダウンロードしてインストールすること.日本以外でインストールする場合は,適当なCRANのミラーサイトからインストールすること.

このページのトップへ

パッケージのインストール

Rはパッケージをインストールすることにより機能を追加することができる.例えば,線形最適化法のソルバーとしては,lpSolve パッケージがある.

lpSolve パッケージのインストールは次のコマンドでできる.

> options(repos="http://cran.ism.ac.jp/")
> install.packages("lpSolve", dep=T)

1行目ではダウンロードするミラーサイトを指定している.2行目の"dep=T"はパッケージ間の依存関係を考慮するというオプションで,lpSolveの場合は不要であるが,パッケージによっては,そのパッケージを使用する際に使用する別のパッケージが存在することもある.そのようなパッケージをインストールする時に"dep=T"が指定されていれば,必要なパッケージを自動的にインストールしてくれる.

なお,Windows版のRであれば,「パッケージ」メニューから「パッケージのインストール」を選択すれば対話的にパッケージのインストールができる.


このページのトップへ

lpSolveパッケージのインストールができていれば,

> library(lpSolve)
でlpSolveパッケージを使用できる.library(lpSolve) は Rを起動するたびに行う必要がある.
このページのトップへ

lpSolveパッケージによる線形最適化法

lpSolveパッケージは,混合整数最適化法のソルバーlp_solveのRインタフェースである.混合整数最適化法とは,目的関数と制約が線形式からなり,実数変数と整数変数が混在する数理最適化法であり,整数最適化法と線形最適化法を包含する.次の線形最適化問題を解く.
最大化z = x1 + 2x2
制約条件x1 + 3x2 ≤ 24
4x1 + 4x2 ≤ 48
2x1 + x2 ≤ 22
x1 ≥ 0
x2 ≥ 0
このページのトップへ

> library(lpSolve) # ライブラリの読み込み
> f.obj <- c(1, 2) # 目的関数の係数
> f.con <- matrix (c(1, 3, 4, 4, 2, 1), ncol=2, byrow=TRUE) # 制約式の左辺の係数
> f.dir <- c("<=", "<=", "<=") # 制約式の等号・不等号
> f.rhs <- c(24, 48, 22) # 制約式の右辺
## 決定変数は非負と仮定されいるので,非負条件の記述は不要
> lp ("max", f.obj, f.con, f.dir, f.rhs) # 目的関数の最大値を返す
Success: the objective function is 18
> lp("max", f.obj, f.con, f.dir, f.rhs)$solution #解を求める
[1] 6 6 # x1 = 6, x2 = 6
# 以下は感度分析 compute.sense=T は感度分析を有効にするオプション
> lp ("max", f.obj, f.con, f.dir, f.rhs, compute.sens=T)$sens.coef.from
[1] 0.6666667 1.0000000 # 最適解が変化しない目的関数の係数の下限値
> lp ("max", f.obj, f.con, f.dir, f.rhs, compute.sens=T)$sens.coef.to
[1] 2 3 # 最適解が変化しない目的関数の係数の上限値
# 制約式右辺を変化させる場合は,双対問題を利用するのが簡単
# 双対問題を解く
> lp("min", f.rhs, t(f.con), c("<=", "<="), f.obj)$solution
[1] 0.500 0.125 0.000
> lp("min", f.rhs, t(f.con), c("<=", "<="), f.obj, compute.sens=T)$sens.coef.from
[1] 16 32 18 # 最適解の構造が変化しない制約式右辺の下限値
> lp("min", f.rhs, t(f.con), c("<=", "<="), f.obj, compute.sens=T)$sens.coef.to
[1] 3.60e+01 5.44e+01 1.00e+30 # 最適解の構造が変化しない制約式右辺の上限値

このページのトップへ
ライブラリの情報は
> library(help=lpSolve)
で得られる.ライブラリの個々の関数については,ライブラリが読みこんだ上で
> help(lp)
で得られる.
このページのトップへ

その他の線形最適化法パッケージ

GLPK (GNU Linear Programming Kit)はオープンソースの混合整数最適化法のソルバーである.パッケージ glpk はGLPKのRインタフェースである.これについては,こちらで説明する.
このページのトップへ

参考

R一般に関して参考になるサイトを挙げておく.
このページのトップへ