【文献】
松原 仁,2010年のパーソナル・コンピューティング,日経バイト 第100号,日本,日経BP社,1998年 5月15日,第100号,p.264-267,ISSN:0289-6508
【文献】
米田 清 ,スケジューリングの理論と応用−II,システム/制御/情報 第41巻 第4号,日本,システム制御情報学会,1997年 4月15日,第41巻, 第4号,p.14-22,ISSN:0916-1600
(58)【調査した分野】(Int.Cl.,DB名)
0又は1の値をとる最適化変数の各々と、前記最適化変数の各々を選択した場合のコスト値の各々と、前記最適化変数の各々に対する制約の各々とが与えられたときに、前記制約を満たしつつ、前記最適化変数を最適化するための整数計画問題を解く最適化問題解決装置であって、
貪欲法による山登り法に従って、前記制約を満たしつつ、予め定められた、前記最適化変数の各々及び前記コスト値の各々と、前記制約の各々に対する、前記制約を表す不等式制約を等式制約に変換するための補助変数と、前記制約の各々に対する、前記制約を満たさない度合いを表す違反度合いとを含む目的関数を最適化するように、前記最適化変数を選択して更新することを繰り返す更新部と、
予め定められた反復終了条件を満たすまで、前記更新部による更新を繰り返させる反復判定部と、
前記更新部による更新で前記目的関数の最適値が得られる毎に、前記目的関数の最適値を比較して、より良い前記目的関数の最適値が得られたときの前記最適化変数の各々の値を暫定解として保持する結果比較部と、を含み、
前記更新部は、
前記最適化変数の各々を初期化する初期化部と、
前記最適化変数の各々及び前記制約の各々に対する違反度合いに基づいて、前記目的関数を最適化するように、前記制約の各々に対する補助変数を更新する補助変数更新部と、
前記最適化変数の各々に基づいて、前記目的関数を最適化するように、前記制約の各々に対する違反度合いを更新する違反度合更新部と、
前記制約の各々に対する補助変数及び前記制約の各々に対する違反度合いに基づいて、前記最適化変数の値を変更することにより前記目的関数の値を最も良くする前記最適化変数を選択して更新する最適化変数更新部と、
前記最適化変数の値を変更しても前記目的関数の値が良くならず、かつ、前記制約の各々を満たすまで、前記補助変数更新部による更新、前記違反度合更新部による更新、及び最適化変数更新部による更新を繰り返させる終了判定部と、
を含む最適化問題解決装置。
前記最適化変数更新部は、前記最適化変数を選択して更新したとき前記最適化変数の各々の値の組み合わせを表すbit列についてハッシュ値を計算し、キャッシュテーブルにおいて、計算されたハッシュ値をアドレスとした位置にbit列が格納されている場合に、前記最適化変数の各々の値の組み合わせを表すbit列と、前記計算されたハッシュ値をアドレスとした位置に格納されているbit列とが一致するか否かを判定し、一致すると判定された場合、前記更新部による処理を終了し、一致しないと判定された場合、前記キャッシュテーブルにおいて、前記計算されたハッシュ値をアドレスとした位置に、前記最適化変数の各々の値の組み合わせを表すbit列を格納する請求項1に記載の最適化問題解決装置。
0又は1の値をとる最適化変数の各々と、前記最適化変数の各々を選択した場合のコスト値の各々と、前記最適化変数の各々に対する制約の各々とが与えられたときに、前記制約を満たしつつ、前記最適化変数を最適化するための整数計画問題を解く最適化問題解決装置における最適化問題解決方法であって、
更新部が、貪欲法による山登り法に従って、前記制約を満たしつつ、予め定められた、前記最適化変数の各々及び前記コスト値の各々と、前記制約の各々に対する、前記制約を表す不等式制約を等式制約に変換するための補助変数と、前記制約の各々に対する、前記制約を満たさない度合いを表す違反度合いとを含む目的関数を最適化するように、前記最適化変数を選択して更新することを繰り返すステップと、
反復判定部が、予め定められた反復終了条件を満たすまで、前記更新部による更新を繰り返させるステップと、
結果比較部が、前記更新部による更新で前記目的関数の最適値が得られる毎に、前記目的関数の最適値を比較して、より良い前記目的関数の最適値が得られたときの前記最適化変数の各々の値を暫定解として保持するステップと、を含み、
前記更新部が更新するステップは、
初期化部が、前記最適化変数の各々を初期化するステップと、
補助変数更新部が、前記最適化変数の各々及び前記制約の各々に対する違反度合いに基づいて、前記目的関数を最適化するように、前記制約の各々に対する補助変数を更新するステップと、
違反度合更新部が、前記最適化変数の各々に基づいて、前記目的関数を最適化するように、前記制約の各々に対する違反度合いを更新するステップと、
最適化変数更新部が、前記制約の各々に対する補助変数及び前記制約の各々に対する違反度合いに基づいて、前記最適化変数の値を変更することにより前記目的関数の値を最も良くする前記最適化変数を選択して更新するステップと、
終了判定部が、前記最適化変数の値を変更しても前記目的関数の値が良くならず、かつ、前記制約の各々を満たすまで、前記補助変数更新部による更新、前記違反度合更新部による更新、及び最適化変数更新部による更新を繰り返させるステップと、
を含む最適化問題解決方法。
前記最適化変数更新部が更新するステップは、前記最適化変数を選択して更新したとき前記最適化変数の各々の値の組み合わせを表すbit列についてハッシュ値を計算し、キャッシュテーブルにおいて、計算されたハッシュ値をアドレスとした位置にbit列が格納されている場合に、前記最適化変数の各々の値の組み合わせを表すbit列と、前記計算されたハッシュ値をアドレスとした位置に格納されているbit列とが一致するか否かを判定し、一致すると判定された場合、前記更新部による処理を終了し、一致しないと判定された場合、前記キャッシュテーブルにおいて、前記計算されたハッシュ値をアドレスとした位置に、前記最適化変数の各々の値の組み合わせを表すbit列を格納する請求項3に記載の最適化問題解決方法。
【発明を実施するための形態】
【0037】
以下、図面を参照して本発明の実施の形態を詳細に説明する。
【0039】
まず、本発明の実施の形態における概要を説明する。
【0040】
前述の通り、0−1整数計画問題を解くためアルゴリズムはこれまでに様々な方法論が提案され、それぞれの方法はそれぞれに好適な問題の領域が存在する。そこで、本発明の実施の形態では、0−1整数計画問題と呼ばれる組合せ最適化問題に関して、特に大規模かつ実行可能解が容易に発見できないといった特徴を持つ最適化問題を効率的に解く課題に取り組む。
【0041】
まず、本発明の実施の形態において取り組む課題においては、実行可能解が容易に獲得できないという前提がある。そのため、初期値として実行可能解を適当に得てから開始するアルゴリズムを用いることはできない。そこで、本発明の実施の形態では、適当な初期値をランダムに与え、そこから目的関数の値がよくなる方向に変数を一つずつ更新する、貪欲山登り法(貪欲法による山登り法)を用いる。ただし、貪欲山登り法では、局所解に陥って、真の最適解を得られない可能性が高い。そこで、現時点の最良の解を保持しつつ、貪欲山登り法を複数回繰り返して、より良い解を更新していくような方法論を用いる。本実施の形態では、この手法を反復貪欲山登り法と呼ぶこととする。
【0042】
次に、実行可能解が容易に得られないという性質に対処するために、最適化アルゴリズム中により制約を満たす方向へ最適化変数を更新するような仕組みを導入する。また、制約を満たす方向へ向かう強さをコントロールできる仕組みを導入してもよい。これにより、解の探索中に、より実行可能解を発見しやすく調整することができる。
【0043】
反復貪欲山登り法では、個々の貪欲山登り法の計算途中では別の探索結果を全く考慮しない方式となる。これは、余計な通信コストが発生しないため、非常に効率的であるが、一方で、同じ領域を何度も探索してしまう可能性があるため、探索が非効率になる可能性がある。そこで、オプションとして、全ての貪欲山登り法で共有するブルームフィルタを作成し、個々の貪欲山登り法によって探索した領域を、擬似的に共有する方法を用いる。
【0044】
上記の手法の利点を、以下の(1)から(3)に述べる。
【0045】
(1)反復貪欲山登り法の利用(大規模問題への適用)
【0046】
貪欲山登り法により、個々の計算処理が容易であるため、最適化変数が多くても対応可能となる。また、個々の計算量は変数の数に対して線形時間。付加効果として、分散並列処理に適した枠組みであるため、容易に並列計算が可能となる。
【0047】
(2)拡張ラグランジュ緩和法による緩和問題、及びADMM最適化に基づくアルゴリズムの枠組みの利用(実行可能解を効果的に探索する効果)
【0048】
拡張ラグランジュ緩和による制約の緩和を行うことで、より制約を満たす方向で探索を行うことができる。また、制約を満たす度合いを制御するパラメタを自然に導入することができる。そのため、例えば、探索最初は制約を満たす強さを弱めにしておき、探索が進むにつれて、より制約を満たす方向へ探索を進めるといった戦略を取ることも可能となる。これにより、実行可能解が容易に見つからないことに対処できる。
【0049】
(3)キャッシュテーブルの利用(重複探索の削除による更なる大規模問題へ適用)
【0050】
複数回の貪欲山登り法を用いるため、これまでに探索した領域を何度も探索してしまう可能性がある。よって、重複探索を簡単なキャッシュテーブルを用いて排除し、全体の計算量を削減することができる。
【0052】
次に、本発明の実施の形態における原理を説明する。
【0053】
ここでは、上記(1)式1に示された0−1整数計画問題を解く例を用いて、本発明の実施の形態の原理を説明する。
【0054】
まず、上記(1)式に書かれているように、制約には、等式制約と不等式制約の二種類が存在する。本発明の実施の形態では、計算アルゴリズムを効率化するために、全ての制約を一旦不等式制約に変換したのち、それらを補助変数付きの等式制約の形式に変換し、問題を再定式化する。
【0055】
まず、第一に全ての制約を不等式制約に変換する。上記(1)式の等式制約は、二つの不等式制約で記述することができる。
【0057】
この二つの不等式制約が同時に満たされるのは、等式制約が満たされるのと等価である。上記(2)式を用いることで、等式制約を不等式制約で記述できるので、最適化問題の全ての制約は不等式制約によって表現できる。計算を簡単にするために、不等式制約の向きを「≦0」の形式で全て変換する。これは、両辺に−1を掛けることによって、容易に実現できる。よって、係数a
i,jとb
iを再定義し、全ての制約は
【0060】
最後に、上記の不等式制約を、補助変数ξ
i≧0を導入して、以下の等式制約に変換する。
【0062】
補助変数ξ
iは0以上の値をとるので、不等式制約が満たされている場合はξ
iの値を調節することで、等式制約を満たしたと判定することができる。逆に、不等式制約が満たされていない場合は、ξ
i=0とするのが最も等式制約に近い値となる。このように、補助変数付きの等式制約は元の不等式制約を満たしているか、いないかの判定を一致させることができる。
【0067】
個の時、等式制約は2倍になるので、最終的に得られる補助変数付きの等式制約の数は
【0071】
とおき、上記(1)式の最適化問題を以下の形式で再定義する。
【0073】
次に、上記(5)式について、拡張ラグランジュ緩和法を用いて、制約を緩和する。
【0075】
このとき、Lは緩和問題の目的関数である。また、α
iは、制約を違反している場合にどの程度強くその違反をコストとして計上するかを制御するための違反度合いを表すパラメタである。また、ρは、制約を満たす強さを表すパラメタであり、ρ>0とする。
【0076】
上記(6)式を解くために、非特許文献1で紹介されているADMMに則って最適化を行う。目的関数の最適化は、以下で説明する反復貪欲山登り法における、[2]の貪欲山登り法において実行する。
【0077】
まず、本発明の実施の形態で用いる反復貪欲山登り法について説明する。一般的に一回の貪欲山登り法では最適解を得ることは難しい。そこで、初期値をランダムにふって、複数回の貪欲法による山登り法を用いて、より精度の高い解を得る。下記[2−5]の終了判定を満たした際に、暫定解を保持するが、その暫定解は、実行可能解であることを想定している。よって、現在暫定解として保持している目的関数の値よりも、より良い目的関数の値を獲得した場合は、暫定解を書き換えてより良い解のみを保持する。このように、複数回行うことで、一回のときより悪い結果になることは絶対になく、必ず良いか同じ暫定解が得られる。また、個々の貪欲法による山登り法の試行は完全に独立に行うことができるため、昨今の複数の演算装置がある計算機を効率的に利用して最適解の探索を行うことができる。
【0078】
反復貪欲山登り法としては、全体として以下[1]から[5]の処理を行う。
【0079】
[1]:独立に貪欲山登り法を行うオブジェクトをN個計算機内に生成する。
[2]:個々のN個に対して、後述する貪欲山登り法を実行する。
[3]:終了条件を満たしたn番目の結果を受け取る。
[4]:現在の最良の解と、[3]で受け取ったn番目の解を比較し、より良い結果であれば、それを保持する。
[5]:事前に設定した規定回数K回の貪欲法を実行する場合、規定回数Kに満たなければ、新たに貪欲山登り法を行うオブジェクトを作成して追加する。そして、[2]に戻って、追加したオブジェクトを、新たなn番目の処理として実行する。
【0080】
次に、上記[2]の貪欲山登り法の基本的な処理手順を、以下の[2−1]から[2−5]に示す。
【0081】
[2−1]:初期化
初期状態として、各z
jにランダムに0または1を代入する。
[2−2]:ξ
iの更新
補助変数ξ
iを更新する。ただし、更新が必要なξ
iは、[2−4]で更新されたz
jのうち制約の式の係数a
i,jが非零のもののみである。
[2−3]:α
iの更新
パラメタα
iを更新する。ただし、更新が必要なα
iは、[2−4]で更新されたz
jのうち制約の式の係数a
i,jが非零のもののみである。
[2−4]:z
jの更新
目的関数の値が最もよくなる一つの最適化変数z
jを選択し値を更新する。つまり現在の値が1なら0へ更新し、0であれば[2−1]へ更新する。
[2−5]:終了判定
最適化変数z
jの変更がすべて目的関数の値をよくしない場合、かつ、実行可能解なら、現在の解を保持して終了し、それ以外の場合であれば[2−2]へ戻る。
【0082】
<本発明の実施の形態に係る最適化問題解決装置の構成>
【0083】
次に、本発明の実施の形態に係る最適化問題解決装置の構成について説明する。本実施の形態の最適化問題解決装置は、上記(1)式のように、0又は1の値をとる最適化変数と、最適化変数z
jを選択した場合のコスト値c
jと、最適化変数z
jに対する制約の各々とが与えられたときに、制約を満たしつつ、最適化変数z
jを最適化するための整数計画問題を解く装置である。
【0084】
図1に示すように、本発明の実施の形態に係る最適化問題解決装置100は、CPUと、RAMと、後述する最適化問題解決処理ルーチンを実行するためのプログラムや各種データを記憶したROMと、を含むコンピュータで構成することが出来る。この最適化問題解決装置100は、機能的には
図1に示すように入力部10と、演算部20と、出力部50とを備えている。
【0085】
入力部10は、貪欲山登り法を行うオブジェクトを生成する指令を受け付ける。
【0086】
演算部20は、オブジェクト生成部30と、更新部32
1〜32
Nと、キャッシュテーブル33と、結果比較部34と、反復判定部36とを含んで構成されている。
【0087】
オブジェクト生成部30は、貪欲山登り法を行うN個のオブジェクトを生成し、オブジェクトの各々を更新部32
1〜32
Nに出力する。
【0088】
更新部32
1〜32
Nは、オブジェクト生成部30で生成されたオブジェクトの各々について、貪欲法による山登り法に従って、制約を満たしつつ、予め定められた、最適化変数z
j及びコスト値c
jの各々を含む、上記(6)式の目的関数を最適化するように、最適化変数を選択して更新することを繰り返す。また、更新部32
1〜32
Nは、並列処理により、各々独立して更新処理を行う。また、更新部32
1〜32
Nは既に探索した最適化変数z
jの値の組み合わせ(解候補)を、ハッシュ値をアドレスとしてキャッシュテーブル33に保存する。これにより更新部32
1〜32
Nでは、既に探索した最適化変数z
jの領域を排除して更新処理を行うことができる。
【0089】
また、更新部32
1〜32
Nの各々はそれぞれ、初期化部230と、補助変数更新部232と、違反度合更新部234と、最適化変数更新部と、終了判定部238との各部を含んで構成されている。更新部32
1〜32
Nの各部の処理については後述する。
【0090】
キャッシュテーブル33には、更新部32
1〜32
Nで探索された最適化変数z
jの値の組み合わせ(解候補)が、ハッシュ値をアドレスとした位置に格納されている。
【0091】
結果比較部34は、更新部32
1〜32
Nによる更新で目的関数の最適値が得られる毎に、目的関数の最適値を比較して、より良い目的関数の最適値が得られたときの最適化変数の各々の値を暫定解として保持する。
【0092】
反復判定部36は、予め定められた反復終了条件を満たすまで、更新部32
1〜32
Nによる更新を繰り返させる。ここでは、反復終了条件は規定回数K回分の更新処理が更新部32
1〜32
Nによって行われたこととする。
【0093】
次に、更新部32
1〜32
Nの各部の処理について説明する。
【0094】
初期化部230は、複数の最適化変数z
jの値をランダムに初期化する。よって、このときに、制約を満たしているかは考慮しない。また、実行可能解が容易に得られない問題では、初期化段階で実行可能解になっていることはほぼない。また、初期化部230は、制約の各々に対する違反度合いであるα
iを初期化する。例えば、α
iは0にすればよい。
【0095】
補助変数更新部232は、初期化された、又は前回更新された複数の最適化変数z
j及び制約の各々に対する違反度合いα
iに基づいて、上記(6)式の目的関数を最適化するように、制約の各々に対する補助変数ξ
iを更新する。
【0096】
補助変数更新部232は、具体的には以下に説明するように、ξ
iの最適値を解析的に求める。まず、補助変数ξ
i以外の全ての変数を固定して考えた場合、補助変数ξ
iの最適値は、目的関数の勾配
【0098】
が0になる時の値である。目的関数の補助変数ξ
iに関する勾配
【0102】
このように、補助変数ξ
iの最適値は解析的に求めることができる。上記(7)式からもわかるように、例えば、特定の最適化変数z
jしか更新されていない場合は、特定の補助変数ξ
iの値は前回と全く同じ値であることがある。これは、i番目の制約の最適化変数z
jの係数a
i,jがa
i,j=0である場合に、z
jの変更はi番目の制約に何も影響を与え無いためである。
【0103】
よって、逆に言えば、ある一つの最適化変数z
jのみが更新された場合は、a
i,j≠0の制約のみを更新すれば良い。また、その変化量は、a
i,jの増減のみである。つまり、この計算は非常に高速に計算できる。例えば、a
i,j≠0の制約が10個であった場合は、10個の補助変数ξ
iに対してα
iを増減すればよい。
【0104】
上述したように、補助変数更新部232は、初期化された、又は前回更新された複数の最適化変数z
j及び制約の各々に対する違反度合いα
iに基づいて、上記(7)式に従って、制約の各々に対する補助変数ξ
iを更新する。
【0105】
違反度合更新部234は、初期化された、又は前回更新された複数の最適化変数z
jに基づいて、上記(6)式の目的関数を最適化するように、制約の各々に対する違反度合いα
iを更新する。
【0106】
違反度合更新部234は、具体的には以下に説明するように、違反度合いα
iの最適値を求める。
【0107】
ここでは、制約の違反度合いを判定したいので、元の不等式制約の違反度を反映させたい。よって、便宜上ξ
i=0とおいてα
iの更新式を考える。目的関数Lのα
iに関する勾配
【0111】
ここでは、ξ
iのように解析解は求まらないため、勾配法による反復計算により最適値を求める方法を用いる。その際の更新式は以下(9)式のようになる。
【0113】
ただし、ηは学習率であり、0<η<1の範囲の値をとることとする。ここでの注意点は、α
i≧0の制約があるので、違反度合いα
iは、必ず0以上の値をとるようになっている点である。
【0114】
この更新の意味は、Σ
ja
i,jz
j−b
i>0の場合は制約が満たされていないので、
【0116】
の値に応じて、拡張ラグランジュ緩和法における双対変数の値が増加する。つまり、i番目の制約に重みが加算され、次にz
jの更新候補を選択する際に、よりi番目の制約を満たすことを考慮して選択が行われる。逆に、Σ
ja
i,jz
j−b
i≦0の場合は制約が満たされていることを意味する。注意点としては、Σ
ja
i,jz
j−b
i≦0であるので、負の値であるから、
【0118】
の値に応じて、違反度合いα
iの値は減ることになる。つまり、i番目の制約を満たすことを考慮する点において、制約を満たす度合いを多少減らすことを意味する。
【0119】
また、違反度合いα
iも補助変数ξ
iと同様に、例えば、特定の最適化変数z
jしか更新されていない場合は、特定の
【0121】
の値は前回と全く同じ値となる。具体的には、i番目の制約のz
jの係数a
i,jがa
i,j=0である場合に、z
jの変更はi番目の制約に何も影響を与えないため
【0123】
の値は変化しない。よって、このようなケースで計算量を削減するために、
【0125】
の値をキャッシュしておくこととする。このキャッシュを実現するには、
【0127】
個の実数を保存するメモリを用いれば足りるため、効率がよい。
【0128】
上述したように、違反度合更新部234は、初期化された、又は前回更新された複数の最適化変数z
jに基づいて、上記(9)式に従って、制約の各々に対する違反度合いα
iを更新する。
【0129】
最適化変数更新部236は、以下に説明するように、補助変数更新部232で更新された制約の各々に対する補助変数ξ
i、及び違反度合更新部234で更新された制約の各々に対する違反度合いα
iに基づいて、値を変更することにより上記(6)式の目的関数の値を最も良くする最適化変数z
jを選択して更新する。
【0130】
最適化変数更新部236では、具体的には、以下の第1及び第2の処理によって最適化変数z
jを更新する。第1の処理は、最も目的関数の値を減らせる変数を一つ選択する処理である。第2の処理は、第1の処理で選択する変数が既に探索済みか判定する処理である。
【0131】
最適化変数更新部236は、第1の処理において、一回の変更で最も目的関数の値を減らせる最適化変数を選択して更新する。最適化変数の取り得る値は、0または1なので、最適化変数の現在の値が1であれば0、0であれば1へ変更した際に、緩和問題の目的関数Lの値を最も多く減らせる最適化変数を一つ選択する最適化問題を解けばよい。よって、最適化変数z
jに対して、現在の値から、もう一方の値に変化させた際に目的関数がどのぐらい変化するかを計算する必要がある。まず、ある任意のjを一つ選択する。このとき、対象とする最適化変数z
jがz
j=1の時の目的関数の値
【0140】
との値を比較すると、右辺第3項までは全く同じであることがわかる。よって、現在z
j=1であり、これをz
j=0に変更した際の目的関数の増減は以下(11)式で求められる。
【0142】
ここで、先ほど上記(8)式において、
【0144】
とおいたので、上記(11)式はさらに以下(12)式のようにかける。
【0146】
ここで、あるjに対して、a
i,j≠0の数を
【0154】
のa
i,jとの掛け算をし、最後にρとの掛け算の計算量でz
jを変化させた際の目的関数の変化量を計算することができる。
【0155】
また、現在z
j=0であり、これをz
j=1に変更した場合の目的関数の増減は、上記(12)式の右辺の値に−1を掛けると、以下(13)式となることは容易にわかる。
【0157】
次に、最適化変数更新部236は、第2の処理において、第1の処理で選択して更新した最適化変数z
jの各々の値の組み合わせ(解候補)が既に探索済みであるか否かを判定する。
【0158】
これは、解候補が、既に処理した更新部32
1〜32
Nのいずれかの処理部における処理で既に出現していた場合は、処理中の更新部におけるそこから先の処理は、解候補が以前に出現した際の組み合わせと完全に一致してしまうため、無駄な処理になってしまう。この無駄な処理を削減するため、既に探索済みかどうかを判定し、探索済みの場合は、最適化変数をこれ以上更新しないようにする。
【0159】
ここでは、第1の処理で選択した最適化変数z
jを更新したときの最適化変数z
jの各々の値の組み合わせ(現在の解候補)を表すbit列について、bit列から任意のハッシュ値を計算し、キャッシュテーブル33における、計算したハッシュ値をアドレスとした位置に、現在の解候補のbit列を格納する。このキャッシュテーブル33を使うことで任意の解候補が既に出現したかどうかの判定自体は非常に単純に行うことができる。現在の解候補のbit列からハッシュ値を計算し、計算されたハッシュ値をアドレスとした位置にbit列が格納されている場合に、現在の解候補のbit列と、計算されたハッシュ値をアドレスとした位置に格納さているbit列とが完全一致する場合には、現在の解候補は探索済みであると判定することができる。
【0160】
ただし、キャッシュテーブル33に利用可能なメモリ量は有限なので、これまで探索した解候補のbit列を全て保持することは事実上不可能である。ここでは、「これまでに探索した解」を「これまでに探索していない解」とある程度間違えることは許容することとする。逆に、「これまでに探索していない解」を「これまでに探索した解」を間違えることは、探索中に到達不可能な解候補ができてしまうため、こちらは許容しないとする。
【0161】
これら二つの要件を満たすために、キャッシュテーブル33内のbit列は、同じハッシュ値になる場合は上書きされ、古いbit列は消失する、という処理を導入する。これはつまり、キャッシュテーブルに入っているbit列は、少なくとも、これまでに探索した解候補(の一部)であることは保証できる。一方、上書きにより古いbit列が消失することがあるので、「これまでに探索した解」を「これまでに探索していない解」と間違えることが発生する。ただし、これによって、キャッシュテーブル33の一定のメモリサイズ内で全ての処理を行うことが可能になるという利点が加えられる。
【0162】
実際の処理では、例えば、解候補のbit列を固定長のブロックに分割し、各ブロック毎にブルームフィルタを構築することで、キャッシュテーブル33の計算コストを削減するといった工夫ができる。
【0163】
これは、偽陽性(出現していなくても出現したと判定する)をある程度許容して、偽陰性(出現したものを出現していないと判定する)は起こらないというブルームフィルタの性質から、少なくとも全てのブロックで「出現した」と判定されなければ、絶対に出現していないことは保証できる。よって、キャッシュテーブル33への問い合わせの前にブルームフィルタが一つでも出現していないと判定した場合には、それ以上の処理は不要となる。
【0164】
また、ブロックで分割したことと、一回で変更される変数は一つであることを加味して、一回の判定では、高々一回のブルームフィルタの計算を行えばよい。さらに、キャッシュテーブル33のハッシュ計算とブルームフィルタで計算するハッシュとを共有することで、余計な計算を削減することもできる。
【0165】
上述したように、最適化変数更新部236は、補助変数更新部232で更新された制約の各々に対する補助変数ξ
i、及び違反度合更新部234で更新された制約の各々に対する違反度合いα
iに基づいて、上記(13)式に示す目的関数の増減が最も大きい最適化変数z
jを選択して更新する。そして、選択した最適化変数z
jて¥を更新したときの最適化変数z
jの各々の値の組み合わせを表すbit列についてハッシュ値を計算し、キャッシュテーブル33において、計算されたハッシュ値をアドレスとした位置にbit列が格納されている場合に、最適化変数の各々の値の組み合わせを表すbit列と、計算されたハッシュ値をアドレスとした位置に格納されているbit列とが一致するか否かを判定し、一致すると判定された場合、更新部32
1〜32
Nのうちの処理中の更新部による処理を終了し、一致しないと判定された場合、又は、計算されたハッシュ値をアドレスとした位置にbit列が格納されていない場合に、キャッシュテーブル33において、計算されたハッシュ値をアドレスとした位置に、最適化変数の各々の値の組み合わせを表すbit列を格納する。
【0166】
終了判定部238は、どの最適化変数z
jの値を変更しても目的関数の値が良くならず、かつ、制約の各々を満たすまで(実行可能解となるまで)、補助変数更新部232による更新、違反度合更新部234による更新、及び最適化変数更新部236による更新を繰り返させる。
【0167】
<本発明の実施の形態に係る最適化問題解決装置の作用>
【0168】
次に、本発明の実施の形態に係る最適化問題解決装置100の作用について説明する。入力部10において貪欲山登り法を行うオブジェクトを生成する指令を受け付けると、最適化問題解決装置100は、
図3に示す最適化問題解決処理ルーチンを実行する。
【0169】
まず、ステップS100では、入力部10において受け付けた指令により、貪欲山登り法を行うN個のオブジェクトを生成し、n=1とする。
【0170】
次に、ステップS102では、生成されたn番目のオブジェクトについて、貪欲法による山登り法に従って、制約を満たしつつ、予め定められた、最適化変数z
j及びコスト値c
jの各々を含む、上記(6)式の目的関数を最適化するように、最適化変数を選択して更新することを繰り返す。
【0171】
ステップS104では、ステップS102におけるn番目の目的関数の最適値の更新の結果を受け取る。
【0172】
ステップS106では、ステップS102で更新された目的関数の最適値を比較して、より良い目的関数の最適値が得られたときの最適化変数の各々の値を暫定解として保持する。
【0173】
ステップS108では、規定回数K回分の更新処理が行われたか否かを判定し、K回分の更新処理が行われていればステップS112へ移行し、K回分の更新処理が行われていなければステップS110でn=n+1とし、ステップS102に戻って処理を繰り返す。
【0174】
ステップS112では、ステップS106で保持した目的関数の最適値を出力部50に出力し、処理を終了する。
【0175】
ステップS102は、
図4に示す更新処理ルーチンによって実行される。
【0176】
ステップS200では、最適化変数z
jの値をランダムに初期化し、違反度合いα
iをα
i=0と初期化する。
【0177】
ステップS202では、初期化された、又は前回更新された複数の最適化変数z
j及び制約の各々に対する違反度合いα
iに基づいて、上記(7)式に従って、制約の各々に対する補助変数ξ
iを更新する。
【0178】
ステップS204では、初期化された、又は前回更新された複数の最適化変数z
jに基づいて、上記(9)式に従って、制約の各々に対する違反度合いα
iを更新する。
【0179】
ステップS206では、ステップS202で更新された制約の各々に対する補助変数ξ
i、及びステップS204で更新された制約の各々に対する違反度合いα
iに基づいて、上記(13)式に示す目的関数の増減が最も大きい最適化変数z
jを選択する。
【0180】
ステップS208では、ステップS206で選択した最適化変数z
jを更新したときの最適化変数z
jの各々の値の組み合わせを表すbit列についてハッシュ値を計算し、キャッシュテーブル33において、計算されたハッシュ値をアドレスとした位置にbit列が格納されているか否かを判定する。キャッシュテーブル33において、計算されたハッシュ値をアドレスとした位置にbit列が格納されていない場合には、ステップS210へ移行する。一方、キャッシュテーブル33において、計算されたハッシュ値をアドレスとした位置にbit列が格納されている場合に、ステップS209において、最適化変数の各々の値の組み合わせを表すbit列と、計算されたハッシュ値をアドレスとした位置に格納されているbit列とが一致するか否かを判定する。一致しないと判定された場合に、ステップS210へ移行し、一致すると判定された場合は、更新処理ルーチンを終了する。
【0181】
ステップS210では、キャッシュテーブル33において、ステップS208で計算したハッシュ値をアドレスとした位置に、最適化変数z
jの値の組み合わせを表すbit列を保存する。なお、計算したハッシュ値をアドレスとした位置に既にbit列が存在する場合には上書きする。
【0182】
ステップS212では、どの最適化変数z
jの値を変更しても目的関数の値が良くならず、かつ、制約の各々を満たすことを条件として、条件を満たすか否かを判定し、条件を満たさなければステップS202に戻って処理を繰り返し、条件を満たせば更新処理ルーチンを終了する。
【0183】
ステップS214では、ステップS208でどの最適化変数z
jの値を変更しても目的関数の値が良くならず、かつ、制約の各々を満たすことを条件として、条件を満たすか否かを判定し、条件を満たさなければステップS202に戻って処理を繰り返し、条件を満たせば更新処理ルーチンを終了する。
【0184】
以上説明したように、本発明の実施の形態に係る最適化問題解決装置によれば、更新部32
1〜32
Nの各部が、貪欲法による山登り法に従って、制約を満たしつつ、予め定められた、最適化変数の各々及びコスト値の各々を含む目的関数を最適化するように、最適化変数を選択して更新することを繰り返し、反復判定部36が、予め定められた反復終了条件を満たすまで、更新部32
1〜32
Nによる更新を繰り返させることにより、効率よく、整数計画問題を解くことができる。
【0185】
なお、本発明は、上述した実施の形態に限定されるものではなく、この発明の要旨を逸脱しない範囲内で様々な変形や応用が可能である。