情報処理論 1988...2002年度講義資料
[Syllabus], [Prev], [Next], [Text & references]

  1. 4 線形計画法のモデル
これまでは,対象となるシステムの仕組や現象をモデル化し,パラメータの値を変化させたり,あるいは,サブシステムを別のサブシステムに置き換えたりなどすると,対象システムはどのように振る舞うか,つまり,「What if ?」型の質問に答えてくれるモデルを取り上げてきた。これらは現象説明モデルである。 問題解決のためのモデルには,この他に,「ある条件を満たす制約の下で,ある評価基準に関して最適となる政策または計画を計算する過程を含んだモデル(最適化モデル)」が盛んに使われている。
最適化モデルの中では古くから線形計画法(Linear Programming)のモデルが有名で,これは経営管理の意思決定の問題によく応用されている。ここでは簡単な例題を使ってこの方法を説明する。

【例題】輸送計画のコストを最小化する
ある会社では,主要製品を製造する工場が3つあり,これを4ヶ所の営業所を通して販売している。その製品を,毎四半期間の各工場の製造能力で決まる供給可能数以内で,4ヶ所の営業所の需要を満たせるように,しかも会社全体の輸送費ができるだけ少なくなるように,という条件で各工場から各営業所に運びたい。
 ただし,輸送費用は運ぶ個数に比例しており,輸送単価,および1四半期間ごとの各工場の供給可能数と各営業所での需要量は,表5に示されている通り,分っているものとする。この会社の場合には,総供給数の方が総需要よりもやや多い。このとき,各工場から各営業所への最適な輸送計画を作成せよ。(参考書��:真鍋龍太郎ほか著,1.6節の例題6)
A
B
C
D
E
F
G
1
《需要数と供給可能数》 中央の表は,輸送単価(千円/個)
2
営業所A 営業所B 営業所C 営業所D 供給可能数
3
工場1
76
31
23
6
100
4
工場2
20
22
47
24
90
5
工場3
17
87
21
30
70
6
需要数
86
35
65
57

 練習6: 輸送計画を解く (その1)

この問題に対して表6の輸送計画表を作って,各輸送区間(工場→営業所)の輸送数を表6の中央部分のセル範囲B10〜E12に記入して,試行錯誤的に総輸送費が一番安くなりそうな輸送計画を見つけよう。

まず,輸送計画の計算式を与える。([注]: まだ,セル範囲B10〜E12はすべて空白の状態である。以下では,セルに式を与えることを簡略化して「セル ← =式」で示す。)
� ̄超判�Aの需要残数(需要数のうち,未だ満たされていない分)の計算式をセルB13に与える。
  B13 ←「= B6 - SUM(B10:B12)」
 この式を営業所B〜営業所DのセルC13〜E13にコピーする。
��工場1の供給残数(供給可能数から各営業所への配分を引いた残り)の計算式をセルF10に与える。
  F10 ←「= F3 - SUM(B10:E10)」
 この式を工場2〜工場3のセルF11〜F12にコピーする。
��需要残数の合計をセルF13に与える。
  F13 ←「= SUM(B13:E13)」
 この式はセルF13に需要残数0が表示されたとき1つの輸送計画が得られたことを意味する。
�す�場1から各営業所への輸送費=「(輸送数)×(輸送単価)の合計」をセルG10に与える。すなわち,
  G10 ←「= B10*B3 + C10*C3 + D10*D3 + E10*E3」。この式を工場2〜工場3にコピーする。
�ズ埜紊法ぜ,侶彁纂阿覗輙∩�費がセルG13に求まる。
  G13 ←「= SUM(G10:G12)」

こうして作られた表6の輸送計画表の中央部分(セル範囲B10〜E12)のどこか1つのセルに輸送量を入力すると,直ちにその輸送する工場の供給残数と営業所の需要残数が減り,その工場からの輸送費が増え,その分だけ総輸送費も増加するようにワークシートの再計算が行われる。いま,工場1から営業所Aへの輸送数を記入するセルを「区間(1,A)」と便宜的に書くことにし,「区間(1,A)にN個運ぶ」という書き方を採用する。

A
B
C
D
E
F
G
8
《輸送計画1》
9
営業所A 営業所B 営業所C 営業所D 供給残数 輸送費
10
工場1
43
57
0
1331
11
工場2
16
35
22
17
2124
12
工場3
70
0
1190
13
需要残数
0
0
0
0
0
4645

さて,一番安そうな輸送計画を導き出す方法の1つとして,「輸送単価の一番安い区間からできるだけ多く輸送する」という方針で輸送計画を作ってみよう。 この問題は,総費用を与える式が各区間(セル範囲B10〜E12)の輸送量を未知数とする1次式になっており,最小費用の方策を計算するもので,線形計画問題(線形とは1次式の意味)と呼ばれている。今回のように小さい問題なら,輸送計画の問題は表6を用いてかなり良い解が得られる。

  1. 区間(1,D)の輸送単価が最小なので,区間(1,D)に57個(営業所Dの需要数すべて)を運ぶ。すると,工場1の供給残数は43になる(100-57=43)。以下,輸送単価の安い区間の順に個数を記入していく。
  2. 区間(3,A)に70個(工場3の供給可能数すべて)を,区間(2,A)に営業所Aへの残り16個を運ぶ(86-70=16)。これで営業所Aの需要残数は0になる。
  3. 残りの中で区間(3,C)は最小単価21であるが,既に工場3の供給残数が0だから使えない。そこで次に安い単価22の区間(2,B)に35個を運ぶ。これで営業所Bの需要残数は0になる。
  4. 次は単価23の区間(1,C)に43個(上の�,了弔�)を運ぶ。
  5. これで輸送単価の大小による選択はできない状況になった。後は,営業所からの需要をすべて満たすために,まだ需要が満たされていなくて,しかも供給残数がある区間(2,C)に22個を運ぶ。

その結果,表6はこの様にして得られた輸送計画である。この輸送計画の総費用はセルG13に示されているように,4,645,000円である。

 練習7: 輸送計画を解く (その2)

今度は「各営業所には輸送費が安い工場から順にできるだけたくさん運ぶ」という方針を採って計画を作ってみよう。その後で,営業所の需要がすべて満たされるように輸送数を埋めていく手順を検討する。
準備として,表6の輸送計画表を15〜20行にコピーして表7を作り,表7で別の案を試行錯誤で求める。コピーしたときに,表7ではいくつかの式にセル参照の調整が必要になる。元の式の意味を考えて,特にB3〜F6を参照している場合,各自で修正すること。

A
B
C
D
E
F
G
15
《輸送計画2》
16
営業所A 営業所B 営業所C 営業所D 供給残数 輸送費
17
工場1
65
35
0
1705
18
工場2
16
35
22
17
1618
19
工場3
70
0
1190
20
需要残数
0
0
0
0
0
4513

この方針を次のように実行する。

  1. まず,セル範囲B17〜E19をクリアする。
  2. 営業所AとBに運ぶには,それぞれ,区間(3,A)に70個,区間(2,B)に35個を記入する。
  3. 営業所Cについては,区間(3,C)が最小値21だが,工場3の供給残数は既に0である。そこで次善の策として,区間(1,C)に65個を記入する。
  4. 営業所Dについては,区間(1,D)に35個を記入する。これで最初の方針の適用は終った。
  5. その後,まだ需要を満たしていない営業所AとDのために,区間(2,A)に16個,区間(2,D)に22個を記入する。

このようにして作られた表7の輸送計画によれば,総輸送費用は4,513,000円となり,表6の輸送計画よりも少し安い。より有利な輸送計画が見つかった訳である。

練習問題5.8:
 この会社の場合,総輸送費をもっと安くできる輸送計画がある。各工場からの輸送費が安い区間から輸送数を埋めていったらどうなるか,という方針で表7よりも効率的な輸送計画を見つけなさい。

練習問題5.9:
 この会社の場合,総供給数が総需要数よりも多い。工場に在庫が残ると,設備が足りなくなり倉庫が必要になる。その保管費用が(倉庫への輸送費も含めて),工場1では8,000円,工場2では13,000円,工場3では12,000円だけ,余分に加算されるという。このときの輸送計画表を作り,できるだけ総費用の少ない輸送計画を求めなさい。
     
  1. 5 ソルバー機能で輸送計画を解く

Excel95から最適化分析ツールとして「ソルバー」機能がアドインされた。ソルバーは複数の変数を持つ問題に対する最適解を求めるもので,線形計画のみならず,最近話題の経済学的複雑系などの非線形計画問題をも扱うことができる。 このソルバーを用いて,輸送計画のコストを最小にする問題(線形計画法)を解くための方法を説明する。

 練習8: ソルバーの準備

表5と表6(Sheet1のセル範囲A1〜G13)をSheet2にコピーする。ここではSheet2の2つの表をまとめて表8と呼ぶことにする。 表8の各セルには輸送計画を決めるのに必要な式や値が入力されている。セル範囲B10〜E12の数値をクリアする。
この問題にソルバーを適用するとき,まず総輸送費の式

(1) セルG13 ← 「= SUM(G10:G13)」 は,目的セルまたは目的関数(Object function)と呼ばれる。この目的関数の値を最小にするために,セル範囲B10〜E12の数値を変化(これらを決定変数"Decision variables"と呼ぶ)させる訳である。そのとき以下の19個の制約条件: (2) すべての決定変数は0または正,つまり B10≧0 , B11≧0 , B12≧0 , ..., E10≧0 , E11≧0 , E12≧0 , (3)各営業所の需要残数は0,つまり B13=0 , C13=0 , D13=0 , E13=0 , (4) 各工場の供給残数は0または正, F10≧0 , F11≧0 , F12≧0 ,

を満たしながら,ソルバーは最適解を探し出さなくてはならない。


 


図3
「ソルバーパラメータ設定ダイアログ」(制約条件C13 = 0まで設定したところ)

 練習9:ソルバーの実行

  1. 〔ツール(T)〕→〔ソルバー(V)〕を選択する。すると,図3の「ソルバー・パラメータ決定」ダイアログが開く。 もしこのダイアログが白紙状態でなければ、〔リセット(R)〕ボタンを押す。
  2. 図3の〔目的セル(E)〕の欄にセルG13を選ぶ (表示は $G$13 となる)。 その下にある〔目標値〕では,○最小値(N)のラジオボタンを選ぶ。
  3. 〔変化させるセル(B)〕の欄には,決定変数があるセル範囲B10〜E12を選択する (表示は $B$10:$E$12 となる)
  4. 「制約条件(U)」を設定するために,〔追加(A)〕ボタンを押す。すると,図4の「制約条件の追加」ダイアログが開く。
    営業所Aの列について詳しく説明する。制約条件の追加の順は問題ではないが,条件が多いので営業所の順番に追加していこう。
  5. まず,〔セル参照(R)〕欄にセルB10を選ぶ。 真ん中の比較記号欄から ≧ を選び,〔制約条件(C)〕欄には数 0 を直接記入する。 これで「B10≧0」という条件を追加したことになる。
    図4
    「制約条件の追加」ダイアログ (制約条件 B10 ≧0 を設定しているところ)
  6. 次に,〔追加(A)〕ボタンを押し,同様に,制約条件(2) B11 ≧0, B12 ≧0 と 制約条件(3) B13 =0 を設定していく。ここまでが営業所Aに対する制約条件の設定である。
  7. 同様に,営業所B〜Dについても制約条件(2)と(3)を設定していく。供給残数の列に対しては制約条件(4)を設定する。ただし,最後の条件,G12 ≧ 0 ,を記入したら,〔追加(A)〕ではなく〔OK〕ボタンを押す。
  8. すると,図3の「ソルバー: パラメータ決定」ダイアログに戻る。ここで変更や削除ができるので,ここまでの途中で間違えた場合でも〔OK〕ボタンを押して修正してから,追加してもよい。
  9. パラメータ設定がすべて済んだら,図3で〔実行(S)〕ボタンを押す。すると,ソルバーによる計算が開始される。しばらくしてから,図5の「ソルバー: 検索結果」ダイアログが開く。
    図5
    「ソルバー検索結果」ダイアログ(レポートを選んでいる)
  10. ここで,「○解を記入する(K)」を選ぶ。また,〔レポート(R)〕の欄から「条件」などを選んでみてもよい。そして〔OK〕ボタンを押す。
    すると,Sheet2のセル範囲B10〜G13に最適解としての輸送計画の解が記入され,そのときの総輸送費4,139,000円がセルG13に表示される。
    これは確かに表6や表7よりも更に少ない輸送費である。

図5で,〔レポート(R)〕の欄から「条件」や「感度」を選んだときは,それぞれ「感度レポート1」や「条件レポート1」というシート名のワークシートが挿入されて,そこに次のような解の詳細な情報が与えられる。一般に,最適解で与えられる変化させるセルの値(決定係数)は誤差を含んでいる。条件レポートはその誤差の程度を報告してくれる。感度レポートは,目的関数の係数,利用可能な資源,および技術係数(今の例では,供給可能数や需要数,および各区間の輸送単価)が変動したとき,最適解はどのように変わるかを報告するものである。

Microsoft Excel 7.0 条件レポート ←この標題は,Exccel97の場合,"Excel 8.0"と表示される
ワークシート名:〔M輸送計画.xls〕LP by Solver
レポート作成日: 97/12/xx 16:20
目的セル
セル 名前 値
$G$13 需要残数 輸送費
4139
変化させるセル 下 目的セル 上 目的セル
セル 名前 値 条件 値 条件 値
$B$10 工場1 営業所A
0
0
4139
0
4139
$C$10 工場1 営業所B
0
0
4139
0
4139
$D$10 工場1 営業所C
43
43
4139
43
4139
$E$10 工場1 営業所D
57
57
4139
57
4139
$B$11 工場2 営業所A
38
38
4139
38
4139
$C$11 工場2 営業所B
35
35
4139
35
4139
$D$11 工場2 営業所C
0
0
4139
0
4139
$E$11 工場2 営業所D
0
0
4139
0
4139
$B$12 工場3 営業所A
48
48
4139
48
4139
$C$12 工場3 営業所B
0
0
4139
0
4139
$D$12 工場3 営業所C
22
22
4139
22
4139
$E$12 工場3 営業所D
0
0
4139
0
4139

線形計画法の詳しい説明は,経営科学やOR(オペレーションズ・リサーチ)の入門書を参照されたい。
なお,変数が2つの線形計画法の問題は,高校の数学「連立一次不等式のグラフ解法」でも扱われており,これをExcelのワークシート上で解いていく方法もある。(参考書�ぁ�平田純一ほか著,第6章の6.6節)
また,線形計画問題に対するより本格的な解法として,シンプレックス法と呼ばれる数値解法を簡単な連立一次方程式の問題として解くこともできる。(情報処理2の教科書:24章 ORへの応用)


  1.  追補
  1. 1 配列を使った処理

配列とは,複数のセルから成り立つものである。配列を扱うことができる数式を配列数式という。例えば,SUM({2,4,6;3,5,7})という数式では,引数にある{2,4,6;3,5,7}が配列であり,括弧{}内の1つ1つを配列要素という。引数は1つでも計算結果は配列要素の和27になる。この計算は,次のワークシート上で,SUM(A1:C2)という数式を計算するのと同じことを意味する。

A
B
C
D
E
1
2
4
6
2
3
5
7
=SUM(A1:C2)

数式が配列数式としてセルに入力される場合,その数式(関数)は配列の各要素に個別に働き,計算結果も配列になる,つまり複数の計算結果をまとめて返す。

 練習1: 輸送計画を解く

具体例で示そう。輸送計画の問題において,各工場からの輸送費と総輸送費を計算する数式を与えるとき,まず,工場1のセルG10に数式

「= B10*B3 + C10*C3 + D10+D3 + E10*E3」 を入れ,次にこれを工場2〜3のセルG11〜G12にコピーした。セルG13に 「=SUM(G10:G12)」 を入れて総輸送費が得られた。

配列数式を使って同じ計算を行なうには,輸送計画のワークシート上で次のようにする。

  1. セル範囲H10〜H12を選択(アクティブ)する。
  2. セル範囲の左上隅のセル,いまはH10,に数式 「=B10:E10*B3:E3 」 を入力する。
  3. 配列数式にするために, 〔Ctrl〕+〔Shift〕+〔Enter〕の3つのキーを同時に押す。
これでH列のセル範囲に同じ計算式が入力され,以前に計算したG列と同じ計算結果が現れる。
  1. 総輸送費をセルH13に求めるには,数式 「=SUM(H10:H12)」 を使ってもよいが,配列数式を使うと上の(1.)〜(3.)の操作を経ずに直接計算できる。それにはセルH13に数式
    「=SUM(B10:E10*B3:E3, B11:E11*B4:E4, B12:E12*B5:E5)」
    を入れたあと, 〔Ctrl〕+〔Shift〕+〔Enter〕 の3つのキーを同時に押す。

 練習2: 連立1次方程式を解く

Excelの数学関数には,2つの行列AとBの積ABを計算するMMULT(...)関数,ある行列Aの逆行列A−1を計算するMINVERSE(...)関数が用意されている。これらを使って次の連立1次方程式を解いてみる。 。

3 x − 4 y = −5 (1)
2 x + y = 4 (2)
これをワークシートのセル範囲B2〜F3に行列の形で表現しておく。係数行列Aはセル範囲B2〜C3に,未知変数x,yを要素とする列ベクトルX(2行1列の行列)はセル範囲D1〜D2に,右辺の定数項-5,4から成る列ベクトルC(2行1列の行列)はセル範囲F1〜F3におかれている。上の2元連立1次方程式は次のような行列の式で表される。
A X = C (3)
未知の行列Xを(3)式から求めるには,係数行列Aの逆行列A−1を両辺に左からかけて,A−1とAの行列積A−1Aが単位行列 I になる性質を使う。
A−1( A X ) = A−1 C → ( A−1 A ) X = A−1 C → X = A−1 C
ここで, A−1 A = II X = X 今の場合, I = (1   0)
0   1
  • 連立1次方程式【ブック名 = 連立方程式】
A
B
C
D
E
F
G
1
連立1次方程式
2
3
-4
x
=
-5
3
2
1
y
=
4
4
5
逆行列
解 x=
6
解 y=

係数行列Aの逆行列A−1をセル範囲B5〜C6に計算する。
��B5〜C6をアクティブにする。
�∈絃絛�のセルB5に数式「= MINVERSE(B2:C4)」 を入力する。
�G枸鷽�式にするために, 〔Ctrl〕+〔Shift〕+〔Enter〕 の3つのキーを同時に押す。数式バーには, {= MINVERSE(B2:C4)} が表示される。

次に,上の逆行列と定数項の行列Cの積A−1Cを計算する。��F5〜F6をアクティブにする。�∈絃絛�のセルF5に数式 「= MMULT(B5:C6,F5:F6)」 を入力する。�G枸鷽�式にするために, 〔Ctrl〕+〔Shift〕+〔Enter〕 の3つのキーを同時に押す。数式バーには, {= MMULT(B5:C6,F5:F6)} が表示されて,計算結果は次のようになる。

A
B
C
D
E
F
G
4
5
逆行列
0.090909
0.363636
解 x=
1
6
-0.18182
0.272727
解 y=
2

この結果は,与えられた2元連立1次方程式の解はx=1,y=2であることを示している。この解が正しいことを検算してみなさい。

練習問題6.1:
上の連立方程式において,係数行列Aと解の行列Xの積を計算すると,定数項の行列Cになるはずである。
この行列Xの積の計算 AX を実際に行ないなさい。

練習問題6.2:
次の(a)〜(c)の連立1次方程式を,逆行列を使って解きなさい。

(a) 3 x + 4 y  = 15
5 x + 2 y  = 11
(b) x + 2 y + z  = 2
3 x + 5 y + 3 z  = 6
3 x + y + 4 z  = 10
(c) 3 w - x + y + z  = 10
w + x - 4 y - 2 z  = -11
2 w - 2 x + 3 y - 4 z  = -23
7 w + 2 x + 9 y - z  = 23
参考: (c)の解答は,w=2, x=3, y=1, z=6,となる。


lec.53) Go to TOP -----(c)TK