決め方を数と式で書く
数理モデルとは、決めたいことを、変数、目的関数、制約条件の3つで書き表したものです。このモデルがあれば、パン屋の「何をいくつ焼けばいちばん儲かるか」を、勘ではなく計算で探せます。
この学問は、オペレーションズ・リサーチ(OR)と呼ばれます。限られた材料や時間の中で、よい決め方を数で探します。
このレッスンのゴール
メモ
決めたいことを、変数、目的関数、制約条件として書くことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 変数 | 自分で決めたい数 | 焼く食パンの本数 x |
| 目的関数 | いちばんよくしたい値を表す式 | 利益 = 200x + 300y |
| 制約条件 | 守らなければならない限り | 小麦粉は8kgまで |
| 実行可能 | 制約条件をすべて守っていること | |
| 最適解 | 実行可能な決め方のうち、目的がいちばんよいもの |
学生が入力するセルは、このプレビューでは空白です。
決めたい数が変数になる
パン屋は、1日に食パンを x 本、ロールパンを y 袋焼きます。この x と y が変数です。
x と y を決めると、その日の作り方が1つ決まります。これを計画と呼びます。たとえば、食パン4本とロールパン2袋が1つの計画です。
パン屋の条件を表にする
| 項目 | 食パン1本 | ロールパン1袋 | 1日の上限 |
|---|---|---|---|
| 利益 | 200円 | 300円 | なし |
| 小麦粉 | 1kg | 2kg | 8kg |
| オーブン | 30分 | 20分 | 180分 |
学生が入力するセルは、このプレビューでは空白です。
目的関数は、よくしたい値の式
パン屋がよくしたいのは利益です。利益は、食パンの本数に200をかけ、ロールパンの袋数に300をかけて足した値です。
これを「200x + 300y」と書き、目的関数と呼びます。利益なら大きく、費用なら小さくしたいので、目的は最大化か最小化のどちらかです。
制約条件は、守る限りの式
小麦粉は8kgまでなので、「x + 2y ≤ 8」と書けます。オーブンは180分までなので、「30x + 20y ≤ 180」です。
パンの数がマイナスになることはないので、「x ≥ 0」と「y ≥ 0」も制約条件です。これらを全部守る計画が実行可能です。
パン屋のモデル全体
| 部品 | 式 | 意味 |
|---|---|---|
| 変数 | x と y | 食パンの本数と、ロールパンの袋数 |
| 目的関数 | 200x + 300y を最大にする | 利益をいちばん大きくする |
| 制約条件 | x + 2y ≤ 8 | 小麦粉は8kgまで |
| 制約条件 | 30x + 20y ≤ 180 | オーブンは180分まで |
| 制約条件 | x ≥ 0、y ≥ 0 | 作る数はマイナスにならない |
学生が入力するセルは、このプレビューでは空白です。
計画4と2を確かめる
docker exec jupyter python3 -c "x = 4; y = 2; print(x + 2 * y <= 8, 30 * x + 20 * y <= 180, 200 * x + 300 * y)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
計画5と2を確かめる
docker exec jupyter python3 -c "x = 5; y = 2; print(x + 2 * y <= 8, 30 * x + 20 * y <= 180, 200 * x + 300 * y)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
多くの人は、利益がいちばん大きい計画を最適解だと考えます。しかし、制約条件を1つでも破る計画は、実行可能ではありません。まず実行可能かどうかを調べ、そのうえで利益を比べます。
計画を変えて確かめる
# 計画を変えて、実行可能か、利益はいくらかを確かめます。
x = 4
y = 2
flour = x + 2 * y
oven = 30 * x + 20 * y
print("小麦粉:", flour, "kg、オーブン:", oven, "分")
print("実行可能:", flour <= 8 and oven <= 180)
print("利益:", 200 * x + 300 * y, "円")
# x を 5、y を 2 に変えて、もう一度実行してください。
ほかの決定も3つの部品で書ける
| 決めたいこと | 変数 | 目的関数 | 制約条件 |
|---|---|---|---|
| 1日の献立 | 各食品を食べる量 | 食費を小さくする | 栄養の量の下限、食べられる量の上限 |
| 週の時間割 | 各時間にどの授業を入れるか | 空き時間を小さくする | 先生は同時に2か所にいられない |
| 配達の担当 | 誰がどの地区を回るか | 合計の時間を小さくする | 1人1地区、1地区1人 |
学生が入力するセルは、このプレビューでは空白です。
さらに挑戦: 自分の決定を書く
ノートか JupyterLab のノートブックに、自分の決定を1つ選んで書いてください。部活の練習メニューでも、アルバイトの予定でも構いません。
変数、目的関数、制約条件を1行ずつ書きます。数字は仮のもので構いません。次のレッスンで、変数が2つのモデルを図で解きます。