整数最適化 OR-Tools

整数最適化

Pythonで整数最適化問題を解くための一般的なライブラリはPuLPPyomoortoolsGurobiCPLEXなどがありますが、特に複雑な問題には商用のソルバーが有効です。

以下に、ortoolsを使用して整数最適化問題を解く一般的な手順を示します。

ortools無料で利用でき、整数最適化問題を解くための高性能なソルバーを提供します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from ortools.linear_solver import pywraplp

# ソルバーの初期化
solver = pywraplp.Solver.CreateSolver('SCIP')

# 変数の定義
x = solver.IntVar(0, solver.infinity(), 'x')
y = solver.IntVar(0, solver.infinity(), 'y')

# 目的関数の設定
solver.Maximize(2 * x + 3 * y)

# 制約条件の追加
solver.Add(x + 2 * y <= 8)
solver.Add(3 * x - y <= 6)

# 最適化の実行
solver.Solve()

# 結果の表示
print(f'x = {x.solution_value()}')
print(f'y = {y.solution_value()}')
print(f'最適値 = {solver.Objective().Value()}')

このコードは、整数最適化問題の基本的な例です。

制約条件と目的関数を設定し、ortoolsを使用して最適化を実行しています。

複雑な問題にはさらに多くの変数と制約を追加することができます。

[実行結果]

1
2
3
x = 2.0
y = 3.0
最適値 = 13.0

また、商用ソルバーを使用することで、より複雑な問題を解くことが可能となります。

ソースコード解説

以下はコードの詳細な説明です。

1. ortoolsから必要なモジュールをインポートします。

1
from ortools.linear_solver import pywraplp

2. ソルバーの初期化:

1
solver = pywraplp.Solver.CreateSolver('SCIP')
  • CreateSolverメソッドを使用して、整数最適化ソルバーを初期化します。
    ここではSCIP(Solving Constraint Integer Programs)ソルバーを使用しています。

3. 変数の定義:

1
2
x = solver.IntVar(0, solver.infinity(), 'x')
y = solver.IntVar(0, solver.infinity(), 'y')
  • IntVarメソッドを使用して整数型の変数を定義します。
    それぞれ、変数xと変数y0以上無限大以下の整数値として定義しています。

4. 目的関数の設定:

1
solver.Maximize(2 * x + 3 * y)
  • Maximizeメソッドを使用して、最大化したい目的関数を設定します。
    この例では、$2x + 3y$を最大化しようとしています。

5. 制約条件の追加:

1
2
solver.Add(x + 2 * y <= 8)
solver.Add(3 * x - y <= 6)
  • Addメソッドを使用して、制約条件を追加します。
    この例では、$4x + 2y <= 8$と$3x - y <= 6$という2つの制約条件を設定しています。

6. 最適化の実行:

1
solver.Solve()
  • Solveメソッドを呼び出して、整数最適化問題を解きます。

7. 結果の表示:

1
2
3
print(f'x = {x.solution_value()}')
print(f'y = {y.solution_value()}')
print(f'最適値 = {solver.Objective().Value()}')
  • 最適化の結果を表示します。
    x.solution_value()y.solution_value()はそれぞれ変数xyの最適な値を取得し、solver.Objective().Value()は最適化された目的関数の値を取得します。

このコードは、簡単な整数最適化問題ortoolsを使用して解く方法を示しています。

実際の問題に適用する際に、目的関数制約条件を問題に合わせて設定してください。