2. 計算時間の内訳と短縮改善策#

2.1. 説明#

2.1.1. 計算時間の内訳#

最適化計算のルーチンがあったとき,これの実行開始時刻 \(T_{\mathrm{start}}\) と終了時刻 \(T_{\mathrm{end}}\) の差が, 最適化計算にかかる計算時間 \(T := T_{\mathrm{end}} - T_{\mathrm{start}}\) となり,次のように分類できる.

(2.39)#\[T = T_{\mathrm{read}} + T_{\mathrm{expand}} + T_{\mathrm{pre}} + T_{\mathrm{solve}} + T_{\mathrm{post}} + T_{\mathrm{log}}\]

それぞれの時間の内訳は次のとおり.

記号

意味

\(T_{\mathrm{read}}\)

入力データの読み込み時間

\(T_{\mathrm{expand}}\)

式の展開時間

\(T_{\mathrm{pre}}\)

前処理時間 (preprocessing time)

\(T_{\mathrm{solve}}\)

求解処理時間 (elapsed time)

\(T_{\mathrm{post}}\)

後処理時間 (結果出力などの別途実装分)

\(T_{\mathrm{log}}\)

ログ出力時間

2.1.2. 計算時間の短縮改善策#

2.1.2.1. ハードウェアとソフトウェア#

計算時間の短縮を考えた場合, ハードウェア要件 の改善は高々 \(1/N\) のため, これはこれで重要だが劇的な短縮は望めない.

それよりもソフトウェア部分である定式化をまずは見直すことで, 高速化を図ることが基本戦略となる.

具体的には計算時間の内訳からボトルネックを探し出して, 計算時間を短縮させるための改善策を講じることがシステム化ではしばしば重要となる.

2.1.2.2. \(T_{\mathrm{read}}\) の改善#

入力データの読み込み時間を短縮するにはデータ量を減らすしかない. 冗長な入力データになっていないかの確認が中心になる. ただ読み込み時間がボトルネックになることはあまりない.

入力データの中には自明な値として \(0\) の場合は, モデリング言語 SIMPLE の仕様ではわざわざ読み込む必要がないことになっており, この仕様を利用して短縮が期待できる.

2.1.2.3. \(T_{\mathrm{pre}}\)\(T_{\mathrm{post}}\) の改善#

モデリング言語はデータ整形には特化しているとは限らないので, 予め上位側でこれを解決すれば, 最適化計算の時間を短縮することが期待される. つまり最適化計算では純粋に最適化計算のみを切り出すことが基本思想になる.

このために例えば定式化で何かしら必要とされる集合 \(X\) があって, これを作るために \(X = A\cap B\) のような集合演算であるとか, \(X = \{x \mid f(x) = 0 \}\) というような何かしらの条件を満たすように定義されているものだったとしよう.

これら集合演算や条件指定による集合作成は,必ずしも最適化計算の中で行わなくてもよく, 入力データとして集合 \(X\) を用意すれば,それだけ計算コストを削減できるというわけである.

2.1.2.4. \(T_{\mathrm{expand}}\) および \(T_{\mathrm{solve}}\) の改善#

求解時間の短縮は前処理の短縮改善策と被るところがあるが, 以下の表にあるように代表的な改善策を挙げることができる.

改善策

期待改善度合

多次元集合を活用して 疎な記述 の定式化を考える.

特大

ある変数が必ず決まった値になるならば,変数に含めない定式化を考える.

整数変数を連続変数で代用できる定式化を考える.

中~小 (定式化次第)

必ずしも最適化計算する必要のない部分を取り除く.

規模依存

一度に解かず,問題が分割可能かを考える.

規模依存

アルゴリズムオプションを試行する.

汎用性に欠けやすい

2.1.2.5. \(T_{\mathrm{log}}\) の改善#

次のオプションを設定することでログ生成を抑制できて,計算時間を改善できる.

改善策 (設定例)

内容

options.outfilename = "_NULL_";

「解ファイル」の出力抑制

options.noDefaultSolout = 1;

「結果ファイル」の出力抑制

Nuorium Optimizer では最適化計算がなされると, 結果に関する詳細情報を「解ファイル」というファイルに自動的に出力するようになっている.

「解ファイル」はユーザが計算内容の検証やデバッグ用途に用いるため, ファイルサイズが大きく,その出力に無視できない時間を必要とする場合がある.

加えてシステム運用される際に通常ケースでは不要であり, もし出力する指定になっている場合には,ここで計算時間を大幅にロスすることになる. 基本的に「解ファイル」は専らデバッグ用途として,システム運用では抑制することが望ましい.

そして最適化計算を Nuorium 上で GUI として使用している場合は, Nuorium が自動的な結果の要約集計のために「結果ファイル」を出力する設定になっている場合がある. 「結果ファイル」もまたモデル検討時には必要となりえるが,システム運用では抑制することが望ましい.

2.2. 関連#