この最適化ソルバーのユーザーガイドでは、ソルバーの呼び出し方法、問題の入力方法、およびソルバー API のリストについて説明します。
このソフトウェアには多くの API があり、新機能が頻繁に追加されます。詳細な API の説明については、MindOpt ユーザーガイド - 完全版をご参照いただく場合があります。ご不便をおかけしますが、ご了承ください。ドキュメントの言語とバージョンはページ上で切り替えることができます。
最適化ソルバーの呼び出し方法
開始する前に、ソルバーのソフトウェア開発キット (SDK) をダウンロードしてインストールし、必要な権限を取得してください。詳細については、「クイックスタート (アクティベーションと使用方法)」および「ソルバー SDK のダウンロードとインストール」をご参照ください。
以下のセクションでは、簡単な例を示します。ソルバーの呼び出しに関する詳細な手順と完全な例については、詳細をご参照ください。
コマンドライン呼び出しの例
Linux および macOS では、インストール ドキュメントの説明に従って、`$MINDOPT_HOME` 環境変数で指定されたディレクトリに MindOpt をインストールしたと仮定します。
mindopt $MINDOPT_HOME/examples/data/afiro.mpsWindows の場合:
mindopt %MINDOPT_HOME%\examples\data\afiro.mpsC/C++/C#/Java/Python/MATLAB 呼び出しの例
V1.x 以降の API は、V0.x の API とはほとんど異なります。正しいバージョンを使用していることを確認してください。
V1.x
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::endl;
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);
/* 環境を解放します。 */
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;完全なコード例については、詳細をご参照ください。
V0.x
# Method 1: A new model creation method was introduced in version 0.19.0. This method provides faster cloud authentication and consumes less concurrency.
env = mindoptpy.MdoEnv()
model = mindoptpy.MdoModel(env)
model.read_prob(filename)
model.solve_prob()
model.display_results()
# Method 2: The old model creation method is still supported.
# model = mindoptpy.MdoModel()
# model.read_prob(filename)
# model.solve_prob()
# model.display_results()//<dependency>
// <groupId>com.alibaba.damo</groupId>
// <artifactId>mindoptj</artifactId>
// <version>[0.20.0,)</version>
//</dependency>
// 以下のように、ダイナミックリンクライブラリをロードします。
Mdo.load("c:\\mindopt\\0.20.0\\win64_x86\\lib\\mindopt_0_20_0.dll");
// 方法 1: バージョン 0.19.0 で導入された新しいモデル作成方法。この方法は、より高速なクラウド認証を提供し、消費する同時実行数を削減します。
// プログラムの初期化中に環境を設定します。たとえば、MapReduce のセットアップフェーズなどです。
MdoEnv env = new MdoEnv();
// モデルを作成します。
MdoModel model = env.createModel();
model.readProb(filename)
model.solveProb();
model.displayResult();
model.free();
// Java SDK では、プログラムの最後に手動で env を解放する必要があります。たとえば、MapReduce のクリーンアップフェーズなどです。
env.free();
// 方法 2: 古いモデル作成方法は引き続きサポートされていますが、非推奨とマークされており、将来のバージョンで削除される予定です。
/*
MdoModel model = new MdoModel();
model.readProb(filename)
model.solveProb();
model.displayResult();
*/// Method 1: A new model creation method was introduced in version 0.19.0. This method provides faster cloud authentication and consumes less concurrency.
using mindopt::MdoEnv;
MdoEnv env;
MdoModel model(env);
model.readProb(filename);
model.solveProb();
model.displayResults();
// Method 2: The old model creation method is still supported.
/*
MdoModel model;
model.readProb(filename);
model.solveProb();
model.displayResults();
*/// Method 1: A new model creation method was introduced in version 0.19.0. This method provides faster cloud authentication and consumes less concurrency.
MdoEnvPtr env;
MdoMdlPtr model;
Mdo_createEnv(&env);
Mdo_createMdlWithEnv(&model, env);
Mdo_readProb(model, filename);
Mdo_solveProb(model);
Mdo_displayResults(model);
Mdo_freeMdl(&model);
// The C SDK requires you to manually release the env.
Mdo_freeEnv(&env);
// Method 2: The old model creation method is still supported.
/*
MdoMdlPtr model;
Mdo_createMdl(&model);
Mdo_readProb(model, filename);
Mdo_solveProb(model);
Mdo_displayResults(model);
Mdo_freeMdl(&model);
*/完全なコード例については、V0.x ドキュメントをご参照ください。
サポートされる最適化問題
現在のバージョンのソルバーは、以下をサポートしています。
線形計画:ソルバーは、線形計画 (LP) 問題を解決するための包括的な機能を提供します。主/双対シンプレックス法と内点法をサポートしています。また、大規模なネットワークフロー最適化問題の解決もサポートしています。
整数計画:ソルバーは、混合整数線形計画 (MILP) 問題に対する分枝カット法をサポートしています。
非線形計画:ソルバーは、凸2次計画 (QP) 問題と半正定値計画 (SDP) 問題をサポートしています。
最適化問題の入力方法
最適化問題は、ファイル、データモデリング API、または外部モデリングツールの呼び出しの 3 つの方法で入力できます。
方法 1:ファイル入力
ソルバーは、MPS フォーマットとLP フォーマット (例:
.mps、.lpファイル) およびその圧縮版 (例:.mps.gz、.mps.bz2) をサポートしています。ソルバーは、SDP 問題の例で使用される
.dat-sフォーマットをサポートしています。ソルバーは、QP 問題データに使用される
.qpsフォーマットをサポートしています。mindoptamplモジュールは.nlファイル入力をサポートしています。たとえば、`mindoptampl filename.nl` コマンドを実行できます。
詳細については、詳細をご参照ください。
方法 2:モデリング API 入力
V1.x 以降の API は、V0.x の API とはほとんど異なります。正しいバージョンを使用していることを確認してください。
V1.x
行単位のデータ入力をサポートする複数の関連 API が利用可能です。
以下は、簡単な Python の例です。
mindoptpy.Model.modelsense = MDO.MINIMIZEを使用して、目的関数を最小化に設定します。mindoptpy.Model.addVar()を使用して、最適化変数を追加し、その下限、上限、目的係数、名前、およびタイプを定義します。mindoptpy.Model.addConstrs()を使用して、制約を追加します。
詳細については、詳細をご参照ください。属性のリストについては、詳細をご参照ください。API の章には、各言語の完全な例も含まれています。
V0.x
複数の関連 API が利用可能で、同じデータをさまざまな方法で入力できます。
以下は、行単位入力の簡単な Python の例です。
mindoptpy.MdoModel.set_int_attr()を使用して、目的関数を最小化に設定します。mindoptpy.MdoModel.add_var()を使用して、4 つの最適化変数を追加し、その下限、上限、名前、およびタイプを定義します。mindoptpy.MdoModel.add_cons()を使用して、制約を追加します。
以下は、列単位入力の簡単な Python の例です。
mindoptpy.MdoModel.set_int_attr()を使用して、目的関数を最小化に設定します。まず、
mindoptpy.MdoModel.add_cons()を呼び出して、指定された左辺値と右辺値を持つが、非ゼロ要素のない制約を作成します。一時的な列オブジェクト
mindoptpy.MdoCol()を作成して、制約と非ゼロ要素の値を順次格納します。最後に、
mindoptpy.MdoModel.add_var()を呼び出して、対応する目的関数係数、列ベクトルの非ゼロ要素、下限と上限、変数名、および変数タイプを持つ新しい変数を作成します。
詳細については、V0.x ドキュメントをご参照ください。モデル属性のリストについては、V0.x ドキュメントをご参照ください。
方法3:モデリング言語 MindOpt APL、AMPL、Pyomo、PuLP、JuMP
モデリング言語を使用する利点は、その API を使用して、異なるソルバーバージョン間で簡単に切り替えられるモデルを構築できることです。
MindOpt は、以下を含むいくつかの一般的なモデリングツールをサポートしています。
1. MindOpt APL
MindOpt チームが開発したモデリング言語である MindOpt APL のサポートは、2022 年に導入されました。
MindOpt オンラインモデリング・求解プラットフォームで、ブラウザ上でモデリング言語とソルバーを無料で使用できます。このプラットフォームには、すぐに使い始めるのに役立つケーススタディも含まれています。ソフトウェアのインストールは不要です。ブラウザを開くだけで使用できます。
その他の構文ドキュメントについては、詳細をご参照ください。
2. AMPL
AMPL を使用して MindOpt を呼び出す前に、MindOpt と AMPL をインストールする必要があります。mindoptampl アプリケーションは、インストールパッケージの `\bin\mindoptampl` ディレクトリにあります。mindoptampl は設定可能なパラメーターを提供します。AMPL の option コマンドを使用して、`mindoptampl_options` パラメーターを設定できます。例:
ampl: option mindoptampl_options 'numthreads=4 maxtime=1e+4';詳細情報および使用例については、「」および「詳細」をご参照ください。
3. CVXPY
CVXPY を使用して MindOpt を呼び出す前に、MindOpt と CVXPY をインストールする必要があります。MindOpt ソルバーの CVXPY API を呼び出すには、まず mindopt_conif.py と mindopt_qpif.py インターフェイスファイルをインポートする必要があります。これらのファイルは、Python コードで次のようにインポートします。
from mindopt_conif import *
from mindopt_qpif import *詳細と例については、詳細をご参照ください。
4. Pyomo
Pyomo を使用して MindOpt を呼び出す前に、MindOpt と Pyomo をインストールする必要があります。MindOpt ソルバーの Pyomo API を呼び出すには、mindopt_pyomo.py インターフェイスファイルを使用する必要があります。MindOpt Pyomo インターフェイスは、Pyomo の DirectSolver クラスを継承しています。実装コードは、インストールパッケージの \lib\pyomo\mindopt_pyomo.py ファイルにあります。このファイルは、Python コードで次のようにインポートします。
from mindopt_pyomo import MindoptDirect詳細と例については、詳細をご参照ください。
5. PuLP
PuLP を使用して MindOpt を呼び出す前に、MindOpt と PuLP をインストールする必要があります。MindOpt ソルバーの PuLP API を呼び出すには、mindopt_pulp.py インターフェイスファイルを使用する必要があります。MindOpt PuLP インターフェイスは、PuLP の LpSolver クラスを継承しています。実装コードは、インストールパッケージの \lib\pulp\mindopt_pulp.py ファイルにあります。このファイルは、Python コードで次のようにインポートします。
from mindopt_pulp import MINDOPT詳細については、「詳細」をご参照ください。
6. JuMP
JuMP は、Julia プログラミング言語に基づくオープンソースのモデリングツールです。JuMP を使用して MindOpt を呼び出す前に、MindOpt、Julia、JuMP、および AmplNLWriter をインストールする必要があります。JuMP API を呼び出してモデリングオブジェクトを作成し、`mindoptampl` をソルバーとして指定します。
model = Model(() -> AmplNLWriter.Optimizer(mindoptampl))詳細については、「詳細」をご参照ください。
ソルビング時のパラメーター設定
ソルバーを実行するときに、入力パラメーターを設定できます。V1.x のドキュメントについては、パラメーターの章をご参照ください。たとえば、"MaxTime" を使用して、ソルバーの最大求解時間を設定できます。V0.x のドキュメントについては、オプションの入力パラメーターの章をご参照ください。
計算デバイス構成の参考:LP ソルビングにおける各種アルゴリズムの特性
マシンリソースを構成する際、消費されるリソースの量は、問題の構造と選択されたアルゴリズムによって異なります。必要に応じてテストし、構成を選択する必要があります。
LP 求解では、現在、シンプレックス法、内点法 (IPM)、および並列最適化アルゴリズムを提供しています。実行フローは、以下の「実行フロー」の図に示されています。デフォルトでは並列アルゴリズムが選択されます。「Method」パラメーターを設定して、異なるアルゴリズムを選択できます。
これら 3 つのアルゴリズムの違いは次のとおりです。
シンプレックス法 | 内点法 (IPM) | 並列 (同時最適化) | |
特徴 | - 数値的な問題に対して一般に感度が低い - メモリをあまり消費しない - ウォームスタートをサポート | - 数値的な問題に対してより敏感 - シンプレックス法よりも 2~10 倍多くのメモリを消費 - ウォームスタートをサポートしない - 大規模な問題により適している可能性がある | - 両方のメソッドを同時に使用して最適化するため、より多くのメモリを消費 - より堅牢 - 新しいカテゴリの問題を解決する場合、最初にこの方法を試して、シンプレックス法と IPM のどちらがより適しているかを判断できます。これは、将来のアルゴリズム選択に役立ちます。 |
コンピューティングデバイスの要件 要件は問題によって大きく異なる場合があります。実際のテスト結果を基準として使用してください。以下のラボテスト値は参考用です。 | |||
制約数が 43,200、非ゼロ要素数が 1,038,761 の場合 | テストされた最大メモリ使用量は 350 MB | テストされた最大メモリ使用量は 620 MB | テストされた最大メモリ使用量は 920 MB |
制約数が 986,069、非ゼロ要素数が 4,280,320 の場合 | テストされた最大メモリ使用量は 1250 MB | テストされた最大メモリ使用量は 1500 MB | テストされた最大メモリ使用量は 1650 MB |
制約数が 4,284、非ゼロ要素数が 11,279,748 の場合 | テストされた最大メモリ使用量は 2050 MB | テストされた最大メモリ使用量は 5200 MB | テストされた最大メモリ使用量は 5200 MB |
制約数が 22,117、非ゼロ要素数が 20,078,717 の場合 | テストされた最大メモリ使用量は 3400 MB | テストされた最大メモリ使用量は 5600 MB | テストされた最大メモリ使用量は 8300 MB |
- メモリ消費量は、問題の形式、規模、スパース性に依存します。事前にメモリリソースを見積もるには、まず問題の規模とスパース性に基づいてメモリ消費量を計算し、その値に特定の係数を掛けて予約メモリリソースの推定値を得ることができます。
ソリューションの結果の取得
コマンドライン実行
コマンドラインからソルバーを実行すると、求解プロセスの出力と結果の概要が出力されます。また、問題ファイルと同じディレクトリに、同じ名前の .bas および .sol 結果ファイルが生成されます。
次の図は、mindopt afiro.mps コマンドを実行した後、フォルダー内に afiro.bas と afiro.sol ファイルが生成されることを示しています。.bas ファイルは基底を保存し、.sol ファイルは最適目的値と変数値の解を保存します。

API による求解と結果の取得
V1.x 以降の API は、V0.x の API とはほとんど異なります。正しいバージョンを使用していることを確認してください。
V1.x
解決する問題を入力した後、optimize() API を呼び出して解決します。たとえば、Python コマンドは model.optimize() です。
ソルビング後、API を呼び出して結果を取得できます。以下の例は Python を使用しています。
model.statusを呼び出して求解ステータスを取得します。考えられるステータスには、UNKNOWN、OPTIMAL、INFEASIBLE、UNBOUNDED、INF_OR_UBD、SUB_OPTIMAL があります。たとえば、Python ではMDO.OPTIMALです。model.objvalを使用して目的値を取得します。また、
model.getAttr(MDO.Attr.PrimalObjVal)を呼び出して、他のモデル属性値を取得することもできます。同様に:SolutionTime:合計実行時間 (秒)DualObjVal:双対目的値ColBasis:主解の基底
var.Xを呼び出して変数の解を取得します。その他の解属性のリストについては、詳細をご参照ください。
完全なコード例については、インストールパッケージの `example` フォルダー、詳細のドキュメント、または各言語の API ドキュメントの例の章 (Python の例など) をご参照ください。
V0.x
解決する問題を入力した後、solveProb API を呼び出して解決します。たとえば、Python コマンドは model.solve_prob() です。
ソルビング後、API を呼び出して結果を取得できます。以下の例は Python を使用しています。
model.display_results()を呼び出して結果を出力します。model.get_status()を呼び出して求解ステータスを取得します。model.get_real_attr("PrimalObjVal")を呼び出して主目的値を取得します。同様に:"DualObjVal":双対目的値"PrimalSoln":主解"ColBasis":主解の基底その他の解属性のリストについては、V0.x ドキュメントをご参照ください。
完全なコード例については、インストールパッケージの `example` フォルダーまたはドキュメントをご参照ください。
解分析ツールおよび高度なモデリング手法
制約の実行不可能性分析
モデリングと求解のプロセス中に、矛盾する制約によって引き起こされる実行不可能な問題に遭遇することがあります。実行不可能な問題を分析し、矛盾を引き起こす主要な制約を特定することは、モデリングに大いに役立ちます。問題を実行不可能にする制約の最小サブセットは、既約不実行可能システム (IIS) と呼ばれます。
MindOpt は、IIS を計算するための API を提供します。問題が "INFEASIBLE" の場合、IIS 計算 API を使用して実行不可能な問題を分析できます。たとえば、IIS 内の制約を変更または削除して、最適化問題を実行可能にすることができます。
以下は、IIS Python インターフェイスを呼び出す方法の例です。
V1.x
if model.status == MDO.INFEASIBLE or model.status == MDO.INF_OR_UBD:
idx_rows, idx_cols = model.compute_iis()IIS の計算に関する完全な手順については、詳細をご参照ください。
V0.x
status_code, status_msg = model.get_status()
if status_msg == "INFEASIBLE":
idx_rows, idx_cols = model.compute_iis()IIS の計算に関する完全な手順については、V0.x ドキュメントをご参照ください。
コールバック
MindOpt は、古典的な分枝限定法を使用して MIP 問題を解決します。コールバック機能を使用すると、求解プロセスを追跡し、次のような決定を下してソルバーをガイドできます。
最適解を含まないブランチを刈り込むためにカット平面を追加する。
MindOpt の分岐選択戦略に介入して、ノード二分法と走査順序を制御する。
カスタムの実行可能解 (ヒューリスティックアルゴリズムによって得られた解など) を追加する。良好な実行可能解は、MindOpt の求解効率を向上させることができます。
次のようにコールバック関数を作成できます。
def callback(model, where):コールバックに関する完全な手順については、詳細をご参照ください。
ソルバーのパラメーターチューニング
MindOpt Tuner は、ソルバーのハイパーパラメーター最適化も実行できます。ビジネスシナリオのデータを提供し、MindOpt Tuner を使用できます。パラメーターチューニング後、ビジネスシナリオに合わせてカスタマイズされた、より高速なソルバーを取得できます。一部の機能は現在、MindOpt クラウドプラットフォームで利用できます。
AI エンジニアによるモデリング支援
AI エンジニアは、大規模言語モデル (LLM) 上に構築され、特定領域のソフトウェアツールの知識と統合されて、基本的な技術コンサルティングを提供する AI ロボットです。MindOpt Copilot は、MindOpt テクノロジーを使用して数理最適化問題を解決するのに役立つ AI エンジニアです。数理最適化の分野での技術コンサルティングに使用できます。
現在、MindOpt Copilot AI エンジニアは、MindOpt Solver や MindOpt APL モデリング言語などのツールをサポートしています。自然言語と表形式データを通じて通信し、ビジネス問題に基づいてタスクを自動的に実行します。これらのタスクには、数理モデリング、数式の策定、コードの記述、MindOpt ソフトウェアを呼び出して問題を解決することが含まれます。また、生成したテキスト、数式、コードからプロジェクトを生成することもでき、開発プロジェクトに迅速にインポートできます。
2023 年 9 月に初めてリリースされ、MindOpt クラウドプラットフォームで利用できます。
その他の機能
データマスキング
MindOpt コマンドラインには --sanitize オプションが含まれており、マスクされたモデルファイルを生成できます。これにより、技術交流やソルバーのパラメーターチューニングおよび改善のためにデータを送信するのに便利です。
ソルバーの実行フロー
MindOpt の実行フロー:
最適化問題が異なれば解決方法も異なりますが、全体的なフローは似ています。以下は、LP 問題の呼び出しフローの例です。プロセス中に、特定のパラメーターを設定できます。

完全な API と呼び出し方法
完全な手順については、MindOpt ユーザーガイド - 完全版をご参照ください。
目次は次のとおりです。