このトピックでは、最適化ソルバーの呼び出し方法と問題の入力方法について説明し、最適化ソルバーの API と操作の一覧を示します。
最適化ソルバーには多数の API と操作があり、新しい API と操作が頻繁に追加されています。このトピックでは、既存の API と操作の一覧を示します。これらの API と操作の詳細については、「MindOpt ユーザーマニュアル」をご参照ください。
V0.x を使用している場合は、「V0.x ユーザーマニュアル」を参照してください。
最適化ソルバーの呼び出し方法
最適化ソルバーを使用する前に、ソルバー SDK をダウンロードしてインストールし、最適化ソルバーを使用するための権限を取得していることを確認してください。これらの操作の実行方法については、「サービスのアクティブ化と使用」および「最新の最適化ソルバー SDK のダウンロードとインストール」をご参照ください。
次の例は、最適化ソルバーの呼び出し方法を示しています。詳細については、「メソッドの呼び出し」をご参照ください。
CLI を使用した最適化ソルバーの呼び出し例
インストールドキュメントに従って、環境変数 $MINDOPT_HOME で指定されたディレクトリに最適化ソルバーをインストール済みであるとします。Linux または macOS では、次のコマンドを実行して最適化ソルバーを呼び出します。
mindopt $MINDOPT_HOME/examples/data/afiro.mpsWindows では、次のコマンドを実行して最適化ソルバーを呼び出します。
mindopt %MINDOPT_HOME%\examples\data\afiro.mpsPython、Java、C++、C#、C および MATLAB 言語での最適化ソルバーの呼び出し例
env = mindoptpy.Env()
env.start()
model = mindoptpy.read(filename, env)
model.optimize()
print(f"Optimal objective value is: {model.objval}")
for v in x:
print(f"{v.VarName} = {v.X}")MDOEnv env = new MDOEnv();
MDOModel model = new MDOModel(env, filename);
model.optimize();
System.out.println("Optimal objective value is: " + model.get(MDO.DoubleAttr.ObjVal));
MDOVar[] x = model.getVars();
for (int i = 0; i < x.length; ++i) {
System.out.println(x[i].get(MDO.StringAttr.VarName) + " = " + x[i].get(MDO.DoubleAttr.X));
}MDOEnv env = MDOEnv();
MDOModel model = MDOModel(env, filename);
model.optimize();
std::cout << "Optimal objective value is: " << model.get(MDO_DoubleAttr_ObjVal) << std::ends;
std::vector<MDOVar> vars = model.getVars();
for (auto v : vars) {
std::cout << v.get(MDO_StringAttr_VarName) << " = " << v.get(MDO_DoubleAttr_X) << std::endl;
}MDOenv* env;
MDOemptyenv(&env);
MDOstartenv(env);
MDOmodel* model;
double obj;
MDOreadmodel(env, argv[1], filename);
MDOoptimize(model);
MDOgetdblattr(model, MDO_DBL_ATTR_OBJ_VAL, &obj);
printf("Optimal objective value is: %f\n", obj);
/* Free the environment. */
MDOfreemodel(model);
MDOfreeenv(env);MDOEnv env = new MDOEnv();
MDOModel model =new MDOModel(env, filename);
model.optimize();
Console.WriteLine($"Optimal objective value is: {model.Get(MDO.DoubleAttr.ObjVal)}");
MDOVar[] vars = model.GetVars();
for (int i = 0; i < vars.Length; i++)
{
Console.WriteLine($"{vars[i].Get(MDO.StringAttr.VarName)} = {vars[i].Get(MDO.DoubleAttr.X)}");
}model = mindopt_read(file);
result = mindopt(model);
for v=1:length(result.X)
fprintf('%s %d\n', model.varnames{v}, result.X(v));
end
fprintf('Optimal objective value is: %e\n', result.ObjVal);
objval = result.ObjVal;詳細については、「メソッドを呼び出す」をご参照ください。
解決可能な最適化問題の種類
最新バージョンの Optimization Solver は、以下の種類の問題を解決できます。
線形計画法(LP):Optimization Solver は LP 問題を解決できます。主または双対シンプレックス法と内点法(IPM)をサポートし、多数のネットワーク フロー最適化問題を解決できます。
整数計画法:Optimization Solver は、混合整数線形計画法(MILP) 問題を解決するための分枝カット法ソルバーをサポートしています。
非線形計画法:Optimization Solver は、凸 二次計画法(QP) 問題と 半正定値計画法(SDP) 問題を解決できます。
解決可能な最適化問題の種類
最適化問題は、ファイルと外部モデリング ツールを使用し、API 操作を呼び出すことによって入力できます。
方法 1: ファイルを使用して問題を入力する
Optimization Solver は、
.mpsおよび.lpという拡張子を持つファイルを含む MPS ファイルと LP ファイル、そして.mps.gzや.mps.bz2ファイルなどの圧縮ファイルをサポートしています。.dat-sファイル。たとえば、.dat-s ファイルを使用して SDP 問題を入力できます。.qpsフォーマット。たとえば、QP 問題です。mindoptampl モジュールは、
.nlファイルをサポートしています。たとえば、CLI でmindoptampl filename.nlと入力できます。
詳細については、「入力ファイル形式: mps/lp/dat-s」をご参照ください。
方法 2: API 操作を呼び出して問題を入力する
複数 API 操作を呼び出すことで、問題を入力できます。
Python で行ごとに問題を入力する例
mindoptpy.Model.modelsense = MDO.MINIMIZEを呼び出して、ターゲットの目的関数を最小化に設定します。mindoptpy.Model.addVar()を呼び出して、4 つの最適化変数を追加し、変数の上限、下限、目的係数、名前、およびタイプを定義します。mindoptpy.Model.addConstrs()を呼び出して、制約を追加します。
Python で列ごとに問題を入力する例
mindoptpy.Model.modelsense = MDO.MAXIMIZEを呼び出して、ターゲットの目的関数を最小化に設定します。mindoptpy.Model.addConstrs()を呼び出して、指定された左辺値と右辺値(非ゼロ要素なし)で制約を作成します。mindoptpy.Model.Column()を呼び出して、制約の値と非ゼロ要素を順番に保持するための一時的な列オブジェクトを作成します。mindoptpy.Model.addVar()を呼び出して、対応する目的関数係数、列ベクター内の非ゼロ要素、変数の下限と上限、変数名、および変数タイプを含む変数を作成します。
モデルを構築して問題を解決する方法の詳細については、「モデリングと最適化」をご参照ください。属性については、「属性」をご参照ください。さらに詳しい例もご参照ください。
モデリングツール(AMPL、Pyomo、PuLP、MindOpt APLなど)を使用して問題を入力する方法 3
このセクションでは、Optimization Solver でサポートされているモデリングツールについて説明します。
1. MindOpt APL
MindOpt Algebraic Programming Language(MindOpt APLまたはMAPL)は、最適化のための効率的な代数モデリング言語です。さまざまなソルバーをサポートしています。
ブラウザで、最適化問題のモデリングと解決のための クラウドベースのプラットフォームである MindOpt Studio 上で、MindOpt APL を無料で試すことができます。ケース を学習して、MindOpt APL をすぐに使い始めることもできます。ソフトウェアをインストールすることなく、ブラウザで MindOpt APL を使用できます。
構文チュートリアル:ドキュメント。
2. AMPL
AMPL を使用して Optimization Solver を呼び出す前に、Optimization Solver と AMPL をインストール済みであることを確認してください。 mindoptampl モジュールは、インストールパッケージの \bin\mindoptampl に格納されています。 mindoptampl モジュールは、いくつかの設定可能なパラメーターを提供します。 AMPL option コマンドを使用して、mindoptampl_options パラメーターを設定できます。次に例を示します。
ampl: option mindoptampl_options 'numthreads=4 maxtime=1e+4';詳細については、「AMPL」をご参照ください。
3. Pyomo
Pyomo を使用して Optimization Solver を呼び出す前に、Optimization Solver と Pyomo をインストール済みであることを確認してください。 Pyomo API を使用して Optimization Solver を呼び出すには、mindopt_pyomo.py ファイルが必要です。 Pyomo API は、Pyomo の DirectSolver クラスから継承され、その実装コードは、インストールパッケージの \lib\pyomo\mindopt_pyomo.py に含まれています。次のコマンドを実行して、mindopt_pyomo.py ファイルを Python コードにインポートする必要があります。
from mindopt_pyomo import MindoDirect詳細については、「Pyomo」をご参照ください。
4. PuLP
PuLP を使用して Optimization Solver を呼び出す前に、Optimization Solver と PuLP をインストール済みであることを確認してください。 PuLP API を使用して Optimization Solver を呼び出すには、mindopt_pulp.py ファイルが必要です。 PuLP API は、PuLP の LpSolver クラスから継承され、その実装コードは、インストールパッケージの \lib\pulp\mindopt_pulp.py に含まれています。次のコマンドを実行して、mindopt_pulp.py ファイルを Python コードにインポートする必要があります。
from mindopt_pulp import MINDOPT詳細については、「PuLP」をご参照ください。
5. JuMP
JuMP は、Julia プログラミング言語に基づくオープンソースのモデリングツールです。 PuLP を使用して Optimization Solver を呼び出す前に、MindOpt、Julia、JuMP、および AmplNLWriter をインストール済みであることを確認してください。次に、JuMP API を呼び出して、mindoptampl をソルバーとして指定し、モデルオブジェクトを作成する必要があります。
model = Model(() -> AmplNLWriter.Optimizer(mindoptampl))詳細については、「JuMP」をご参照ください。
問題解決のためのパラメーター設定
ソルバーを実行するための入力パラメーターを設定できます。パラメーターの設定方法の詳細については、「オプションの入力パラメーター」をご参照ください。たとえば、MaxTime パラメーターを、ソルバーが問題を解決するために許可される最大時間に設定できます。
コンピューティング デバイス構成リファレンス(LP 問題を解決するために異なるアルゴリズムを使用)
消費されるデバイス リソースは、問題の構造と選択されたアルゴリズムによって異なります。ビジネス要件に基づいてアルゴリズムを選択する必要があります。
Optimization Solver は、シンプレックス法、IPM、および同時最適化法を使用して LP 問題を解決できます。Optimization Solver が次のセクションに示されているプロセスに従って問題を解決する場合、デフォルトで同時最適化法が選択されます。「Method」パラメーターを特定のアルゴリズムに設定できます。
次の表は、3 つのアルゴリズムの違いを示しています。
シンプレックス法 | IPM | 同時最適化法 | |
特徴 | - このアルゴリズムは、数値に対する感度が低いです。 - このアルゴリズムは、メモリ消費量が少なくなります。 - このアルゴリズムは、ウォームスタートをサポートしています。 | - このアルゴリズムは、数値に対する感度が高いです。 - このアルゴリズムは、シンプレックス法の 2 ~ 10 倍のメモリを消費します。 - このアルゴリズムは、ウォームスタートをサポートしていません。 - このアルゴリズムは、多数の問題を解決する必要があるシナリオにより適している可能性があります。 | - 問題を解決するために 2 つのメソッドが同時に使用されるため、より多くのメモリを消費します。 - このアルゴリズムは、より堅牢です。 - 新しいタイプの問題を解決する場合は、最初にこの方法を試してみることをお勧めします。これは、シンプレックス法または IPM のどちらがこのタイプの問題の解決に適しているかを区別するのに役立ち、将来同じタイプの問題を解決する必要がある場合にアルゴリズムの選択を容易にします。 |
コンピューティング デバイスの要件
コンピューティング デバイスの要件は、問題の種類によって異なる場合があります。ビジネス要件に基づいてコンピューティング デバイスを構成する必要があります。次のラボテスト値は参考値です。
シンプレックス | IPM | 同時 | |
シナリオ 1:43,200 の問題の制約と 1,038,761 の非ゼロ要素があります。 | 最大メモリ使用量:350 MB | 最大メモリ使用量:620 MB | 最大メモリ使用量:920 MB |
シナリオ 2:986,069 の問題の制約と 4,280,320 の非ゼロ要素があります。 | 最大メモリ使用量:1,250 MB | 最大メモリ使用量:1,500 MB | 最大メモリ使用量:1,650 MB |
シナリオ 3:4,284 の問題の制約と 11,279,748 の非ゼロ要素があります。 | 最大メモリ使用量:2,050 MB | 最大メモリ使用量:5,200 MB | 最大メモリ使用量:5,200 MB |
シナリオ 4:22,117 の問題の制約と 20,078,717 の非ゼロ要素があります。 | 最大メモリ使用量:3,400 MB | 最大メモリ使用量:5,600 MB | 最大メモリ使用量:8,300 MB |
メモリ使用量は、問題の種類、サイズ、およびスパース性によって異なります。事前にメモリ使用量を見積もりたい場合は、問題のサイズとスパース性に基づいてメモリ使用量を計算し、そのメモリ使用量に特定の倍数を掛けて、最終結果を予約済みメモリ リソースの見積もり値として使用することをお勧めします。
最適化問題の入力方法
CLI を使用する場合
CLI を使用して問題を解決すると、解決プロセスとソリューションの概要が表示され、解決済みファイルと同じ名前の .bas および .sol ソリューション ドキュメントが解決済みファイルの隣に生成されます。
次の例では、mindopt afiro.mps ファイルが実行された後に、afiro.bas ファイルと afiro.sol ファイルが生成されます。.bas ファイルには基底が保持され、.sol ファイルには最適な目的関数値と変数値が保持されます。

API 操作の呼び出しによる方法
問題を入力した後、optimize() を呼び出して問題を解決できます。たとえば、Python では、model.optimize() を呼び出して問題を解決できます。
問題が解決された後、関連する API 操作を呼び出して、解決結果を取得できます。たとえば、Python では次の操作を実行できます。
model.statusを呼び出して、解決ステータスを取得できます。model.objvalを呼び出して、主目的関数の値を取得できます。model.getAttr(MDO.Attr.PrimalObjVal)を呼び出して、主目的関数の値を取得することもできます。同様に、次の操作を実行できます。SolutionTimeを使用して、合計実行時間(秒単位)を取得します。DualObjValを使用して、双対目的関数の値を取得します。ColBasisを使用して、主解の基底を取得します。
var.Xを呼び出して、決定変数の値を取得できます。解の属性の詳細については、「属性」をご参照ください。
完全なサンプルコードについては、インストール パッケージのサンプル フォルダ、または「モデリングと最適化」または「サンプル」をご参照ください。
補助的な解決分析または高度なモデリングツール
制約の不成立分析
最適化問題を解決するためのモデルを構築する場合、特定の制約が互いに競合するため、問題が実行不可能になる可能性があります。実行不可能な問題を分析し、主要な競合制約を特定することは、モデルの構築に役立ちます。問題を実行不可能にする制約の最小サブセットは、縮約不可能な実行不可能システム(IIS)と呼ばれます。
Optimization Solver は、IIS を計算するための API 操作を提供します。infeasible な問題を分析するために操作を呼び出し、分析結果に基づいて IIS 内の制約を変更または削除して、問題を実行可能にすることができます。
次の例は、Python で API 操作を呼び出して IIS を計算する方法を示しています。
if model.status == MDO.INFEASIBLE or model.status == MDO.INF_OR_UBD:
idx_rows, idx_cols = model.compute_iis()IIS の計算方法の詳細については、「制約の競合の分析」をご参照ください。
コールバック
MindOpt は、古典的な分枝限定法を採用して MIP 問題を解決します。MindOpt は、MIP 問題の最適化プロセスを追跡および変更するためのコールバック関数をユーザーに提供します。ユーザーはコールバックを使用して、MIP オプティマイザーの動作を変更できます。これには、次のものが含まれます。
最適解につながらない分岐を切り捨てるために、切断平面を追加します。
MindOpt の分岐選択戦略を変更して、ノード分岐方法と走査順序を制御します。
実行可能なソリューション(たとえば、自己実装のヒューリスティックアルゴリズムによって得られたソリューション)を追加します。適切な実行可能なソリューションは、MindOpt の解決効率を向上させることができます。
def callback(model, where):詳細については、「コールバック」をご参照ください。
MindOpt Tuner
MindOpt Tuner は、ハイパーパラメーター調整ツールです。MindOpt 最適化ソルバーなどのさまざまなオープンソース/商用ソルバーの自動調整をサポートし、特定の問題または問題セットに対するソルバーのパフォーマンスを最大化します。これには、解決時間の短縮やソリューションのギャップの最適化などが含まれます。一方、MindOpt Tuner は MindOpt APL モデリング言語と組み合わせて使用でき、統合されているすべてのソルバーのパラメーター調整をサポートします。
リンク から無料で試用できます。
MindOpt Copilot によるモデリングとコーディングの支援
MindOpt Copilot は、大規模言語モデルから開発された高度な AI ソリューションであり、MindOpt テクノロジーを使用して「数理計画法」の問題を抱えるユーザーを支援するように設計されています。初心者とエキスパートの両方に合わせて調整されており、数理計画法の分野における洞察に満ちたコンサルティング、問題モデリング、およびコーディングを提供します。このプラットフォームは、MindOpt Solver や MindOpt APL などのツールとシームレスに統合されています。さらに、自然言語と表形式データ(.csv ファイル)を解釈する機能により、MindOpt Copilot は自律的に数理モデリングを実行し、数式を生成し、特定のビジネス上の問題を解決するためのコードを作成できます。
リンク から無料で試用できます。
その他
データサニタイズ
コマンドラインで --sanitize を使用して、モデルファイルを非センシティブ化できます。変数名、制約名を Rxx および Cxx の順次エンコード形式に変更し、ビジネス関連の情報をクリアし、数値データのみを保持します。 詳細。
解決プロセス
Optimization Solver の解決プロセス
次の例は、LP 問題の解決方法を示しています。他のタイプの最適化問題を解決する場合、特定のアルゴリズムが自動的に適用されます。

Optimization Solver の API と操作
Optimization Solver の API と操作の詳細については、「MindOpt API リファレンス」をご参照ください。