OMMX Python SDK 1.8.0

OMMX Python SDK 1.8.0#

Static Badge

個々の変更についてはGitHub Releaseを参照してください。

⚠️ SolverAdapterの追加による破壊的変更が含まれています。

Summary#

  • ソルバー用の共通インターフェイスとして、新しくSolverAdapter基底クラスが追加されました base class to serve as a common interface for adapters to different solvers.

  • ommx-python-mip-adapterommx-pyscipopt-adapterは Adapter実装ガイドに基づいて、SolverAdapterを使うように更新されました。

    • ⚠️ 破壊的変更です。このadapterを使用しているコードは更新が必要となります。

    • 他のadapterは今後更新予定

Solver Adapter#

SolverAdapterは各adapterのAPIの一貫性を高めるために追加された抽象基底クラスです。ommx-python-mip-adapterommx-pyscipopt-adapterSolverAdapterを使うように修正されました。

新しいAdapterインターフェイスで簡単な解き方の例を見てみましょう。

from ommx.v1 import Instance, DecisionVariable
from ommx_python_mip_adapter import OMMXPythonMIPAdapter

p = [10, 13, 18, 32, 7, 15]
w = [11, 15, 20, 35, 10, 33]
x = [DecisionVariable.binary(i) for i in range(6)]
instance = Instance.from_components(
    decision_variables=x,
    objective=sum(p[i] * x[i] for i in range(6)),
    constraints=[sum(w[i] * x[i] for i in range(6)) <= 47],
    sense=Instance.MAXIMIZE,
)

solution = OMMXPythonMIPAdapter.solve(instance)
solution.objective
42.0

このリリースによって、OMMXPySCIPOptAdapterクラスを使った場合でも上記と同じ書き方ができるようになりました。

以前のinstance_to_model()を使ったコードを書き換える場合は, Adapterのインスタンスを作ってsolver_inputを利用できます。 ソルバーのパラメータ変更などして、手動でを最適化を行ってから、decode()でOMMXのSolutionを取得できます。

adapter = OMMXPythonMIPAdapter(instance)
model = adapter.solver_input # OMMXPythonMIPAdapter場合、これは`mip.Model`です
# パラメータの変更
model.optimize() 
solution = adapter.decode(model)
solution.objective
42.0