Python

Pythonで数理最適化やってみた。【入門レベル:高校数学(領域における最大・最小)】

こんにちは。
分析官の望月です。

前回の記事では数理最適化ライブラリPuLPを用いて1次方程式と連立1次方程式を解きました。今回は少しレベルアップして高校数学の範囲である領域における最大・最小問題を扱っていきます。

復習:領域における最大・最小問題(2次元)

複数の条件をすべて満たす領域内におけるf(x,y)の最大値と最小値を求める問題です。
こちら*のサイトに分かりやすくまとまっています。

*領域における最大最小(基本編)_おいしい数学

解きたい最大・最小問題

今回は下記の問題を解いていきます。

x>=0, y>=0, x-y<=-6, x+2y<=14, 2x+y<=15をすべて満たす領域をDとするとき、
領域D内におけるx+yの最大値, 最小値を求めよ。

コードは以下の通りです。

# 数理モデルの定義
problem_LPP = pulp.LpProblem('Linear_Programming_Problem', pulp.LpMaximize)
#problem_LPP = pulp.LpProblem('Linear_Programming_Problem', pulp.LpMinimize)

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

# 領域の定義
problem_LPP += x >= 0
problem_LPP += y >= 0
problem_LPP += x - y <= -6
problem_LPP += x + 2 * y <= 14
problem_LPP += 2 * x + y <= 15

# 目的関数の定義
problem_LPP += x + y

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

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

前回の記事でご紹介した連立1次方程式のコードとほぼ同様になります。
数理モデルを定義する際に第2引数をpulp.LpMaximizeとすると最大化問題、pulp.LpMinimizeとすると最小化問題を解くことになります。
また、PuLPで制約式(今回でいう領域)と目的関数を定義する際は両方とも代入演算子”+=”を用います。

x=0.66666667, y=6.6666667の時にx+yの最大値7.33333337となることが確認できました。

まとめ

今回扱ったようないくつかの変数が線形の等式と不等式をすべてみたすという条件のもとで,線形の関数を最適化するような変数の値をすべて求める問題は線形計画問題と呼ばれています。
次回はさらにレベルアップして数理最適化の使い道を具体例をもとに紹介したいと思います。

参考書籍

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

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