0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PuLPで書いた最適化モデルをCPLEXで解く

Posted at

PuLPで書いた最適化モデルをCPLEXで解くことができます。

  • テスト環境
    • CPLEX 22.1.1
    • PuLP 2.9.0
    • python 3.11.9

PuLPのデフォルトのソルバーはCBC(COIN-OR Brand-and-Cut)ですが、ソルバーを切り替えて求解することができます。

パスが通っている必要があります。Windows版のCPLEXは、デフォルトの導入ではPATHに設定しています。
image.png

pulp.pulpTestAll()で利用可能なソルバーを確認できます。

利用可能なソルバーの確認
import pulp
pulp.pulpTestAll()

以下の環境では、CBC(PULP_CBC_CMD)、CPLEX(CPLEX_CMD)、GLPK(GLPK_CMD)のソルバーが利用可能です。

出力例
Available solvers: ['GLPK_CMD', 'CPLEX_CMD', 'PULP_CBC_CMD']
Unavailable solvers: {'MIPCL_CMD', 'COPT_CMD', 'SCIP_CMD', 'COPT', 'COPT_DLL', 'HiGHS_CMD', 'GUROBI', 'XPRESS_PY', 'GUROBI_CMD', 'CPLEX_PY', 'CHOCO_CMD', 'COINMP_DLL', 'SCIP_PY', 'MOSEK', 'COIN_CMD', 'XPRESS', 'HiGHS', 'PYGLPK', 'FSCIP_CMD'}
ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss................................................................................................................................ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss................................................................ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss................................................................ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
----------------------------------------------------------------------
Ran 1348 tests in 76.787s

OK (skipped=1092)

pulpのドキュメントのREADMEにあった問題を解いてみます。

サンプル問題
from pulp import *
x = LpVariable("x", 0, 3)
y = LpVariable("y", cat="Binary")
prob = LpProblem("myProblem", LpMinimize)
prob += x + y <= 2
prob += -4*x + y

prob.solve()を実行するとデフォルトのCBCソルバーが使用されます。

CBCでの求解
# デフォルトCBC(COIN-OR Brand-and-Cut)ソルバーで解く
prob.solve()
# 解決したLPのステータスを出力
print("Status:", LpStatus[prob.status])
# 最適解を出力
for v in prob.variables():
    print(v.name, "=", v.varValue)
# 目的関数値を出力
print("objective=", value(prob.objective))

prob.solve(CPLEX())を実行するとCPLEXソルバーが使用されます。それ以外は何も変更せずとも動きます。

CPLEXでの求解
# CPLEXソルバーで解く
prob.solve(CPLEX())
# 解決したLPのステータスを出力
print("Status:", LpStatus[prob.status])
# 最適解を出力
for v in prob.variables():
    print(v.name, "=", v.varValue)
# 目的関数値を出力
print("objective=", value(prob.objective))

この問題はランダム要素がないので結果は同じです。

結果
Status: Optimal
x = 2.0
y = 0.0
objective= -8.0

オプションを指定したい場合は以下のように指定します。

オプション指定
prob.solve(CPLEX_CMD(options=['set mip tolerances mipgap 0.25']))

参考

pulp/examples/test1.py

Interactive Optimizer のオプション

Pulp ソルバー選択 / 並列計算 (python) - Sabrou-mal サブロウ丸

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?