よくあるご質問
MIDACOに関する一般的なご質問をご紹介します。
MIDACOのコンパイルや実行時に起こりうる問題についてはトラブルシューティング▷をご覧ください
質問:MIDACOはどのように引用すればいいですか?
▼
答え:MIDACOをソフトウェアとしてを引用する場合は以下をご利用ください。
Schlueter M., Erb S., Gerdts M., Kemble S., Rückmann J.J. |
MIDACO on MINLP Space Applications |
Advances in Space Research (Elsevier), Vol 51, Issue 7, Pages 1116–1131 (2013) [BibTex] |
MIDACOが搭載するACOアルゴリズムについてとくに引用する場合は、以下をご利用ください。
Schlueter M., Egea J.A., Banga J.R. |
Extended Ant Colony Optimization for non-convex Mixed Integer Nonlinear Programming |
Computers & Operations Research (Elsevier), Vol. 36 , Issue 7, Pages 2217-2229 (2009) [BibTex] |
MIDACOの制約条件の取り扱いについてとくに引用する場合は、以下をご利用ください。
Schlueter M., Gerdts, M. |
The Oracle Penalty Method |
Journal of Global Optimization (Springer), Vol. 47, Issue 2, Pages 293-325 (2010) [BibTex] |
MIDACOの引用ありがとうございます
質問:最大化問題を最小化問題に書き換える方法は?
▼
答え:最大化問題は、次のように目的関数の符号を変えると簡単に最小化問題に書き換えることができます。
F(X) = - F(X)
質問:下限値と上限値(XL&XU)の選び方は?
▼
答え:問題の下限値(XL)と上限値(XU)は、常に事例特有の選択になります。一般的に、限界値はMIDACOのパフォーマンスに重要な影響を及ぼすため、できる限り狭く設定するべきです。可能であれば、縮小および拡大すべき限界値を特定するために、「バウンズ・プロファイル(BOUNDS-PROFIL)」の利用をおすすめします。
質問:MIDACOでは変数の限界値を0から1の間にスケーリングすることが必要になりますか?
▼
答え:いいえ、その必要はありません。いくつかのアルゴリズム(特にSQP)では限界値をゼロと1の間にスケーリングすることが必要になる場合がありますが、MIDACOではそうしたスケーリングの制限はまったく不要で、下限値と上限値は任意の値に設定できます。ただし、探索空間が大きいと収束が遅くなることが多いため注意が必要です。これはMIDACOが探索空間のすべてをサンプリングするためです。したがって、境界はできるだけ狭く設定することをおすすめします。
質問:開始点の選び方は?
▼
答え:一般に、開始点(初期点または初期解とも呼ばれる)は、MIDACOのパフォーマンスにはあまり影響を及ぼしません。もし良い開始点が利用できる場合は、FOCUSパラメータと組み合わせて使用することをおすすめします(ユーザーマニュアルを参照)。特定の開始点を使用することは、解の精度向上(例えば、制約の実現可能性の精度向上)に有効です。
質問:変数をバイナリ(二値)に設定する方法は?
▼
答え:問題の次元を設定する際に、変数のタイプを「整数」に設定します。次に、下限値(XL)を0.0、上限(XU)を1.0に設定します。
質問:二重制約を一重制約に書き換える方法は?
▼
答え:LOWER < G(X) < UPPER の形の制約は、次のように二つの個別の一重制約に変換できます。
G(X) > LOWER
−G(X) > -UPPER
質問:「制約G(X)の違反」とはどういう意味ですか?
▼
答え:「G(X)の違反」(VIO)は、制約の実行可能性を測定します。特に、VIOは実行可能ではないG(X)の全項目に対するL1ノルム(全絶対値の合計)となります。VIO=0の場合、すべての制約がデフォルトの精度(0.001)またはPRAM(1)で定義されたユーザー指定の精度で実行可能です。
質問:変数が離散集合(カタログなど)でなければならない場合の解き方はどうなりますか?
▼
答え:最適化変数がいくつかの離散集合(カタログなど)の値を取る必要がある場合、変数の変換が必要です。例えば、変数 X(i)が4つの値(0.3、0.5、0.7、1.2)のいずれかに制限される必要があるとします。
この場合、以下のマッピングにより、この変数を整数集合{1, 2, 3, 4}からカスタム値集合 {0.3, 0.5, 0.7, 1.2} へ変換します。
IF( X(i) == 1 ): X(i) = 0.3
IF( X(i) == 2 ): X(i) = 0.5
IF( X(i) == 3 ): X(i) = 0.7
IF( X(i) == 4 ): X(i) = 1.2
なお、変数名は X(i) から別の名前に変更することをお勧めします(たとえば「Z」)。
IF( X(i) == 1 ): Z1= 0.3
IF( X(i) == 2 ): Z1= 0.5
IF( X(i) == 3 ): Z1= 0.7
IF( X(i) == 4 ): Z1= 1.2
変数名を変更しない場合は、以下の再変換が必要です。
IF( X(i) == 0.3 ): X(i) = 1
IF( X(i) == 0.5 ): X(i) = 2
IF( X(i) == 0.7 ): X(i) = 3
IF( X(i) == 1.2 ): X(i) = 4
多くの言語(C/C++やFortranなど)では、戻り値の引数に関する理由から、このような再変換が必要となります。
質問:MIDACOパラメータの設定方法は?
▼
答え:MIDACOパラメータの設定方法についてはユーザーマニュアルを参照してください。なお、MIDACOはデフォルトでいわば「自動操縦」モードで実行されるため、パラメータの調整は不要です。
質問:MIDACOを用いた非線形方程式系の解き方はどうなりますか?
▼
答え:MIDACOは、(非線形)等式制約が多数存在する問題を解く性能を備えています。したがってMIDACOは、目的関数F(X)が存在しない一般的な非線形方程式系(non-linear equation systems 、NLES)の求解にも利用できます。MIDACOでNLESを解くためには、目的関数に一定の値(たとえばF(X)=0)を与えるか、(等式)制約の一つを目的関数として設定します(たとえばF(X) = |G(1)|)。その際、最も難しい制約を(制約関数としてではなく)目的関数として定式化し、MIDACOはORACLEパラメータと共に呼び出すことをおすすめします。こうしたシナリオでは、目的関数が実際には等式制約を表すため、適切なORACLEパラメータを簡単にゼロに近い値(例:0.05または0.1)で選ぶことができます。
質問:MIDACOをサイレントで実行(すべてのプリントを停止)する方法は?
▼
答え:オプションを PRINTEVAL= 0 および SAVE2FILE = 0に設定してください。すべてのプリントコマンドがオフになります。
質問:問題関数に追加の入力/出力引数を渡す方法は?
▼
答え:問題関数に追加の引数を渡す一般的な方法は、グローバル変数を使用することです。この方法はMIDACOの基礎構造とは独立しており、多くの場合でうまく機能します。
問題関数に追加の入力/出力引数を渡すもう一つの方法は、問題関数の呼び出しを直接変更することです。この方法の利点は、グローバル変数を使用するよりも実行時間が(わずかに)速くなる可能性があることです。このように直接変更するアプローチは、ユーザーマニュアルのセクション1.3で詳しく説明されています。
質問:問題関数の名前の変更の仕方は?
▼
答え:問題関数はどのような名前にも簡単に変更可能です。ユーザーマニュアルのセクション1.3を参照してください。
質問:MIDACOの実行時間を秒ではなくミリ秒で測定する方法は?
▼
答え:ほとんどのプログラミング言語で、MIDACOの実行時間は秒単位で表示されます。しかし、多くの問題(特に小規模な問題やベンチマークテスト)において、MIDACOは、1秒未満で解に到達します。こうした事例で、実行時間をミリ秒単位で知りたい場合は、簡単な推定を行うことができます。
たとえば、ある問題の求解に評価が12,345回必要であり、実行時間が0秒と表示される場合、より大きな評価回数(例:10,000,000回の評価)で実行し、対応する実行時間を記録します(たとえば、10,000,000回の評価に30秒)。そうすれば、もとの(少ない)評価回数のCPU実行時間が、以下のようにミリ秒単位で推定できます。
12345 * ( 30 / 10000000 ) = 0.037035秒 = 37ミリ秒
質問:【Matlab/ Octave】MIDACOを実行する際に毎回MEXコマンドが必要ですか?
▼
A:いいえ。MEXコマンド「mex midacox.c」はライブラリファイル作成のために一度のみ必要です。システム上にMIDACO DLL/MEXライブラリファイルが生成された後は、このコマンドを再度実行する必要はありません。
質問:【多目的最適化】MIDACOは目的関数をスケーリングする必要がありますか?
▼
答え:いいえ。目的関数の値はそのままの形でMIDACOに渡すことができます。例えば、最初の目的関数の値が0から1の間にある一方で、2番目の目的関数の値が−100000から100000の間で大きく変動する、といった場合でも問題ありません。MIDACOはこれらの値を完全に自動で内部アルゴリズムの処理のためにスケーリングします。
質問:【多目的最適化】パレートフロントに沿うバランスの取れた解の配置について
▼
答え:MIDACOの解のパレートフロントに沿った配置は、最適化プロセスにおいて完全に自動かつリアルタイムで行われます。これは、最適化プロセス中に、パレートフロントの予測される場所とは異なる部分に、MIDACOの解が一時的に配置される可能性があることを意味します。たとえば、MIDACOがデフォルトで実行されると、解はパレートフロントの中央に配置されることが期待されますが、そうならずに、フロントの端に近い場所に配置されることがあります。こうした配置のずれはアルゴリズムのプロセスの一部であり、通常はMIDACOにより迅速に修正されます。ただし、特に最初の数十回または数百回の評価中には、これらの配置のずれが一時的に発生する場合があります。
質問:【多目的最適化】PlotTool.exeがアンチウイルスソフトに検出されます
▼
答え:一部のアンチウイルスソフトウェアは、PlotTool.exeを検出/ブロックするかもしれません。これは誤検出で、PlotToolには有害なコードは含まれておらず、データのアップロード/ダウンロードは行いません。ただし、PlotToolやこのウェブページ上で提供される他の素材については、ご自身の責任でのご利用をお願いします。
質問:MIDACOは多目的最適化ための並列化をサポートしていますか?
▼
答え:はい。MIDACOの並列化機能は、多目的最適化、大規模問題、および混合整数問題を含むすべての問題タイプに完全に対応しています。これは、極端な場合でいえば、MIDACOを使用して【超並列化による多目的大規模MINLP問題】の求解が可能であることを意味します。
(MIDACOが求解した多目的大規模MINLPの例は、こちら▷を参照してください)
質問:並列化を利用するべきですか?
▼
答え:並列化は、目的関数や制約条件の評価にCPU時間を多く要する場合には非常に効果的です。つまり、F(X)やG(X)の1回の評価に多くの時間が必要なことを意味します。しかし、こうした評価にCPU時間があまりかからない場合は、並列化は一般的に推奨されません。実際、CPU時間が少ない問題では、並列化によりスケジューラのオーバーヘッドが発生し、全体の時間が増加する可能性もあります。CPU時間が少ない問題の場合、異なるランダムシードを使用して、MIDACOを独立して複数回実行する方が、通常はより効果的です。
特別なケースとして、評価にかかるCPU時間が大きく変動する場合があります。たとえば、ある評価には数秒から数分かかる一方で、他の評価は数ミリ秒しかかからない場合です。このような場合、MIDACOを用いた並列オーバークロッキングが有望な戦略となり得ます(ユーザーマニュアルのセクション8.8を参照)。