ぶらついた結果

あちこちぶらついた結果を記録していきます。週末は主に奥多摩歩き。

「Pythonではじめる数理最適化」を第3章まで読んだ

表題の通り、「Pythonではじめる数理最適化」を第3章まで読みました。

Pythonではじめる数理最適化 ―ケーススタディでモデリングのスキルを身につけよう― | 岩永二郎, 石原響太, 西村直樹, 田中一樹 | 数学 | Kindleストア | Amazon

第3章では学校でのクラス替えを題材に、学力やリーダーシップ、兄弟関係などさまざまな制約条件のもとにどのように最適解を出すかをPythonのライブラリ「PuLP」を題材に解説されています。

本書は全体として、第1章で数理最適化の全体概要を説明し、第2章では練習問題として簡単な二次方程式PuLPを使って解いてみます。

その後に続く第3章から第7章までは現場で生じうるケーススタディに沿ってどのように最適化問題を解くかという非常に実践的な内容になっております。

まだ途中なので断定はできませんが、本書は非常に実践的かつ初学者が数理最適化を学ぶのにとっつきやすい構成になっていると思いました。

以下その理由について、簡単にご紹介させていただきたいと思います。

まず、第3章以降の各ケーススタディの構成は以下のような流れをたどります。

  1. 問題の条件説明

  2. 条件を制約式として定式化する

  3. 制約式をPythonコードとして実装し、PuLPを使って解く

  4. 解かれた上記結果をPandas等のライブラリを使って検証、一度使ったモデルをブラッシュアップする

この構成が、理論を学んだだけでは感覚が掴みづらい「現実の問題を数式として定式化し、改善する」というプロセスを追体験する構造になっており、初学者にとっては非常にわかりやすいものとなっていると感じています。

特に、一度式を作って解を出して終わりではなく、4. 検証というフェーズを挟むことによって、作りっぱなしでは終わらない現場の数理モデルの改善プロセスに想いを馳せることができるようになっています。

また、数式もPythonコードも非常にわかりやすく、前提知識をほとんど必要とせずにすんなり読んでいける点もこの本のポイントかと思います。

例えば、第3章のPuLPを使って、「クラスの人数は40人以下であり、男女それぞれ20人以下とする」という制約式はPythonコードで下記のように書き下されています。

# 男子生徒のリスト
S_male = [row.student_id for row in s_df.itertuples() if row.gender == 1]

# 女子生徒のリスト
S_female = [row.student_id for row in s_df.itertuples() if row.gender == 0]

# (3) 各クラスの男子生徒、女子生徒の人数は20人以下とする。
for c in C:
    prob += pulp.lpSum([x[s,c] for s in S_male]) <= 20
    prob += pulp.lpSum([x[s,c] for s in S_female]) <= 20

PyOptBook/school.ipynb at main · ohmsha/PyOptBook · GitHub

特になんなく読み下せるのではないでしょうか。

必要となる数学の知識もシグマ記号の意味がわかっていれば中学レベルの知識で事足りるような容易さです。

いくつかの数理最適化の本に目を通してきましたが、本書から始めるのが自分にとっては最適だったようです。

余談ですが、本書では第6章にてPythonを使った数理最適化を解くためのWebAPI構築という課題も盛り込まれております。

Webアプリケーション構築はこのテーマの書籍としては大変珍しいですが、今後Web業界へ進みたいという情報系学生にとっては該当の章も興味深く読める内容となっているのではと思います。