更新履歴(初版のみ・2026年11月01日公開)
- 初版公開
この記事を引用する(DOI: 10.5281/zenodo.23852473)
この記事はZenodoにアーカイブされています。常に最新版へ解決されるDOIと、いま表示している版に固定されたDOIの両方を下に示します。
小村 豪(2026)「シフト表・配送ルートの最適化 ── Excelでの手作業から数理最適化に移る判断基準」合同会社小村ソフト. https://doi.org/10.5281/zenodo.23852473 https://comcomponent.com/blog/shift-route-optimization-excel-decision/
- DOI(最新版)
- 10.5281/zenodo.23852473
- DOI(この版)
- 10.5281/zenodo.23852474
シフト表や配送ルートを Excel で手作業で組んでいると、組む人が条件を頭に入れたまま、少しずつ調整して仕上げることになります。この記事ではその作業を数理最適化に任せられるのか、任せるべきなのかを判断するための材料をまとめます。
答えの要点は次のとおりです。数理最適化は決める値・守る条件・良し悪しの物差しを式に書き、条件を満たす案のなかから良い案をソフトウェアに探させる方法です。組み合わせの数が手で調べきれないほど多く、条件を言葉で書き出せて、作り直しが頻繁にあるほど、移る価値が大きくなります。逆に、規模が小さく条件も少ない場合や、条件を書き出せない場合は、手作業のままでよいか、先に条件とデータを整える段階です。
対象は中小規模の事業所のシフト表(勤務表)と、自社の車両で回る配送ルートです。式の書き方やプログラムの詳細は扱いません。記事の中の数字は説明のための計算例で、特定の会社の事例や効果を測ったものではありません。
数理最適化が決めること
数理最適化では問題を次の3つで書きます。
- 決める値(決定変数): 誰がどの日にどの勤務に入るか、どの車両がどの配送先にどの順で行くか
- 守る条件(制約): 各勤務に必要な人数、1日に入れる勤務は1つまで、車両に積める量の上限など
- 良し悪しの物差し(目的関数): 希望がかなった数、移動距離の合計、最も長いルートの長さなど
この3つをソルバーと呼ばれるソフトウェアに渡すと、条件を満たす案のなかから、物差しで最も良い案、または十分に良い案を探します。Google の OR-Tools は組み合わせ最適化を「非常に多くの可能な解のなかから最良の解を見つける」ものと説明しています1。
flowchart TB
accTitle: 数理最適化の入力と出力
accDescr: 決める値、守る条件、良し悪しの物差しの3つを式に書いてソルバーに渡し、条件を満たす計画案を受け取り、人が確認する流れを示す。
V["決める値(決定変数)"] --> S["ソルバー"]
C["守る条件(制約)"] --> S
O["良し悪しの物差し(目的関数)"] --> S
S --> P["条件を満たす計画案"]
P --> H["人が確認して使う"]
図1: 決める値・守る条件・物差しを式にしてソルバーに渡すと、条件を満たす計画案が返ってくる。
Excel にも同じ考え方の機能があります。ソルバーアドインは目的セルの値を最大または最小にするように変数セルを変え、その際に制約を守らせます。変数セルを整数(int)や0か1(bin)に限る制約も指定できます2。
線形の最適化問題のうち、決める値の一部を整数に限るものを混合整数計画(MIP)と呼びます。OR-Tools の説明では0か1の決定には真偽の変数を使います3。シフト表の「この人がこの日の早番に入るか」は、まさにこの0か1の決定です。
シフト表の場合
OR-Tools の勤務スケジューリングの例は、看護師の勤務表を題材にしています。各日の各勤務に1人を割り当てる、1人が1日に入る勤務は1つまで、各看護師が期間中に一定の回数以上勤務する、という条件を置き、できるだけ均等に割り当てます。勤務の希望を加えた例ではかなえられた希望の数を最大にします。どちらの例も OR-Tools の CP-SAT ソルバーで解いています4。
flowchart TB
accTitle: シフト表を数理最適化で書く例
accDescr: シフト表では、誰がどの日にどの勤務に入るかを0か1で決め、必要人数や1日1勤務の条件を守り、希望がかなった数を物差しにすることを示す。
V["勤務への割り当て(0か1)"] --> M["シフト表のモデル"]
C1["各勤務の必要人数"] --> M
C2["1日1勤務まで"] --> M
O["希望の数を最大に"] --> M
図2: シフト表では勤務への割り当てを0か1で決め、必要人数などの条件のもとで希望を最大限かなえる。
配送ルートの場合
配送計画問題(VRP)は複数の車両で複数の地点を回る最適なルートを求める問題です。OR-Tools は1台で回る巡回セールスマン問題(TSP)とほぼ同じ問題だと説明しています5。OR-Tools の例では全車両のうち最も長いルートの長さを短くすることを物差しにしています5。車両に積める量の上限のような条件も加えられます1。
図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全10件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle
Excelの手作業が行き詰まるところ
組み合わせの数
配送先が10か所あって1台で回るとき、回る順番の並べ方は 10 × 9 × … × 1 = 3,628,800 通りです。15か所なら約1.3兆通り、20か所なら約243京通りになります(いずれも順番の並べ方を数えた計算で、実際の道路事情は含みません)。
シフト表も同じです。5人の30日分を、早番・遅番・休みの3つから選ぶとすると、1人1日あたり3通りで、組み合わせは3の150乗、約3.7×10の71乗通りです。OR-Tools の例のように看護師4人・3日・3勤務という小さな問題でも、条件を満たす勤務表は5,184通りあり、ほとんどの問題ではすべての案を列挙するのは現実的でないとされています4。
flowchart TB
accTitle: 配送先の数と回る順番の数
accDescr: 1台で回る配送先が10か所なら約363万通り、15か所なら約1.3兆通り、20か所なら約243京通りに増え、手で比べられる数を超えることを示す。
A["配送先10か所: 約363万通り"] --> B["15か所: 約1.3兆通り"]
B --> C["20か所: 約243京通り"]
C -.-> D["手で比べられる数を超える"]
図3: 配送先が5か所増えるごとに、回る順番の数は桁違いに増える。
手作業ではこのうちごく一部の案しか比べられません。組む人の経験で良い案に近づけることはできても、ほかにもっと良い案があるかは確かめようがありません。
ソフトウェアでも、すべてを調べるわけではありません。巡回セールスマン問題については、一般の場合に効率よく解く方法は知られていません6。実際のソルバーは探索の時間に上限を設け、その時間内に見つけた良い案を返します。OR-Tools のルート探索には時間の上限を設定でき、探索の状態として「時間をもっと与えれば案を改善できる」ことを示す値もあります7。
必ず守る条件とできれば守る条件
条件には破ると計画として成り立たないものと、できれば守りたいものがあります。前者をハード制約、後者をソフト制約と呼びます。OR-Tools のシフト作成のサンプルでは連続する休みの日数などに、必ず守る上限・下限と、できれば守る上限・下限を分けて設定し、できれば守る範囲を外れた分だけ目的関数に罰則を加えています。希望も重み付きで扱い、ほかの条件との兼ね合いで決まるようにしています8。
flowchart TB
accTitle: ハード制約とソフト制約の扱い
accDescr: 必ず守るハード制約は破る案を候補から外し、できれば守るソフト制約は外れた分を罰則として目的関数に加えて、ほかの条件との兼ね合いで決めることを示す。
R["勤務の条件"] --> H["ハード制約(必ず守る)"]
R --> S["ソフト制約(できれば守る)"]
H --> X["破る案は候補から外す"]
S --> P["外れた分を罰則として加える"]
P --> O["ほかの条件との兼ね合いで決まる"]
図4: 必ず守る条件は案を絞り込み、できれば守る条件は罰則として良し悪しに反映する。
手作業の Excel では、この区別と優先順位が組む人の頭の中にあります。「この人は夜勤を2日続けない」「このお客様は午前中に届ける」といった条件がどこにも書かれていないと、組む人が替わったときに同じ計画を作れません。数理最適化に移るには、これらを式に書ける形で書き出す必要があります。逆に言えば、書き出すことそのものが属人化した計画を引き継げる形にする作業になります。
条件が変わったときの作り直し
人の入れ替わり、休みの申請、配送先の追加があると、計画の一部を作り直します。手作業では、変更した箇所の影響を組む人が順に追い、ほかの条件を崩していないかを確かめます。数理最適化ではデータを変えてもう一度ソルバーに解かせると、書いた条件をすべて満たす案をソルバーが改めて探します。条件を満たす案がないときは、そのことが分かります。OR-Tools の CP-SAT ソルバーは、条件を満たす案がないと証明できた場合に INFEASIBLE という結果を返します9。作り直しの頻度が高いほど、この差は大きくなります。
Excelソルバーの規模の上限
Excel のソルバーアドインも数理最適化の道具ですが、使える変数セルは200個までです2。Frontline Systems も、標準の Excel ソルバーの決定変数は線形・非線形の問題とも200個までだとしています10。前の例の5人・30日・3種類の勤務を0か1の変数で表すと、5 × 30 × 3 = 450個になり、この上限を超えます。また、Excel for the web ではアドインが使えないので、ソルバーも使えません2。
flowchart TB
accTitle: シフト表の変数の数とExcelソルバーの上限
accDescr: 5人・30日・3種類の勤務を0か1の変数で表すと450個になり、標準のExcelソルバーで使える変数セル200個を超えるので、最適化のライブラリを検討することを示す。
A["5人 × 30日 × 3種類の勤務"] --> B["0か1の変数が450個"]
B --> C["標準のExcelソルバーの上限は200個"]
C --> D["最適化のライブラリを検討する"]
図5: 5人・30日のシフト表でも、0か1の変数の数は標準のExcelソルバーの上限を超える。
この規模を超える問題では OR-Tools や HiGHS のような最適化のライブラリを使います。OR-Tools はオープンソースで、ルート探索のライブラリと CP-SAT という制約プログラミングのソルバーを含み、C++・Python・C#・Java から使えます11。HiGHS は線形計画・混合整数計画などを解くソルバーで、MIT ライセンスで公開され、Python などから使えます12。
数理最適化に移るかの判断基準
移るかどうかは、次の表の項目を順に見て判断します。左の列の状況が多いほど移る価値が大きく、右の列が多いほど手作業のままでよいか、準備が先です。
| 見ること | 移る価値が大きい | 手作業のままでよい・準備が先 |
|---|---|---|
| 問題の大きさ | 人数・日数・配送先が多く、組み合わせを手で比べきれない | 数人・数か所で、組む人が全体を見渡せる |
| 条件の書き出し | 条件を言葉で書き出せ、守る優先順位も決められる | 条件が組む人の勘にあり、言葉にできない |
| 作り直しの頻度 | 毎日、毎週のように作り直す | 年に数回しか作らない |
| データ | 勤務の可否や資格、配送先の住所や量が電子データである | 紙やその場の連絡にしかない |
| 悪い計画の影響 | 人手不足、残業、遅配、燃料費が大きく変わる | 計画の良し悪しで結果がほとんど変わらない |
| 組む人の負担 | 特定の人しか組めず、その人の時間を大きく取っている | 誰でも短時間で組める |
flowchart TB
accTitle: 数理最適化に移るかの判断の流れ
accDescr: 組み合わせを手で比べきれないかを見て、条件を書き出せるかとデータがそろうかを確かめ、そろえば小さく試し、そろわなければ先に条件とデータを整えることを示す。
A["組み合わせを手で比べきれないか"] -->|"比べられる"| K["手作業のままでよい"]
A -->|"比べきれない"| B["条件を書き出せるか"]
B -->|"書き出せない"| P["先に条件とデータを整える"]
B -->|"書き出せる"| C["データがそろうか"]
C -->|"そろわない"| P
C -->|"そろう"| T["小さく試す"]
図6: 規模、条件の書き出し、データの順に見て、そろえば小さく試す。
表の項目のうち、条件の書き出しとデータは、数理最適化を使うかどうかに関係なく、計画を引き継げるようにするために役立ちます。すぐに移らないと決めた場合でも、条件の一覧と、計画に使うデータの置き場所を整えておくと、組む人が替わったときに困りません。
移る前に準備すること
条件の一覧
まず、今の計画がどんな条件で組まれているかを書き出します。組む人に聞き取り、過去の計画を見ながら、次のように分けます。
- 必ず守る条件: 法令や就業規則で決まっていること、車両に積める量、配送の約束の時間帯
- できれば守る条件: 勤務の希望、連続勤務を避けたい日数、担当者と配送先のなじみ
- 物差し: 何を良い計画とするか(希望がかなった数、移動距離、残業時間、偏りの少なさ)
できれば守る条件にはどれを優先するかの順位か重みを付けます。重みは後で調整するものなので、最初は大まかでかまいません。
データ
シフト表なら、職員の一覧、資格や担当できる業務、勤務できる日・できない日、必要人数を、表の形でそろえます。配送ルートなら、配送先の住所や位置、配送量、受け取れる時間帯、車両の台数と積める量、拠点からの距離や移動時間をそろえます。
今の計画を評価する物差し
数理最適化の案が今の手作業の計画より良いかを比べるため、今の計画も同じ物差しで測ります。希望がかなった数や移動距離の合計を、今の計画についても数えておくと、比べたときに改善したかどうかを数字で判断できます。
flowchart TB
accTitle: 移る前に準備する3つのもの
accDescr: 条件の一覧、計画に使うデータ、今の計画を測る物差しの3つをそろえると、数理最適化の案と今の計画を同じ条件で比べられることを示す。
A["条件の一覧(必ず・できれば)"] --> D["同じ条件で比べられる"]
B["計画に使うデータ"] --> D
C["今の計画を測る物差し"] --> D
図7: 条件の一覧、データ、物差しの3つをそろえてから比べる。
小さく始める進め方
いきなり全事業所・全車両で切り替えるより、範囲を絞って試し、結果を見て広げるほうが安全です。
- 試す範囲を決めます。1つの事業所の1か月分のシフト表、1つの拠点の1日分の配送などです。
- 準備した条件の一覧を、式に書ける形に整えます。必ず守る条件と、重みを付けたできれば守る条件に分けます。
- ソルバーで解きます。小さければ Excel のソルバーで試せます。大きければ OR-Tools や HiGHS を使います。探索の時間の上限を決めておきます。
- 出てきた案と今の手作業の計画を、同じ物差しで比べます。
- 組む人が案を確認し、現場で使えない点があれば理由を聞き取ります。
- 聞き取った理由を条件として書き足し、もう一度解きます。結果が安定したら範囲を広げます。
flowchart TB
accTitle: 小さく始めて広げる進め方
accDescr: 範囲を絞って条件を式にし、ソルバーで解いて今の計画と比べ、組む人が確認して使えない理由を条件に書き足し、安定したら範囲を広げることを示す。
A["範囲を絞る"] --> B["条件を式に整える"]
B --> C["ソルバーで解く"]
C --> D["今の計画と比べる"]
D --> E["組む人が確認する"]
E -->|"使えない点がある"| F["理由を条件に書き足す"]
F --> C
E -->|"安定した"| G["範囲を広げる"]
図8: 解いて比べ、使えない理由を条件に足して解き直し、安定したら広げる。
人が最後に確かめる段階を残す
ソルバーが守るのは、式に書いた条件だけです。式に書いていない事情、たとえば当日の急な欠勤や、道路工事による通行止めは考慮されません。出てきた案を組む人が確認し、手直しできる段階を運用に残します。手直しした理由を条件の一覧に書き足していくと、次からはソルバーの段階でその条件が守られるようになります。
外部の会社に作ってもらう場合も、条件の一覧と物差しは発注側で用意できる部分が大きく、それがあると見積もりや比較がしやすくなります。外注先の選び方は「社内に開発者がいない会社の外注先の選び方」にまとめています。
関連記事
参考リンク
-
Google OR-Tools, About OR-Tools. 組み合わせ最適化の説明、配送ルートやスケジューリングなどの問題の例。 ↩ ↩2
-
Microsoft Support, Define and solve a problem by using Solver. 目的セル・変数セル・制約、変数セルの上限200個、Excel for the web で使えないこと。 ↩ ↩2 ↩3
-
Google OR-Tools, Mixed-Integer Programming. 一部の変数を整数に限る混合整数計画と、0か1の決定に使う真偽の変数。 ↩
-
Google OR-Tools, Employee Scheduling. 看護師の勤務表の例、条件、希望の扱い、解の数、CP-SAT ソルバー。 ↩ ↩2
-
Google OR-Tools, Vehicle Routing Problem. 配送計画問題の定義と巡回セールスマン問題との関係、最も長いルートを短くする物差し。 ↩ ↩2
-
University of Waterloo, The Problem (Traveling Salesman Problem). 巡回セールスマン問題の定義と、一般の場合の解法が知られていないこと。 ↩
-
Google OR-Tools, Routing Options. ルート探索の時間の上限、初期解の作り方、探索の状態。 ↩
-
Google OR-Tools, shift_scheduling_sat.py. 必ず守る上限・下限と、できれば守る範囲を外れた分の罰則を使うシフト作成のサンプル。 ↩
-
Google OR-Tools, CP-SAT Solver. CP-SAT ソルバーが返す結果の種類(OPTIMAL・FEASIBLE・INFEASIBLE・MODEL_INVALID・UNKNOWN)と、INFEASIBLE が解のないことを証明した結果であること。 ↩
-
Frontline Systems, Standard Excel Solver - Dealing with Problem Size Limits. 標準の Excel ソルバーの決定変数の上限。 ↩
-
Google OR-Tools, OR-Tools. オープンソースの最適化ソフトウェア、対応言語、含まれるソルバー。 ↩
-
HiGHS, HiGHS - High-performance software for linear optimization. 線形計画・混合整数計画・2次計画のソルバー、MIT ライセンス、対応言語。 ↩
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
需要予測で「平均の何倍を在庫に持つか」の決め方 ── 安全在庫の考え方
在庫を「平均の何倍」で決めている会社向けに、安全在庫の考え方を説明します。需要のばらつき、リードタイム、発注方式、サービスレベルから安全在庫と発注点を計算する式と、Excelでの計算例、式が当てはまらない品目をまとめます。
業務システムのコード設計 ── 商品コード・顧客コードの決め方とチェックディジット
商品コード・顧客コードなど業務システムのコード体系を決める実践ガイド。有意コードと無意味連番の判断表、JAN・Luhn等のチェックディジット算式とC#実装、Excelの0落ち対策、桁あふれと移行まで整理します。
Excel台帳をSharePointリストへ置き換える ── 共有・履歴・フロー連携で「台帳が壊れる」を卒業する
共有フォルダのExcel台帳をSharePointリスト(Microsoft Lists)へ移行する実践ガイド。同時編集・上書き・行ズレの解決、Excelからのインポート手順、列型設計、リストビューしきい値5000の正しい理解、Power Automate連携までを整理します。
PowerShellでExcel・CSV業務処理を自動化する ── 集計・突合・帳票出力の実務レシピ
PowerShellでCSVの集計・突合・Excel帳票出力を自動化する実務レシピ。Import-Csv/Export-Csvの文字コード既定(5.1と7の違い)、Group-Objectの集計、Compare-Objectとハッシュテーブルの突合、ImportExcelと...
Power Automate for desktopで基幹システムへの転記を自動化する ── Excel・紙からの手入力をUI自動化に置き換える
APIのない古い基幹システムへの手入力転記を、Power Automate for desktop(PAD)のUI自動化で置き換える実践ガイド。無料で使える範囲、無人実行のライセンス、セレクターと例外処理による安定化まで整理します。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
数理コンサルティング・業務最適化
シフト表や配送ルートの条件を書き出して数理最適化のモデルにできるか、手作業のままのほうがよいかを、問題の大きさとデータから見積もる題材です。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- 数理最適化とは何をするものですか?
- 決める値(決定変数)、守る条件(制約)、良し悪しの物差し(目的関数)を式で書き、条件を満たす案のなかから物差しで最も良い案、または十分に良い案をソルバーと呼ばれるソフトウェアに探させる方法です。シフト表なら誰がどの日にどの勤務に入るか、配送ルートならどの車両がどの順に回るかを決めます。
- Excelのソルバーでシフト表を作れますか?
- 小さな問題なら作れます。ただし標準のExcelソルバーで使える変数セルは200個までです。たとえば5人・30日・3種類の勤務を0か1かで表すと変数は450個になり、この上限を超えます。大きな問題ではOR-ToolsやHiGHSのような最適化のライブラリを使います。
- どんなときは手作業のままでよいですか?
- 人数や配送先が少なく、条件も少なく、作り直す機会がめったにない場合は、手作業で十分なことがあります。条件を言葉で書き出せない場合や、必要なデータがそろわない場合も、すぐに数理最適化へ移る段階ではありません。先に条件とデータを整えます。
- 最適化ソフトが出した計画をそのまま使ってよいですか?
- ソフトが守るのは式に書いた条件だけです。書いていない事情は考慮されないので、人が確認して手直しする段階を残します。手直しした理由を条件として書き足していくと、次の計画の質が上がります。