LP ファイルの形式は、数理最適化問題(線形計画問題など)を記述するための拡張子「.lp」を持つテキストファイルです。docplexやpulpなどで作ったモデルもLPファイルで出力することができます。
このLPファイルをSaaS環境のwatsonx.ai StudioのDecision Optimizationで読み込んで最適解を得てみます。
Decision Optimizationのエクスペリメントの作成
あらかじめwatsonx.ai Runtimeにデプロイメント・スペースを作っておきます。
watsonx.ai Runtimeのデプロイメント・スペースの作成 #WML - Qiita
任意の名前をつけてMachine Learning(watsonx.ai Runtime)サービスの追加を選びます。
watsonx.ai Runtimeのサービスを関連付けます。
作っておいたデプロイメント・スペースを選び、「作成」します。
lpファイルの読み込み
以下のサンプルのLPファイルを読み込みます。gz形式やbz2形式で圧縮されていても読み込むことができます。
Maximize
obj: 2 x2 + 3 x3
Subject To
c1: x2 + x3 - x1 <= 20
c2: - 3 x2 + x3 + x1 <= 30
Bounds
0 <= x1 <= 40
All other variables are >= 0.
CPLEXのフォーマットを選びファイルを追加をクリックします。
sample.lpを選びます。
インポートをクリックします。
MODELタブに読み込まれます。実行ボタンで実行します。
以下のように実行を開始されます。
実行が完了すると、結果のタブに目的関数の値がでます。ここでは162.500が返っています。
詳細の確認のためにはソリューションのダウンロードを行います。
ソリューション
目的関数は162.5です。
Name,Value
PROGRESS_CURRENT_OBJECTIVE,162.5
決定変数は以下です。
変数名 | 値 |
---|---|
x1 | 40 |
x2 | 17.5 |
x3 | 42.5 |
<CPLEXSolution version="1.2">
<header primalFeasible="1" solutionTypeValue="1" solutionMethodString="dual" writeLevel="1" objectiveValue="162.5" solutionTypeString="basic" problemName="model.lp" solutionStatusString="optimal" solutionStatusValue="1" simplexIterations="3" dualFeasible="1"/>
<quality maxPi="2.75" maxRedCost="2.5" epRHS="9.9999999999999995e-07" maxDualResidual="0" maxX="42.5" maxPrimalResidual="0" maxPrimalInfeas="0" maxSlack="0" kappa="3" epOpt="9.9999999999999995e-07" maxDualInfeas="0"/>
<linearConstraints>
<constraint dual="2.75" slack="0" name="c1" index="0" status="LL"/>
<constraint dual="0.25" slack="0" name="c2" index="1" status="LL"/>
</linearConstraints>
<variables>
<variable reducedCost="0" name="x2" index="0" value="17.5" status="BS"/>
<variable reducedCost="0" name="x3" index="1" value="42.5" status="BS"/>
<variable reducedCost="2.5" name="x1" index="2" value="40" status="UL"/>
</variables>
</CPLEXSolution>
経過時間(elapsedTime)は約0.0010秒です。
Name,Value
job.coresCount,1
job.inputsReadMs,1901
job.memoryPeakKB,98860
cplex.size.integerVariables,0
cplex.size.linearConstraints,2
cplex.size.semiintegerVariables,0
cplex.size.quadraticConstraints,0
cplex.size.constraints,2
cplex.modelType,LP
cplex.size.variables,3
cplex.size.continuousVariables,3
cplex.size.booleanVariables,0
cplex.size.semicontinuousVariables,0
cplex.solve.elapsedTime,9.629726409912109E-4
cplex.solve.iterationCount,3
job.modelProcessingMs,677
[2025-09-18T06:27:31.803Z, INFO] CPLEX version 22010200
[2025-09-18T06:27:32.327Z, WARNING] Changed parameter CPX_PARAM_THREADS from 0 to 1
[2025-09-18T06:27:32.328Z, INFO] Param[1,067] = 1
[2025-09-18T06:27:32.342Z, INFO] Param[1,130] = UTF-8
[2025-09-18T06:27:32.343Z, INFO] Param[1,132] = -1
[2025-09-18T06:27:32.344Z, WARNING] Warning, line 7: Name 'Allothervariablesare' does not exist.
[2025-09-18T06:27:32.345Z, WARNING] Warning: 'End' missing.
[2025-09-18T06:27:32.347Z, INFO] Version identifier: 22.1.2.0 | 2024-11-26 | 0edbb82fd
[2025-09-18T06:27:32.363Z, INFO] CPXPARAM_Threads 1
[2025-09-18T06:27:32.364Z, INFO] CPXPARAM_Output_CloneLog -1
[2025-09-18T06:27:32.365Z, INFO] CPXPARAM_Read_APIEncoding "UTF-8"
[2025-09-18T06:27:32.366Z, INFO] Tried aggregator 1 time.
[2025-09-18T06:27:32.367Z, INFO] No LP presolve or aggregator reductions.
[2025-09-18T06:27:32.367Z, INFO] Presolve time = 0.00 sec. (0.00 ticks)
[2025-09-18T06:27:32.368Z, INFO] Iteration log . . .
[2025-09-18T06:27:32.370Z, INFO] Iteration: 1 Dual infeasibility = 2.999999
[2025-09-18T06:27:32.387Z, INFO] There are no bound infeasibilities.
[2025-09-18T06:27:32.388Z, INFO] There are no reduced-cost infeasibilities.
[2025-09-18T06:27:32.402Z, INFO] Maximum Ax-b residual = 0
[2025-09-18T06:27:32.403Z, INFO] Maximum c-B'pi residual = 0
[2025-09-18T06:27:32.403Z, INFO] Maximum |x| = 42.5
[2025-09-18T06:27:32.404Z, INFO] Maximum |slack| = 0
[2025-09-18T06:27:32.405Z, INFO] Maximum |pi| = 2.75
[2025-09-18T06:27:32.406Z, INFO] Maximum |red-cost| = 2.5
[2025-09-18T06:27:32.407Z, INFO] Condition number of unscaled basis = 3.0e+00
[2025-09-18T06:27:32.408Z, INFO] optimal (1)
パラメーターの指定
CPLEXのパラメーターを指定して実行したい場合「.prm」のファイルにCのパラメーターを記述して準備します。
例えば以下のパラメーターCPXPARAM_MIP_Tolerances_MIPGapを変更してみます。
CPXPARAM_MIP_Tolerances_MIPGap 0.5
+
をクリックしてファイルのインポートを選びます。
パラメーターが読み込まれました。実行をしてみます。
ログをみると以下のようにパラメーターが変更されて実行されたことがわかります。
サンプルファイル
- テスト環境
- CP4DaaS 20-25-09-18
- CPLEX version 22010200
参考
Decision OptimizationのエクスペリメントでのCPU数メモリの変更 #cp4daas - Qiita
Decision Optimization エクスペリメント へのモデルのインポート - IBM Documentation
CPLEXのInteractive OptimizerでLPファイルの問題を解く
ローカルのコマンドでLPファイルの問題を解く記事です。