サブロウ丸

サブロウ丸

主にプログラミングと数学

最適化モデリングツール flopt を試してみる

Qiitaに記事を投稿しました。

Dev Community

Medium

本稿では、最適化モデリングツールfloptの基本的な使い方やいくつかの機能の具体例を紹介します。(私も開発者の一人です) 最適化モデリングツールとは、ユーザーが解きたい問題を表現、具現化する作業をサポートするソフトウェアです。

floptでは

などの幅広い問題を表現できる柔軟性が見どころです。 本稿ではflopt:version 0.5.3を用いて説明を行います。

はじめに

最適化モデリングツールについて、線形計画法モデリングであればPulpScipy、二次計画であればCVXOPTPyomoなどが知られています。

これらのツールはそれぞれでモデルリングのプログラムの書き方が異なります。例えばScipy.optimize.milpでMIP(混合整数線形計画法)を解こうとすると、ユーザーが不等式標準形で問題を表現し、そのときの制約行列とベクトルを関数に与える必要があり、これは非常に手間です。

また一般に、ある定式化は他の最適化問題での表現も可能である場合が多く (例えばイジングモデルは二次計画やQUBOでの定式化へ書き換えができる) そのため、求解に使用できるソルバはその定式化に応じて複数の選択肢があります。しかし、使うソルバ応じてモデリングコードをユーザーが(書き方を調べながら)用意する必要があり、これも大変手間でしょう。

floptはそのような問題を解決するために、モデリングツールの中間的存在となることを目指してPythonライブラリとして開発されています。ユーザーはfloptで最適化問題モデリングするだけで、他のモデリングツールへの変換や複数のソルバを簡単に使用することができます

現在はScipy(linprog, milp, minimize)やOptuna、Hyperopt、Pulp, CVXOPTなどの外部ライブラリのソルバやランダムサンプリングや2-Optなどの内部実装のアルゴリズムを選択できます。

floptの特徴

  1. 非線形式、線形式、多項式ブラックボックス関数をサポートする柔軟な数式表現能力
  2. 線形計画法において、(不)等式標準形への変換変数積の自動線形化機能
  3. 他の問題表現形式への変換機能 (e.g. イジングモデル → 二次計画)
  4. 外部ライブラリを含む複数のソルバの呼び出しや、外部モデリングツールへの変換が可能
  5. Pulpライクな直感的なユーザーインターフェイス

他の問題表現形式へ変換したり、変数積を自動線形化する機能は他のモデリングツールにはみられないものです。 本稿ではfloptの基本的な使い方や上記の特徴の具体例を紹介します。


続きは記事で。