1.What is it, and What for?

担当:貞廣泰造

11/16/22

1. 線型計画法とは

線形計画(Linear Programming)は直接コンピュータ プログラミングと関わるものではない。

Programmingは1950年代、軍事用語で 訓練や物資の輸送、配備の計画を意味した。

線形計画法の「線形」は実行可能な条件が 線形不等式によって表されていることが 理由である。

数理経済学だけでなくコンピュータ・サイエンスに おいても重要な役割を果たす。

1.1 ある例

\[ 最大化: x_1 + x_2 \]

\[\begin{eqnarray*} 制約: && x_1 \geq 0 \\ && x_2\geq 0 \\ && x_2 - x_1 \leq 1 \\ && x_1 + 6x_2 \leq 15\\ && 4x_1 - x_2 \leq 10 \end{eqnarray*}\]

1.1

1.1

一般の線形計画問題においては、与えられた線形不等式や 線形等式の系を満たす ベクトル\({\bf x} = (x_1, x_2, \ldots, x_n)\)のなかで、 目的関数 \[ {\bf c}^T{\bf x} = c_1x_1 + c_2x_2 + \cdots + c_nx_n \] を最大化または最小化するものを見つけることが目的。

\({\bf x}\)が満たすべき等式や不等式を制約条件 と呼ぶ。

連立方程式が行列を使って \[ A{\bf x} = {\bf b} \] と簡単に表されたように行列を使って 表したい。

そのため、例えば等式 \[ x_1 + 3x_2 = 7 \] を不等式の組、

\[\begin{eqnarray*} x_1 + 3x_2 & \leq & 7\\ -x_1 - 3x_2 & \leq & -7\\ \end{eqnarray*}\]

のように表す。

最小化問題は目的関数\({\bf c}^T{\bf x}\)\(-{\bf c}^T{\bf x}\)と変換することにより、 最大化問題に変形できる。

よって、線形計画問題はベクトル\({\bf c},{\bf b}\)と 行列\(A\)を適切に選ぶことにより、 \[\begin{eqnarray*} 最大化 & & {\bf c}^T{\bf x}\\ 制約 &&A{\bf x} \leq {\bf b} \end{eqnarray*}\] と表現できる。

\[ \begin{eqnarray*} 最大化: && x_1 + x_2\\ 制約: && x_1 \geq 0 \\ && x_2\geq 0 \\ && x_2 - x_1 \leq 1 \\ && x_1 + 6x_2 \leq 15\\ && 4x_1 - x_2 \leq 10 \end{eqnarray*} ~~~\Longrightarrow~~~ \begin{array}{c} {\bf c}^T = (1,1), \\ A = \begin{pmatrix} -1 & 0\\ 0 & -1 \\ -1 & 1 \\ 1 & 6 \\ 4 & -1\\ \end{pmatrix},\\ {\bf b}^T = (0,0,1,15,10) \end{array} \]

線形計画問題においてすべての制約を満たす \({\bf x}\)実行可能解と呼ぶ。

つまり、実行可能解の集合は

\[ \{{\bf x}\in {\mathbb R}^n\,|\, A{\bf x}\leq {\bf c}\} \]

実行可能解のなかで目的関数を最大化する ものを最適解と呼ぶ。

一般に線形計画は最適解を

  • ただ一つだけ持つ
  • 無限にたくさん持つ
  • ひとつも持たない

のいずれかである。

例えば上の例で制約を変えず、目的関数の\({\bf c}\)\({\bf c}^T = (\frac{1}{6}, 1)\)と変更すると

\[ \begin{eqnarray*} 最大化: && x_1 + x_2\\ 制約: && x_1 \geq 0 \\ && x_2\geq 0 \\ && x_2 - x_1 {\color{red}\geq} 1 \\ && x_1 + 6x_2 \leq 15\\ && 4x_1 - x_2 {\color{red}\geq}10 \end{eqnarray*} \]

とすると

実行可能解が空

まとめ

上の例では変数は2つだけで図を描くことで 問題が解けた。 しかし、一般には数千個の変数を持つ線形計画問題を 解くことは珍しくない。

次の点が重要:

  • 線形計画問題は理論的にも実用的にも高速に解を 求めることが出来る。

  • ただし、高速なアルゴリズムは単純なものではないが、 そのようなアルゴリズムを実装した様々なソフトウエアが 存在する。

  • よって問題を線型計画法として定式化することが出来れば 高速な求解が可能

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

package タブ -> インストールボタン -> lpSoveを検索

\[ 最大化: x_1 + x_2 \]

\[\begin{eqnarray*} 制約: && x_1 \geq 0 \\ && x_2\geq 0 \\ && x_2 - x_1 \leq 1 \\ && x_1 + 6x_2 \leq 15\\ && 4x_1 - x_2 \leq 10 \end{eqnarray*}\]

lpSolveパッケージで解く

library(lpSolve)
c = c(1,1)
A = matrix(c(-1, 0,  0, -1,  -1, 1,  1, 6,  4, -1), ncol=2, byrow=T)
b = c(0,0,1,15,10)
dir = rep("<=",5)
sol=lp("max", c, A, dir, b)
A
     [,1] [,2]
[1,]   -1    0
[2,]    0   -1
[3,]   -1    1
[4,]    1    6
[5,]    4   -1
sol
Success: the objective function is 5 
sol$solution
[1] 3 2