最適化のラボ:PuLP と OR-Tools で線形・整数・制約のモデルを 1 台の専用 Ubuntu VM で
このラボでは、オペレーションズ・リサーチのチームが使うソルバーを、生徒 1 人ひとりに 1 台の Ubuntu VM の中で渡します。生徒は決めたいことを、目的と制限からなるモデルとして書き、ソルバーに渡して答えを読みます。最初にステータス、次に計画、そして各制限の価値です。生徒が書く 2 つのモデルは、生徒が見ることのないインスタンスで動かすスクリプトが採点します。
生徒のパソコンには何も入れる必要がありません。CBC ソルバー付きの PuLP は Ubuntu のアーカイブから、制約ソルバー CP-SAT を持つ Google の OR-Tools は VM の初回起動時に PyPI から入ります。オペレーションズ・リサーチのモジュールは JupyterLab ラボで SciPy を使って問題を解きますが、このラボは、実務で使われるモデリングツールとソルバーに触れる場所です。
生徒が学ぶこと
決めたいことがどうモデルになるかを学びます。PuLP の線形計画では、限られた木材、時間、保管場所から机と椅子を作ります。レポートには、ステータス、計画、各制限の余裕、そして影の価格が出て、どの制限を増やす価値があるかが分かります。整数計画では、プロジェクトを丸ごと選びます。同じモデルを小数を許して解き、許さずに解くと、最初の答えを丸めただけでは制限を破ってしまうことが分かります。CP-SAT のモデルは、規則と希望から看護師のシフト表を作り、ソルバーが返す OPTIMAL、FEASIBLE、INFEASIBLE を読みます。
5 つのパート
1 つ目は線形計画です。lp.py を動かしてステータス、計画、影の価格を読み、制限を 1 つ変えて、利益の変化を影の価格と比べます。2 つ目は整数です。integer.py が、同じ種類のモデルを小数ありと小数なしで解きます。3 つ目は制約モデルです。shifts.py が CP-SAT でシフト表を作り、生徒は規則を足し、希望を 1 つ破ります。4 つ目は 3 つのモデルを手で変えることです。5 つ目は生徒が書く 2 つのモデル plan.py と rota.py で、それぞれ何を読み、何を表示すべきかが先頭のコメントにそのまま書いてあります。生徒が編集するものはすべてフォルダー optimisation にあり、ホームフォルダーの README.md が何をするかを伝えます。答えは書いてありません。
ブラウザーで動かす
VM ラボは、モジュールの中でラボ課題として設定します。サンプルはラボのページにあります。マシンは小さく、CPU 1 つ、メモリー 1 GB、ディスク 10 GB です。モデルは 1 秒もかからずに解けます。
- ラボを追加する. 担当するモジュールで課題を追加し、Ubuntu VM ラボのカードを選びます。ページには compose ファイルの代わりに、マシンの短い説明が表示されます。
- サンプルから始める. ページに、すぐ使えるラボが並びます。Optimisation を選びます。サンプルを使うと文章が置き換わりますが、元に戻すで自分の文章に戻せます。
- 公開して自分用のコピーを起動する. 公開してから、開始を押します。ラボの setup スクリプトが、VM の初回起動時に PuLP、CBC と GLPK のソルバー、OR-Tools を Ubuntu のアーカイブと PyPI から入れ、opt 補助コマンド、作業用のモデル、README を書き込みます。1、2 分かかります。
- ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。ブラウザーで開くものはなく、ラボはターミナルだけです。
このラボの基本レッスン
Optimisation Basics は、Ubuntu VM であるこのラボで進める小さなレッスンです。導入、「できる」で書く目標、キーワード、スタート問題、考えごとの確認、よくある間違い、最後の確認があり、各ステップには、コマンドをマシンのターミナルに入力する実行ボタンがあります。生徒は線形計画を動かして影の価格を読み、整数計画を動かして丸めがなぜうまくいかないかを見て、シフト表を動かします。
レッスンは周りを見て回るだけで、ラボ本来の課題である 2 つのモデルは生徒に任せるので、答えは配りません。
採点のしくみ
ラボにはチェックがあります。保存したマシンのコピーで動き、その場で作った 3 つのプロジェクト選択のインスタンスで plan.py を動かします。プログラムが表示する利益は最善でなければならず、チェックはすべての計画を試して最善を求めます。計画は予算と時間を守る必要があり、上限値は、別のソルバー GLPK が小数を許したときの同じモデルの値と一致しなければなりません。さらに、その場で作った 2 つのシフト表と、満たせない 1 つのシフト表で rota.py を動かします。コストは、チェックが別の方法で求める、破る希望の最少数でなければならず、シフト表の規則はすべて調べられ、満たせないものは INFEASIBLE と表示しなければなりません。プログラムは生徒のアカウントで動き、チェックはそれぞれが本当にソルバーを呼んだことを数えます。別のプログラムを起動するもの、PuLP も OR-Tools も使っていないものは受け付けません。チェックが表示した最初の行が理由を伝えます。
- 配る. 課題と同じようにラボを割り当てます。希望すれば期限も付けられます。生徒ごとに専用の VM が付き、授業のあとも残ります。
- チェックを実行する. クラス一覧の生徒の行で、チェックを実行を押します。保存したマシンのコピーを起動し(コピーは保存し直されません)、ラボのチェックスクリプトを root で実行して、合格したか、何を表示したか、いつかを示します。結果は生徒には伝わりません。
- 採点する. チェックが表示した最初の行を読みます。最善の計画より価値の低い計画を出している、必要以上に希望を破るシフト表を出している、など、何が正しくないかが書いてあります。足りなければ理由を付けて返します。
GitHub の定義
このファイルはラボの定義のすべてで、プラットフォームが実行するものと同じ文章です。サイズ、setup スクリプト、補助コマンド、作業用のモデル、README、チェックが入っています。コピーして、数値や問題を変えれば、より長いラボが作れます。
このラボを試す、そして費用
無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。
よくある質問
- ラボにライセンスは必要ですか。
- いいえ。OR-Tools は Apache-2.0、PuLP は MIT で、CBC と GLPK のソルバーはオープンソース(EPL と GPL)です。生徒の VM の起動時に、Ubuntu のアーカイブと PyPI から入るので、こちらからは何も配布しません。
- なぜ 2 つのツールなのですか。オペレーションズ・リサーチのモジュールの SciPy とはどう違いますか。
- PuLP は線形計画と整数計画を書き、CBC などのソルバーに渡します。OR-Tools CP-SAT は制約ソルバーで、シフト表、時間割、配送ルートが得意です。SciPy の linprog は線形計画しか解けません。モジュールは SciPy で方法を教え、このラボでは、より大きな問題や整数のために使われるツールを動かせます。
- 生徒が何かを壊すことはありますか。
- 壊せるのは自分のコピーだけです。アカウントのない訪問者のマシンは、Ubuntu のアーカイブと Python のパッケージインデックスにしか届かず、生徒がファイルを壊しても、opt reset で配られたときの状態に戻せます。
- ラボは実際の生徒用 VM で試しましたか。
- setup、レッスンのコマンド、チェック(ごまかし方ごと)は、VM の代わりの本物の Ubuntu 26.04 コンテナーで、arm64 のマシン上で動かしました。PyPI には arm64 と amd64 の OR-Tools パッケージがありますが、起動した生徒用 VM と amd64 でのインストールは、授業の前に一度試すことをおすすめします。