#73「決断の花を咲かせる──OR(オペレーションズ・リサーチ)の世界へようこそ」
はじめに
あれにするか、これにするか、どれにするか。やっぱりあれにしようか。
わたしたちの暮らしは大小さまざまな選択に満ちている。朝の目覚めから、仕事や勉強の優先順位、夕飯の献立や帰り道、週末の過ごし方まで。その一つひとつは些細なようでいて、積み重なると人生の大きな流れを左右するかもしれない――そんなことを日々考えていると、私は「自分は最善の道を選べているんだろうか」と少し不安になる。
選択するための「正しい視点」が手に入ったら? そんな疑問を胸に抱きつつ、その答えとなるのが OR(オペレーションズ・リサーチ) だ。
OR は、複雑に見える日々の決断や社会の問題を「数理モデル」としてとらえ、そこから最適な解を導き出す。難しそうに見えるが、その考え方やエッセンスは身近な場面にもたくさん応用できる。
ここでは OR の代表例として知られる問題をいくつか紹介しつつ、解き方のイメージをざっくりと眺めてみようと思う。
1. 輸送問題:モノを運ぶ最適ルートを探る
1-1. どんな場面で登場するか
複数の供給拠点(工場や倉庫など)から、複数の需要拠点(店舗や顧客など)へモノを運ぶ際に、輸送コストを最小化したいときに出てくるのが「輸送問題(Transportation Problem)」だ。
たとえば「イタリアのジェラート工場からヨーロッパ各国へアイスクリームを届ける」「国内3か所の製造拠点から全国のスーパーに商品を送る」といった場面を想像するとわかりやすい。工場ごとの供給能力、店舗ごとの需要量、そしてルートごとの輸送費用の違いを踏まえて、どこからどこに何個送れば全体のコストを最小にできるかを考える。
1-2. 解き方のイメージ
この輸送問題は、線形計画法(Linear Programming)の一種でモデル化できる。また、ネットワークフロー問題の特殊ケースでもあるため、専用のアルゴリズム(Transportation Algorithm)を使って解く方法も一般的だ。
初期解を作る際には「North-West Corner Rule」や「Least Cost Method」が、最適化のステップでは「MODI Method」や「Stepping Stone Method」が登場する。はじめはおおまかに荷物を振り分け、そこから少しずつ調整しながら輸送コストをより低くしていくパズルのようなイメージである。
2. 割当問題:最適なマッチングを求める
2-1. どんな場面で登場するか
「複数のタスクを複数の担当者にどう割り当てるか」を考える問題を「割当問題(Assignment Problem)」という。人の得意分野や費用、時間効率が異なるとき、どう組み合わせれば全体コストを最小化できるかを知りたい、といったケースによく登場する。
職場でのプロジェクト配分、イベント会場にパフォーマーを配置する、学校行事の出し物スケジュールをどう組むかなど、身近な場面でも考え方を応用できる。
2-2. 解き方のイメージ
割当問題は線形計画法で解くことも可能だが、もっと効率的に解ける「ハンガリアン法(Hungarian Method)」が有名だ。行列の形で問題を表し、段階的に行列操作をしながら「誰にどのタスクを割り当てるか」の最適解を探る。
また、ネットワークフローの二部マッチングとしてとらえる方法もある。要は「どの辺を張ればいいのか?」という問題であり、ここでもOR的な発想が活きてくる。
3. 在庫管理問題:多すぎても少なすぎても困る
3-1. どんな場面で登場するか
「いつ、どのくらいの在庫を持つか」は小売店や製造業にとって大きな課題である。作りすぎると廃棄コストが増えるし、足りなければ品切れによる機会損失が起こる。
ケーキ屋の例を想像するとわかりやすい。売れ残りを防ぎつつ、急な需要にも対応したい――こうしたバランスを見極めるのが在庫管理問題だ。大企業であれば複数倉庫の配置や部品のリードタイムなど、さらに複雑な状況になる。
3-2. 解き方のイメージ
在庫管理には主に以下のような手法がある。
(S, s) ポリシーや (Q, R) ポリシー
一定水準を下回ったらどのくらい補充するかを決め、需要のブレを確率的に考慮するモデル。動的計画法(DP)
期間ごとに「今在庫が何個あるとき、次にいくつ発注すればコストが最小化されるか」を計算する。確率モデル・シミュレーション
モンテカルロシミュレーションなどで需要をランダム生成し、繰り返し試すことで最適な在庫レベルや発注タイミングを探る。
4. プロジェクトスケジューリング:大規模タスクを期間内に終わらせる
4-1. どんな場面で登場するか
映画やドラマの制作、建設工事、製品開発など、多数のタスクが複雑に依存し合うプロジェクトを管理するときに役立つのが PERT や CPM と呼ばれる手法だ。
「どのタスクが終わらないと次に進めないか」「どれくらいの期間が必要か」を整理し、プロジェクト全体の所要期間を予測する。そして遅延が許されないタスク群を特定し、リスク管理を行う。
4-2. 解き方のイメージ
クリティカルパス法(CPM)
タスクの所要時間が確定している場合、プロジェクト全体を遅らせる「クリティカルパス」を見つけ出す手法。ここを短縮しないと全体の工期が延びるため、最優先で対処することになる。PERT(Program Evaluation and Review Technique)
タスク所要時間が不確実なとき、最楽観値・最悲観値などを用いて期待値を算出し、確率的に進捗を評価する。たとえば「この時期までに完了する確率は何%」といった分析が可能だ。
5. ナップサック問題:限られたリュックに何を入れるか
5-1. どんな場面で登場するか
限られた容量(重さ・体積など)のナップサックにアイテムを詰め込むとき、「価値(メリット)の合計」を最大化するにはどう選ぶか――これが「ナップサック問題(Knapsack Problem)」だ。
キャンプに行くとき、あれもこれも入れたいが、重量やスペースが限られている。何を優先すべきか。身近な例だが、実は離散最適化問題の代表例としてもよく取り上げられる。
5-2. 解き方のイメージ
動的計画法(DP)
容量を「状態」として、アイテムを入れるか入れないかを再帰的に計算する。容量がそこまで大きくない場合に有効。分枝限定法(Branch and Bound)
大きめの問題でも使える汎用手法。探索木をたどりながら、見込みの低い枝を早めに切り捨て(枝刈り)することで計算量を減らす。メタヒューリスティクス(遺伝的アルゴリズム、焼きなまし法など)
問題規模が非常に大きい場合、厳密解の探索には膨大な時間がかかることがあるため、ある程度妥当な「近似解」を高速に得る方法として活用される。
6. ネットワークフロー問題:流れを最大化しよう
6-1. どんな場面で登場するか
道路やパイプライン、通信回線などの「ネットワーク」で、流量を最大化したりコストを最小化したりしたい場合に登場するのが「ネットワークフロー問題(Network Flow Problems)」だ。
災害時に被災地へ物資を運ぶルートを考えたり、通信ネットワークの回線容量を割り振ったりするときにも応用できる。各ルートの容量が決まっている中、どこをどう利用するかで運べる量や通信速度は大きく変わってくる。
6-2. 解き方のイメージ
フォード–ファルカーソン法(Ford-Fulkerson)
「まだ流せる経路(増分パス)」を探してフローを少しずつ増やし、ネットワークの限界に達するまで繰り返す。エドモンズ–カープ法(Edmonds-Karp)
フォード–ファルカーソン法の増分パス探索に幅優先探索(BFS)を用いたもので、計算量が評価しやすい。プッシュ・リレーブル法(Push–Relabel)
各頂点に「高さ」を割り当て、フローを押し上げたり、並べ替えたりして最大流を求める。大規模ネットワークでも高速に解けることがある。
7. OR が社会を変える可能性
OR は生まれこそ軍事作戦解析にあったが、ビジネスや社会インフラからイベント運営、病院のスタッフ配置、災害支援など、本当に幅広いシーンで活用されている。ここでは少し変わった例を挙げてみよう。
お化け屋敷の恐怖最適化
回遊ルートが混みすぎないように「ネットワークフロー」を使ったり、ゾンビ役の配置を「割当問題」としてとらえたりすることで、恐怖度を最大化しつつ滞留を最小化できるかもしれない。行列のできる人気店の回転率向上
スタッフの配置や在庫管理を見直し、客の流れを可視化することで「どこで滞っているのか」を明確にし、回転率を高める。ペットホテルの配置シミュレーション
大型犬と小型犬、相性の悪い動物などをどう配置するか、スタッフのシフトをどう組むかという「割当」「スケジューリング」「在庫管理(ケージ数や備品)」が混ざった問題として考えると、最適解に近づきやすい。スポーツ大会の試合割り当て
コートや審判のリソースが限られている中、チームの試合をどう組み合わせるか。連続で審判をさせない、見たいカードが重ならないようにしたい、などの条件をまとめてモデル化すると混乱が減る。
8. まとめ
日常には、あらゆる「選択」や「調整」が散りばめられている。優先順位に迷っては、あれもこれもと手に取り、気づけば時間もエネルギーも不足してしまう――そんなとき、OR のアプローチはわたしに「ものごとを整理するレンズ」を与えてくれるように思う。
「たくさんの決断を迫られる日常」を、OR 的にモデル化してみると、ある程度の道筋を立てることができるかもしれない。単に数字を追いかけるだけでなく、「何を最適化したいのか?」という問いを自分自身に投げかける作業が、選択を支えてくれるからだ。
多くのことは数式だけでは割り切れないことも多いが、諦めたらそこでおしまい。数理を学んだものとして、「最善の道」を探してみたいと思う。
リファレンスノート:専門用語解説 & 学びを深めるためのヒント
1. 線形計画法(Linear Programming)
概要
「目的関数を最小(または最大)にしたい」「一定の制約を満たさなくてはならない」という問題を、数理モデル(連立不等式)として表す手法。
例:生産数量を変数とし、コストを最小化する、あるいは利益を最大化する等。学びを進めるためのヒント
大学の教科書やオンライン講義(Coursera や edX など)を活用すると基礎から学びやすい。
「Excel Solver」を使って、簡単な在庫管理や予算配分の最適化を試してみると実感がわく。
生活で使うためのヒント
家計や時間管理を考える際、制約(予算・1日の時間)と目的(支出を抑える・学習時間を増やすなど)を線形計画的にとらえてみるだけでも、「現状把握」や「優先順位の整理」に役立つ。
2. 輸送問題(Transportation Problem)
概要
複数の供給拠点と需要拠点があるとき、どこからどこへ、どの量を送れば輸送コストを最小化できるかを考える問題。線形計画法でモデル化可能。代表的な解法・用語
North-West Corner Rule, Least Cost Method: 初期解を作る手順
MODI Method(Modified Distribution Method), Stepping Stone Method: 初期解からより良い解を見つけていくためのアルゴリズム
学びを進めるためのヒント
ネットワークフローの基礎や線形計画法の基礎を理解しておくとスムーズに入れる。
「R」や「Python」の最適化ライブラリ(たとえば PuLP)で練習してみると理解が深まる。
生活で使うためのヒント
引っ越し時の荷物振り分け、職場での在庫移動など、規模は小さくても「どこにどれをどのくらい配置すると効率的か」を考える際の参考になる。
3. 割当問題(Assignment Problem)
概要
複数のタスクを複数の担当者へ割り当てるとき、どのように組み合わせるのが最適(コスト最小、効率最大など)かを探る問題。代表的な解法・用語
ハンガリアン法(Hungarian Method): 行列の形で問題を表し、行列操作をしながら最適マッチングを見つけるアルゴリズム。
ネットワークフロー(二部マッチング)の視点でも解ける。
学びを進めるためのヒント
二部マッチングやネットワークフローの基礎知識があると理解しやすい。
ハンガリアン法の行列操作は、一度手作業でやってみると流れが把握できる。
生活で使うためのヒント
家族での家事分担や職場での業務分担を考える際、「誰が何をやると総合的にベストか」を意識するだけでも負担が偏りにくくなる。
4. 在庫管理問題(Inventory Management)
概要
需要に対して「いつ、どれだけ在庫を持つか」を最適化する問題。余剰在庫はコスト増、品切れは機会損失につながるため、バランスが重要。代表的な解法・用語
(S, s) ポリシー、(Q, R) ポリシー: 需要のブレを考慮した在庫補充の基本的なモデル。
動的計画法(Dynamic Programming: DP): 時間(期間)を区切って最適な発注タイミングや量を決定。
確率モデル・シミュレーション(モンテカルロシミュレーションなど): 需要が予測しづらい場合に有効。
学びを進めるためのヒント
統計学・確率論の基礎があると在庫管理モデルの理解が早い。
「ニュースベンダーモデル(Newsboy Problem)」など、シンプルな確率モデルから始めると取り組みやすい。
生活で使うためのヒント
食材の買い出しや消耗品のストック管理を考えるとき、「一定量以下になったら補充」「消費ペースの見込みから逆算して購入」などを実践するとムダを減らせる。
5. プロジェクトスケジューリング(PERT/CPM)
概要
多数のタスクが複雑に依存し合う大規模プロジェクトで、「全体の完了時期」を見積もり、どのタスクが遅延を許さないか(クリティカルパス)を特定する手法。代表的な手法
CPM(Critical Path Method): 各タスクの所要時間が確実なとき、クリティカルパスを見つけてスケジュールを立てる。
PERT(Program Evaluation and Review Technique): タスクの所要時間が不確実なとき、期待値や確率分布を用いてスケジュールを評価する。
学びを進めるためのヒント
ガントチャートを作るツール(MS Project、Trello、Asana など)で小規模でもプロジェクトを管理してみると実感がわく。
依存関係の洗い出しが重要なので、タスク分解力を養うのもカギ。
生活で使うためのヒント
夏休みの自由研究や引っ越し準備など、「やることが多くて混乱しそうなイベント」をクリティカルパス的に洗い出してみると、最重要タスクが明確になり、締め切りに追われるリスクを減らせる。
6. ナップサック問題(Knapsack Problem)
概要
限られた容量(重さ・体積など)の中でアイテムを選び、価値の合計が最大になるようにしたい問題。代表的な解法
動的計画法(DP): 容量が小〜中規模なら実行しやすい再帰的手法。
分枝限定法(Branch and Bound): 大きめの問題にも対応できるが、最悪ケースでは計算量が増える。
メタヒューリスティクス(遺伝的アルゴリズム、焼きなまし法など): 問題規模が非常に大きい場合、近似解を効率よく探す。
学びを進めるためのヒント
小さな例題を手計算し、DP のテーブルを作ってみると流れがよくわかる。
Python などで簡単なコードを書いて試行錯誤するのも理解が深まる。
生活で使うためのヒント
旅行のパッキングリスト作成や、日々の時間配分(1日のキャパシティをリュックに見立てる)に応用できる。
「あれもこれも」と詰め込むのではなく、何が一番重要かを冷静に選ぶ意識が芽生える。
7. ネットワークフロー問題(Network Flow Problems)
概要
グラフ上で「流量」を最大化したい、あるいは「費用最小」で流したいときに用いるモデル。道路や配管、通信回線などで応用される。代表的なアルゴリズム
フォード–ファルカーソン法(Ford-Fulkerson): 「まだ流せる道」を探して流量を増やし、限界に達するまで繰り返す。
エドモンズ–カープ法(Edmonds-Karp): フォード–ファルカーソン法の増分パス探索に幅優先探索(BFS)を導入し、計算量を明確化。
プッシュ・リレーブル法(Push–Relabel): 各頂点に「高さ」を割り当ててフローを押し上げ・並べ替えしていく独特な手法。大規模な問題で高速に動く場合が多い。
学びを進めるためのヒント
グラフ理論の基礎と合わせて学ぶと理解がスムーズ。
「最小カットと最大フローは同じ値になる」という定理(最大フロー最小カット定理)を覚えておくと、理論的背景がわかりやすい。
生活で使うためのヒント
回線の混雑や道路の渋滞などを想像するとき、「ボトルネックはどこか?」を可視化するのに役立つ。
引越しの荷物をどの段階でどの車(容量)に詰めるか、といったちょっとしたケースにも考え方を応用できる。
8. メタヒューリスティクス(Metaheuristics)
概要
問題規模が非常に大きい時、厳密解を得るのに膨大な時間がかかる場合、「近似解でもいいから素早く得る」ためのアルゴリズム群。
例:遺伝的アルゴリズム(GA)、焼きなまし法、タブーサーチなど。学びを進めるためのヒント
小さな問題でも実装してみると、アルゴリズムの仕組みが理解しやすい。
バイオインフォマティクスや複雑ネットワーク解析など、最先端の研究分野でもよく使われている。
生活で使うためのヒント
スケジュール調整やマルチタスク管理などで、すぐに最適解がわからなくても「良い感じの解」をいくつか試して改善するという発想が役に立つ。