Python

Pythonで数理最適化やってみた。【超入門レベル:中学数学(1次方程式・連立1次方程式)】

こんにちは。
最近、数理最適化をゆるゆると勉強し始めた分析官の望月です。

自分の学んだことを定着させるためにもアウトプットしていくのが良いなと思いましたので、この場を使って不定期でまとめていきたいと思います。

初回はざっくり数理最適化とは?というところからPythonで数理最適化を扱うためのライブラリとその使い方を簡単な例をもとにご紹介します。

数理最適化とは?

ざっくり言うと「与えられた条件の中で、最適な選択を見つけるための計算技術」です。
有名な例としてはナップザック問題などがあります。

使用するPythonライブラリ

今回はPuLPという数理最適化ライブラリを利用して数理最適化問題を解いていきます。

取り扱う問題

今回は超入門レベルということなので中学数学で習う

  • 1次方程式
  • 連立1次方程式

をPuLPを使って解いてみます。

1次方程式を解いてみる

1次方程式2x+5=11を解いていきます。
コードは以下の通りです。

# 0.ライブラリのインポート
import pulp

# 1.数理モデルの定義
problem_LE = pulp.LpProblem('Linear_Equation', pulp.LpMaximize)

# 2.変数の定義
x = pulp.LpVariable('x', cat='Continuous')

# 3.1次方程式の定義
problem_LE += 2 * x + 5 == 11

# 4.定義した問題を解く
status = problem_LE.solve()

# 5.最適化計算の結果
print(pulp.LpStatus[status])
print('x=', x.value())
1.数理モデルの定義

pulp.LpProblemで数理モデルを定義します。
第一引数は任意の名前、第二引数はどういった問題を解くかを指定します。
ここではpulp.LpMaximize(最大化)としていますが、今回は1次方程式を解くため特に意味はありません。

2.変数の定義

pulp.LpVariableで変数xを定義します。
第一引数は任意の名前、第二引数は変数の種別を指定します。
ここでは連続値”Continuous”としています。

3.1次方程式の定義

代入演算子”+=”を用いて1次方程式を定義します。

4.定義した問題を解く

problem_LE.solve()でその前までに定義した問題を解きます。
解けたかどうかの情報がstatusに入ります。

5.最適化計算の結果

pulp.LpStatus[status]で解けたかどうか確認します。
最適解が得られた場合は”Optimal”となります。
また、x.value()で解を確認することができます。
x=3が導き出されたことが確認できました。

連立1次方程式を解いてみる

続いて連立1次方程式-3x+4y=45, x+y=20を解いていきます。
コードは以下の通りです。

# 数理モデルの定義
problem_SLE = pulp.LpProblem('simultaneous linear equations', pulp.LpMaximize)

# 変数の定義
x = pulp.LpVariable('x', cat='Continuous')
y = pulp.LpVariable('y', cat='Continuous')

# 連立1次方程式の定義
problem_SLE += -3 * x + 4 * y == 45
problem_SLE += x + y == 20

# 定義した問題を解く
status = problem_SLE.solve()

# 最適化計算の結果
print(pulp.LpStatus[status])
print('x=', x.value(), 'y=', y.value())

変数を2つ定義して代入演算子で方程式を2つ加えるところ以外は1次方程式と同様です。 
x=5, y=15が導き出されたことが確認できました。

まとめ

今回はPuLPを用いて1次方程式, 連立1次方程式を解いてみました。
次回は少しレベルアップして高校数学の範囲である領域における最大・最小問題を扱いたいと思います。

参考書籍

Pythonではじめる数理最適化 ケーススタディでモデリングのスキルを身につけよう(オーム社)

mochizuki
データサイエンティスト。筋トレ、温泉、時々スキー。