以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
図1は、第1の実施の形態の情報処理システムを説明する第1の図である。
情報処理システム1は、イジングモデルのエネルギー関数で表される問題に対する解を求め、求めた解を出力する。イジングモデルのエネルギー関数で表される問題には、組合せ最適化問題がある。
エネルギー関数は、イジングモデルに含まれる複数のスピンに対応する複数の状態変数を含む。状態変数は、1または0の値をとるバイナリ変数である。解は、複数の状態変数により表される。組合せ最適化問題は、エネルギー関数の値を最小にする解を求める問題に変換される。エネルギー関数の値を最小にする解は、イジングモデルの基底状態に相当し、組合せ最適化問題に対する最適解に対応する。
情報処理システム1は、複数のノードを有する。情報処理システム1は、エネルギー関数で表される問題を複数の部分問題に分割し、複数の部分問題を複数のノードにより分散して処理する。情報処理システム1は、内部バスに接続された複数のノードを有する1つの筐体で実現されてもよいし、LAN(Local Area Network)、WAN(Wide Area Network)またはインターネットなどのネットワークに接続された複数のノードにより実現されてもよい。
図1の例では、情報処理システム1は、ノード10,20を有する。ただし、情報処理システム1が有するノードの数は3以上でもよい。一例では、問題が第1の部分問題及び第2の部分問題の2つに分割される。第1の部分問題がノード10に割り当てられ、第2の部分問題がノード20に割り当てられる。ただし、後述されるように1つのノードに2以上の部分問題が割り当てられてもよい。
問題全体のイジングモデルのエネルギーは、例えば、式(1)のエネルギー関数E(x)で定義される。
状態ベクトルxは、複数の状態変数を要素とし、イジングモデルの状態を表す。エネルギー関数の値を最大化する問題の場合は、エネルギー関数の符号を逆にすればよい。
式(1)の右辺第1項は、イジングモデルに含まれるN個の状態変数から選択可能な2つの状態変数の全組合せについて、漏れと重複なく、2つの状態変数の値と重み係数との積を積算したものである。xiは、i番目の状態変数である。xjは、j番目の状態変数である。Wijは、i番目の状態変数とj番目の状態変数との間の重み(例えば、結合の強さ)を示す重み係数である。なお、Wii=0である。また、Wij=Wjiである。
式(1)の右辺第2項は、全状態変数の各々のバイアス係数と状態変数の値との積の総和を求めたものである。biは、i番目の状態変数に対するバイアス係数を示している。cは定数である。
例えば、イジングモデルにおけるスピンの「-1」は、状態変数の値「0」に対応する。イジングモデルにおけるスピンの「+1」は、状態変数の値「1」に対応する。このため、状態変数を、0または1の値をとるビットと呼ぶこともできる。
式(1)のエネルギー関数の値が最小となる状態変数の値の組合せが問題の最適解となる。ここで、エネルギー関数の値を単にエネルギー値と言うことがある。
一方、N(Nは2以上の整数)個の状態変数のうちの一部である、i=1~K(K<N)の状態変数を扱う部分問題についてのイジングモデルのエネルギーは、例えば、以下の式(2)のエネルギー関数E’(x)で定義される。
式(2)において、b’i及びc’の各々は、式(3)、式(4)のように表せる。
i=1~K(K<N)の状態変数を扱う部分問題の解を探索する際、i=K+1~Nの状態変数の値は固定される。式(3)の右辺の第2項は、固定値とされた状態変数によるバイアス係数への寄与分を表し、式(4)の右辺の第2項及び第3項は、固定値とされた状態変数による定数への寄与分を表す。
例えば、n(nは2以上の整数)個の部分問題に対してN個の状態変数がK個ずつn分割される。すなわち、1つの部分問題には、K=N/n個の状態変数の組、すなわち状態変数群が対応する。状態変数の全体をXと表す。例えば、上記の第1の部分問題には、状態変数の全体Xのうちの状態変数群X0が対応する。状態変数群X0には、状態変数x1~xKが属する。また、第2の部分問題には、状態変数の全体Xのうちの状態変数群X1が対応する。状態変数群X1には、状態変数xK+1~xNが属する。
例えば、情報処理システム1は、制御装置5に接続される。制御装置5は、ユーザにより入力される組合せ最適化問題の情報に基づいて、当該組合せ最適化問題をイジングモデルのエネルギー関数により定式化する。制御装置5は、当該エネルギー関数で表される問題を複数の部分問題に分割し、複数の部分問題をノード10,20に割り当てる。制御装置5は、情報処理システム1に含まれてもよい。また、制御装置5の機能は、ノード10,20の何れかが有してもよい。
ノード10は、記憶部11、処理部12及び探索部13を有する。ノード20は、記憶部21、処理部22及び探索部23を有する。
記憶部11,21は、DRAM(Dynamic Random Access Memory)などの揮発性記憶装置でもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置でもよい。
処理部12,22は、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)などを含み得る。処理部12はプログラムを実行するプロセッサでもよい。「プロセッサ」には、複数のプロセッサの集合(マルチプロセッサ)が含まれ得る。
探索部13,23は、自ノードに割り当てられた部分問題の解を探索する。例えば、探索部13,23は、専用のハードウェアにより実現される。例えば、FPGAなどの集積回路を用いて実現される探索回路が、探索部13または探索部23として機能してもよい。ただし、探索部13,23の少なくとも何れかは、プロセッサが所定のプログラムを実行することで実現されてもよい。探索部13,23で用いられる探索手法には、例えば、SA、遺伝的アルゴリズム(GA:Genetic Algorithm)、SQA及びタブーサーチ(Tabu Search)などがある。探索手法はこれらに限らず、他の探索手法でもよい。また、探索部13,23で用いられる探索手法は同じでもよいし、異なっていてもよい。
ここで、部分問題の解を「部分解」と称する。部分解は、当該部分問題に対応する状態変数群により表される。例えば、第1の部分問題に対応する部分解は、状態変数群X0に属する状態変数x1~xKの値の組となる。第2の部分問題に対応する部分解は、状態変数群X1に属する状態変数xK+1~xNの値の組となる。
なお、図示を省略しているが、探索部13は、状態変数群X0及び状態変数群X0に属する状態変数間の重み係数などを保持するSRAM(Static Random Access Memory)などの記憶部を有する。探索部23も同様に、状態変数群X1及び状態変数群X1に属する状態変数間の重み係数などを保持する記憶部を有する。探索部13,23の各々の記憶部に格納される情報は、探索部13,23の各々による部分問題の解探索に用いられる。
探索部13,23の各々による部分解の探索は、例えば所定期間の間、繰り返し実行され、各回の探索で得られた部分解が出力される。後述されるように、探索部13,23の各々における部分問題の情報は、次の部分解の探索が開始される直前に変更される。部分問題の情報は、全状態変数のうちの自ノードが担当する状態変数群以外の、値を固定する状態変数群に関する情報を含み、例えば、前述の式(2)のエネルギー関数E’(x)におけるb’,c’などである。
記憶部11は、処理部12の処理に用いられる情報を記憶する。記憶部11は、重み係数を記憶する。記憶部11が記憶する重み係数は、Wi1~WiK(1≦i≦N)でよい。すなわち、記憶部11が記憶する重み係数は、N×N個の重み係数のうちのN×K個でよい。当該重み係数は、解に対するエネルギー値の計算や部分問題の情報の変更に用いられる。
記憶部11は、解バッファ11aを有する。解バッファ11aは、式(1)で表される問題全体のエネルギー関数E(x)に基づいて選択された解を記憶する。解バッファ11aに記憶される解は、「全体解」と呼ばれてもよい。解バッファ11aには、複数の解が保持される。解バッファ11aに保持される解の数は、ノード10に予め設定される所定数となる。一例として、解バッファ11aには2つの解が保持されるものとする。また、図1では図示を省略しているが、解バッファ11aには、解に対応付けて、当該解に対応する、式(1)のエネルギー値が保持される。
処理部12は、解バッファ11aに保持される解の更新を行う。処理部12は、例えば次の処理を行う。
第1の処理は、探索部13による探索結果として取得された部分解に基づく、解バッファ11aに保持される解の更新である。
第2の処理は、解バッファ11aに保持される解のノード20への送信である。
第3の処理は、ノード20から受信した解に基づく、解バッファ11aに保持される解の更新である。
また、後述されるように、処理部12は、解バッファ11aに保持される解に基づく、探索部13に設定する部分問題の情報の変更も行う。
図1では、第1の処理を例示する。
解バッファ11aには、例えばノード10,20による探索に応じて、解s1,s2が格納されている。解s1,s2を得るための探索も、下記に示す方法と同様の方法である。例えば、最初の段階では、解バッファ11aには解は格納されておらず、予め与えられた初期解を始点とした探索部13による1回目の探索結果の部分解が反映された解が、解バッファ11aに格納され、下記の処理が実行される。
ここで、ある状態変数群における各状態変数の値の組を、状態変数群を表すX0などの符号に、「_1」のようにアンダースコア「_」と数字とを付して、例えば「X0_1」のように区別する。解s1は「X0_1,X1_1」である。解s2は「X0_0,X1_2」である。
一例では、処理部12は、探索部13で得られた部分解s11を取得すると、部分解s11に基づいて、解バッファ11aを次のように更新する。部分解s11は「X0_2」である。処理部12は、解s1,s2の各々の状態変数群X0の部分を、部分解s11で置換した解候補を生成する。解候補は、解バッファ11aにおける解と置換される候補となる解である。例えば、処理部12は、解s1に対して第1の解候補「X0_2,X1_1」を生成し、解s2に対して第2の解候補「X0_2,X1_2」を生成する。
処理部12は、解s1,s2、第1の解候補及び第2の解候補の各々に対する式(1)のエネルギー関数E(x)の値に応じて、解バッファ11aに保持される所定数の解を更新する。すなわち、処理部12は、当該エネルギー値が小さい方から所定数の解を記憶部11に保存し、それ以外の解を破棄する。なお、第1の解候補及び第2の解候補の各々に対応するエネルギー値は、記憶部11に記憶された重み係数及び解s1,s2の各々に対応付けて記憶部11に記憶されたエネルギー値に基づいて計算可能である。
例えば、解s1,s2、第1の解候補及び第2の解候補の4つの解では、エネルギー値の小さい方から順に並べると、第2の解候補、解s1、第1の解候補、解s2であるとする。この場合、処理部12は、第2の解候補と解s1とを解バッファ11aに保存し、第1の解候補と解s2とを破棄する。更新後の解バッファ11aに格納される解s3は、上記の第2の解候補「X0_2,X1_2」に相当する。このとき、処理部12は、解s3のエネルギー値も解s3に対応付けて解バッファ11aに格納する。
記憶部21、処理部22及び探索部23は、それぞれ記憶部11、処理部12及び探索部13と同様の機能を有する。
記憶部21は、解バッファ21aを有する。解バッファ21aには、例えばノード10,20によるそれまでの探索に応じて、解s1,s2が格納されている。
処理部22は、探索部23で得られた部分解s21を取得する。部分解s21は「X1_3」である。処理部22は、処理部12と同様に、部分解s21に基づいて、解バッファ21aに保持される解を、例えば解s4,s5に更新する。解s4は「X0_1,X1_3」である。解s5は「X0_0,X1_3」である。解バッファ21aには解s4,s5の各々に対応するエネルギー値も格納される。
ただし、上記の部分解s11に基づく解バッファ11aに保持される解の更新方法は一例であり、他の方法も考えられる。例えば、処理部12は、部分解s11と部分解s11の探索に用いられた状態変数群X1の各状態変数の値とを組合せた解及び解s1,s2の中から、エネルギー値が小さい順に所定数を解バッファ11aに残すようにしてもよい。処理部12も同様である。
ノード10,20は、各々が実行する処理を互いに非同期に行うことができる。
次に、上記の第2の処理及び第3の処理を説明する。
図2は、第1の実施の形態の情報処理システムを説明する第2の図である。
処理部12は、解バッファ11aに保持される複数の解のうちの少なくとも1つの解を、ノード20に送信する。送信のタイミングは任意のタイミングとすることができる。例えば、一定周期でもよいし、解バッファ11aの解が部分解s11を基に更新された後のタイミングでもよい。
一例では、処理部12は、解バッファ11aに保持される解s3,s1のうち、エネルギー値が最も小さい解s3を、解s3に対応するエネルギー値とともにノード20に送信する。解バッファ11aにp(pは2以上の整数)個以上の解が保持される場合、処理部12は、解バッファ11aに含まれる解のうちのエネルギー値が小さい方からq(qはq<pの整数)個の解をノード20に送信してもよい。処理部12による当該解の送信は、処理部12が実行する第2の処理に相当する。
処理部22は、ノード10から受信した解に基づいて、解バッファ21aに保持される解を更新する。例えば、処理部22は、ノード10から解s3及び解s3のエネルギー値を受信すると、解s3及び解バッファ21aに保持される解s4,s5の各々に対するエネルギー値の小さい順に2つの解を解バッファ21aに保持し、それ以外の解を破棄する。解s3,s4,s5をエネルギー値の小さい方から順に並べると、解s3,s4,s5であるとする。この場合、処理部22は、解s3,s4を解バッファ21aに保存し、解s5を破棄する。解バッファ21aには解s3,s4の各々に対応するエネルギー値も格納される。処理部22による当該解バッファ21aの更新は、処理部22が実行する第3の処理に相当する。
このように、ノード10で得られた良解、すなわち、エネルギー値が小さい解が、ノード10,20で共有される。
同様に、ノード20からノード10に解を送信することで、ノード20で得られた良解をノード10,20で共有することもできる。
具体的には、処理部22は、所定のタイミングで、解バッファ21aに保持される所定数の解のうちの少なくとも1つの解を、ノード10に送信する。例えば、処理部22は、解バッファ21aに保持される所定数の解のうち、エネルギー値が最も小さい解を、当該解に対応するエネルギー値とともにノード10に送信する。処理部22による当該解の送信は、処理部22が実行する第2の処理に相当する。
処理部12は、ノード20から受信した解に基づいて、解バッファ11aに保持される解を更新する。例えば、処理部12は、解バッファ11aに保持される所定数の解及びノード20から受信した解のうちエネルギー値の小さい方から所定数だけ解バッファ11aに保持し、それ以外の解を破棄する。処理部12による、ノード20から受信した解に基づく解バッファ11aの解の更新は、処理部12が実行する第3の処理に相当する。
こうして、ノード20で得られた良解が、ノード10,20で共有され得る。
ノード10からノード20への解の送信、及び、ノード20からノード10への解の送信は非同期に行われてもよいし、同期して行われてもよい。
このように、ノード10,20の各々は、上記の第1の処理により、自ノードが探索した部分解に基づいて自ノードが保持する解を更新し、上記の第2,第3の処理により、他ノードが保持する解に基づいて自ノードが保持する解を更新する。
ノード10,20の各々は、こうして更新された自ノードの解バッファ上の解に基づいて、自ノードにおける部分問題の情報を変更し、次の部分解の探索を行える。
例えば、処理部12は、図1のように探索部13で部分解s11が得られた後、次の探索を行う直前に、解バッファ11aに保持された解s3,s1に基づいて、次の探索での状態変数群X1の各状態変数の値を決定し、式(2)のb’やc’を変更する。処理部22も処理部12と同様の処理を行う。
ここで、処理部12が解バッファ11aに保持された解に基づいて、状態変数群X1に属する各状態変数の値を決定する方法には、種々の方法が考えられる。
一例では、処理部12は、解バッファ11aに保持される複数の解のうち、式(1)で求められるエネルギー値が最小の解を選択し、選択した解における状態変数群X1の各状態変数の値を採用する。
または、処理部12は、解バッファ11aに保持される複数の解のうち、ランダムに1つの解を選択し、選択した解における状態変数群X1の各状態変数の値を採用してもよい。このとき、処理部12は、解バッファ11aに3以上の解が保持される場合、エネルギー値が小さい方からk個(例えば、2個または3個程度)の解の中からランダムに、当該1つの解を選択してもよい。あるいは、処理部12は、解バッファ11aに保持される複数の解の各々の状態変数群X1の各状態変数の値を比較して、他の解と値が一致する状態変数の数が最も多い解を選択し、当該解における状態変数群X1の各状態変数の値を採用してもよい。
このようにして、処理部12は、解バッファ11aに保持される解に基づいて、状態変数群X1に属する各状態変数の値を決定し、探索部13に設定する部分問題の情報を変更する。そして、探索部13は、状態変数群X0については現在の部分解を始状態として、状態変数群X0に対応する次の部分解の探索を開始する。
処理部22も、処理部12と同様にして、解バッファ21aに保持される解に基づいて、状態変数群0に属する各状態変数の値を決定し、探索部23に設定する部分問題の情報を変更し、探索部23に次の部分解の探索を開始させる。
ノード10,20は、上記の処理を繰り返し実行し、所定時間が経過すると、それぞれ解バッファ11a,21aに保持される解を制御装置5に出力する。制御装置5は、ノード10,20から取得した解を組合せ最適化問題に対する解の形式に変換し、表示装置に表示させたり、ネットワークを介してユーザが利用する端末装置に送信したりすることで、ユーザに提供する。例えば、制御装置5は、ノード10,20から取得したエネルギー値が最小の解をユーザに提供してもよいし、ノード10,20から取得した複数の解をユーザに提供してもよい。
このように、情報処理システム1では、複数のノードの各々により、複数の状態変数のうち、自ノードに割り当てられた部分問題に対応する状態変数群により表される部分解が探索される。複数のノードの各々により、部分解が反映された、問題の第1の解を含む複数の解が保持される。複数のノードのうちの第1ノードにより、第1ノードで保持する複数の解のうちの少なくとも1つの解が複数のノードのうちの第2ノードに送信される。第2ノードにより、第1ノードから受信した解に基づいて、第2ノードで保持する複数の解の少なくとも一部が更新される。
これにより、求解性能を向上できる。例えば、ノード10で発見された良解がノード20と共有されることで、ノード10,20により共同で解が改善され、求解性能が向上する。また、ノード20で発見された良解をノード10と共有することもできる。
例えば、情報処理システム1では、複数のノードの各々が、各ノードで得られている複数の解のうちの最良の解を他のノードと共有し、共有した解に基づき各ノードでの次の探索において固定する状態変数群の各状態変数の値を決定する。より良い解の近傍には、更に良い解が存在する可能性が高いと推定される。このため、各ノードで発見された良解を他ノードと共有し、共有した解を基に固定する状態変数群の各状態変数の値を決定することで、探索空間をより良い解の近傍に絞り込め、何れかのノードが最適解に到達する可能性を向上できる。例えば、複数のノードの何れかで、所定時間内に、最適解あるいは予め定められた目標値よりもエネルギー値が小さくなる解が得られる可能性が高まる。こうして、情報処理システム1による求解性能を向上できる。
また、問題の規模の増大に伴い、各ノードの探索に利用可能な、単一の探索部におけるメモリ容量の制約などによって、現状のノード数では一度に全ての部分問題を処理できない場合もある。
例えば、予め用意された数の探索部では一度に全ての部分問題を解くことができない場合、1つの探索部において、探索対象の部分問題を入れ替えながら、幾つかの部分問題を順番に処理する方法も考えられる。この方法では、例えばノードなどが備えるHDDやSSDなどの補助記憶装置に、処理させる複数の部分問題に対応する複数の重み係数群を格納しておき、今回探索対象の部分問題に対応する重み係数群を、探索部のメモリに格納する。しかし、この方法では、探索実行のために当該メモリに格納される重み係数のサイズが低減されるものの、部分問題の入れ替えに伴って、当該メモリと補助記憶装置との間での重み係数の入れ替えが生じる。重み係数の入れ替えには時間がかかり、遅延の要因になる。
これに対し、情報処理システム1では、複数のノードの各々が異なる探索手法で、非同期に部分問題に対する求解を実行できる。このため、現状のノード数では一度に全ての部分問題を処理できない場合に、ノードの追加を容易に行える。このように、情報処理システム1は、問題の規模の増大に対して拡張性が高く、求解性能の向上を容易に図ることができる。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
図3は、第2の実施の形態の情報処理システムの例を示す図である。
情報処理システム2は、制御装置50及びノード100,200,300,400を有する。制御装置50及びノード100,200,300,400は、ネットワーク60に接続される。ネットワーク60は、LANでもよいし、WANやインターネットなどでもよい。
制御装置50は、組合せ最適化問題の問題データのユーザによる入力を受け付ける。制御装置50は、問題データに基づいて、イジングモデルのエネルギー関数で表される問題に変換する。当該問題は、イジングモデルのエネルギー関数を最小化する問題となる。エネルギー関数は、最小化したいコストを表すコスト項や制約を表すペナルティ項を含み得る。問題全体のエネルギー関数は、式(1)で定式化される。式(1)は、QUBO(Quadratic Unconstrained Binary Optimization)形式で定式化されたエネルギー関数である。式(1)のWij,bi,cは定式化の際に計算される。
制御装置50は、イジングモデルのエネルギー関数で表される問題を複数の部分問題に分割し、ノード100,200,300,400に割り当てる。制御装置50は、情報処理システム2による所定時間の解の探索の後、ノード100,200,300,400が保持する解を取得し、組合せ最適化問題に対する解の形式に変換して、ユーザに提供する。制御装置50は、例えばサーバコンピュータなどの情報処理装置により実現されてもよい。制御装置50は、第1の実施の形態の制御装置5の一例である。
ノード100,200,300,400は、各々が自ノードに割り当てられた部分問題の解、すなわち、部分解を探索する。ノード100,200,300,400は、解の探索を実行するアクセラレータを有する。アクセラレータは、エネルギー関数の値を最小化する状態変数群の値を解として求めるハードウェアである。ただし、ノード100,200,300,400の少なくとも1つが提供する解探索機能は、ソフトウェアにより実装されてもよい。ノード100,200,300,400は、例えばコンピュータなどの情報処理装置により実現されてもよい。
ノード100,200,300,400の各々のアクセラレータは、互いに異なる探索手法、すなわち、探索アルゴリズムを用いて解の探索を行ってもよいし、そのうちの少なくとも2つが同じ探索手法を用いて解の探索を行ってもよい。探索手法には、例えば、SA、GA、SQA、タブーサーチなどがある。
図4は、ノードのハードウェア例を示す図である。
ノード100は、CPU101、RAM102、HDD103、媒体リーダ104、アクセラレータカード105、NIC(Network Interface Card)106及びバス107を有する。
CPU101は、プログラムの命令を実行するプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを含んでもよい。また、ノード100は複数のプロセッサを有してもよい。以下で説明する処理は複数のプロセッサまたはプロセッサコアを用いて並列に実行されてもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、ノード100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、及び、データを記憶する不揮発性の記憶装置である。なお、ノード100は、フラッシュメモリやSSDなどの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
媒体リーダ104は、記録媒体61に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体61として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
媒体リーダ104は、例えば、記録媒体61から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、CPU101によって実行される。なお、記録媒体61は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体61やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
アクセラレータカード105は、イジングモデルのエネルギー関数で表される問題の解を探索するハードウェアアクセラレータである。アクセラレータカード105は、FPGA111及びRAM112を有する。FPGA111は、アクセラレータカード105における探索機能を実現する。当該探索機能は、GPUやASICなどの他の種類の集積回路により実現されてもよい。RAM112は、FPGA111での探索に用いられるデータやFPGA111により探索された部分問題の解を保持する。
アクセラレータカード105のようにイジング形式の問題の解を探索するハードウェアアクセラレータは、イジングマシンやボルツマンマシンなどと呼ばれることがある。後述されるように、ノード100は、複数のアクセラレータカードを有してもよい。
NIC106は、ネットワーク60に接続され、ネットワーク60を介して制御装置50やノード200,300,400と通信を行う通信インタフェースである。NIC106は、例えばスイッチやルータなどの通信装置とケーブルで接続される。
バス107は、ノード100の内部バスである。CPU101、RAM102、HDD103、媒体リーダ104、アクセラレータカード105及びNIC106は、バス107に接続される。バス107には、例えば、PCIe(Peripheral Component Interconnect express)が用いられる。
なお、ノード200,300,400もノード100と同様のハードウェアにより実現される。制御装置50もノード100と同様のハードウェアにより実現される。ただし、制御装置50は、アクセラレータカード105に相当するハードウェアを備えなくてよい。
図5は、情報処理システムの機能例を示す図である。
制御装置50は、制御部51を有する。制御部51は、例えば、制御装置50のRAMに記憶されたプログラムを制御装置50のCPUが実行することで実現される。
制御部51は、組合せ最適化問題の問題データの入力の受け付け、問題データのイジング形式への変換、イジング形式に変換した問題の複数の部分問題への分割、複数の部分問題のノード100,200,300,400への割り当てを行う。
第2の実施の形態の例では、制御部51は、問題を4つの部分問題に分割する。問題表現に用いられる全状態変数の数をN個とすると、全状態変数Xはx1~xNである。ノード100,200,300,400の各々に割り当てられる状態変数の数はK=N/4個である。
例えば、ノード100が担当する状態変数群X0は、x1~xKである。ノード200が担当する状態変数群X1は、xK+1~x2Kである。ノード300が担当する状態変数群X2は、x2K+1~x3Kである。ノード400が担当する状態変数群X3は、x3K+1~xNである。
また、制御部51は、ノード100,200,300,400からの解の取得や、取得した解に基づく組合せ最適化問題の解のユーザへの提供を行う。
ノード100,200,300,400は、それぞれデータ記憶部120,220,320,420、解バッファ130,230,330,430、探索部140,240,340,440、通信部150,250,350,450及び探索制御部160,260,360,460を有する。
データ記憶部120,220,320,420及び解バッファ130,230,330,430には、それぞれノード100,200,300,400のRAM(例えば、RAM102)の記憶領域が用いられる。探索部140,240,340,440は、それぞれノード100,200,300,400のアクセラレータカードにより実現される。通信部150,250,350,450及び探索制御部160,260,360,460は、それぞれノード100,200,300,400のCPUが当該ノードのRAMに記憶されたプログラムを実行することで実現される。
以下では、主に、ノード100を例示して説明するが、ノード200,300,400の同名の機能も同様の説明となる。
データ記憶部120は、探索制御部160の処理に用いられるデータを記憶する。例えば、データ記憶部120は、ノード100が担当する状態変数群が関係する、状態変数間の重み係数を記憶する。データ記憶部120が保持する重み係数の数は、K×Nとなる。
解バッファ130は、ノード100で得られた解を保持する。解バッファ130には問題全体に対する解、すなわち、全体解が保持される。解バッファ130に保持される解は、探索部140で探索された部分解や他のノードから受信した解に基づいて更新される。
探索部140は、ノード100に割り当てられた部分問題に対する解の探索を行う。探索部140により探索される部分問題の解は、問題全体に対する部分解である。部分解は、ノード100に割り当てられた状態変数群により表される。
探索部140は、前述のSA、GA、SQA、タブーサーチなどの何れかの探索手法を用いて、部分問題の解を探索する。ここでは、一例として、SAまたはレプリカ交換法を用いる場合を考える。
例えば、探索部140は、状態変数x1~xKのうちの1つの状態変数の値が変化することによるエネルギー関数E’(x)の値の変化量を、状態変数x1~xKの各々について計算し、E’(x)が小さくなる変化が優先される形で確率的に受け入れる。状態変数x1~xKのうち、xiが変化することによるエネルギー値の変化量ΔE’iは以下の式(5)のように表せる。
式(5)において、xiが1から0に変化するとき、δxiは-1となり、状態変数xiが0から1に変化するとき、δxiは1となる。
ただし、探索部140は、自身以外のノードが担当する状態変数xK+1~xNの値を固定する。
また、SA法やレプリカ交換法では、ある状態変数を変化させることによる、あるイジングモデルのある状態から次の状態への遷移確率の決定に、メトロポリス法やギブス法が用いられる。すなわち、探索部140は、エネルギー関数E’(x)の値が大きくなる変化についてもエネルギー値の変化量とノイズ値との比較に応じて確率的に許容する。ノイズ値は、温度値や乱数に基づいて求められる。温度値が大きい程、ノイズ値の振幅が大きくなる。ノイズ値の振幅が大きい程、エネルギー値の増加量が大きい状態遷移が許容されやすくなる。
探索部140は、このような処理を、部分解の1回分の探索に対する探索終了条件が満たされるまで繰り返し、探索終了条件が満たされたときのx1~xKの値を、今回の部分解とする。例えば、探索終了条件は、所定の単位時間が経過したか、あるいは、状態変数の変化の試行回数が所定の単位回数に到達したかなどにより判定される。
なお、図示を省略しているが、探索部140は、状態変数x1~xKの各々の値、状態変数x1~xKの各状態変数間の重み係数を保持するローカルメモリを有している。当該ローカルメモリには、アクセラレータカード105に搭載されたSRAMなどの記憶領域が用いられる。例えば、RAM112は当該ローカルメモリを提供するSRAMでもよい。
通信部150は、解バッファ130に保持される解の他のノードへの送信、及び、他のノードからの解の受信を行う。
探索制御部160は、探索部140及び通信部150を制御する。探索制御部160は、探索部140及び通信部150を非同期に動作させることができる。探索制御部160は、探索部140により取得された部分解に基づいて、解バッファ130に保持される解を更新する。また、探索制御部160は、解バッファ130に保持される解の送信を通信部150に指示する。探索制御部160は、通信部150が他のノードから受信した解に基づいて、解バッファ130に保持される解を更新する。更に、探索制御部160は、解バッファ130に保持される解に基づいて、探索部140における部分問題の情報を変更する。
図6は、部分問題における固定ビットの例を示す図である。
グラフ70は、状態変数x1,x2,x3,xK,xK+1,xNの相互の関係の例を示す。ノード100では、ノード200が担当する状態変数群に含まれるxK+1や、ノード400が担当する状態変数群に含まれるxNが固定ビットとされる。グラフ70の例ではxK+1=1、xN=0である。
探索制御部160は、固定ビットの値と、探索部140が担当する状態変数群に含まれる状態変数と固定ビットとの間の重み係数を用いて、バイアス値b’iを式(3)により確定させることができる。例えば、xKとxK+1との間の重み係数WK,K+1は、b’Kを計算するために用いられ、x3とxK+1との間の重み係数W3,K+1は、b’3を計算するために用いられる。
図7は、各ノードが保持する情報の例を示す図である。
表80は、ノード100,200,300,400の各々が保持する情報の例を示す。
表80は、ノード名、ステート割当部分及び重み係数の項目を含む。
ノード名の項目には、ノード名が記載されている。
ステート割当部分の項目には、該当のノードが担当する状態変数群が記載されている。ここで、ステートとは、問題全体の表現に用いられる全ての状態変数の値により表されるイジングモデルの状態である。
例えば、前述のように、ノード100には、状態変数群X0が割り当てられる。状態変数群X0には、状態変数x1~xKが属する。ノード200には、状態変数群X1が割り当てられる。状態変数群X1には、状態変数xK+1~x2Kが属する。ノード300には、状態変数群X2が割り当てられる。状態変数群X2には、状態変数x2K+1~x3Kが属する。ノード400には、状態変数群X3が割り当てられる。状態変数群X3には、状態変数x3K+1~xNが属する。状態変数群X0,X1,X2,X3の値は、それぞれ探索部140,240,340,440のローカルメモリに保持される。
重み係数の項目には、各ノードが保持する重み係数が記載されている。例えば、ノード100は、重み係数群W_00,W_10,W_20,W_30を保持する。ここで、重み係数の符号のアンダースコア「_」の後の数値は、状態変数に関する次のインデックス範囲を示す。「0」は、1~Kである。「1」は、K+1~2Kである。「2」は、2K+1~3Kである。「3」は、3K+1~Nである。例えば、W_00は、重み係数Wの全体のうちの{Wij}(1≦i≦K,1≦j≦K)の部分である。
また、ノード200は、重み係数群W_01,W_11,W_21,W_31を保持する。ノード300は、重み係数群W_02,W_12,W_22,W_32を保持する。ノード400は、重み係数群W_03,W_13,W_23,W_33を保持する。
重み係数群W_00,W_11,W_22,W_33は、それぞれ探索部140,240,340,440のローカルメモリに保持される。
また、重み係数群W_00,W_10,W_20,W_30は、データ記憶部120に保持される。重み係数群W_01,W_11,W_21,W_31は、データ記憶部220に保持される。重み係数群W_02,W_12,W_22,W_32は、データ記憶部320に保持される。重み係数群W_03,W_13,W_23,W_33は、データ記憶部420に保持される。
図8は、解バッファが保持する情報の例を示す図である。
解バッファ130は、解及びエネルギー値を保持する。便宜的に図示した「#」は解及びエネルギー値を含むレコードの識別番号を示す。
識別番号「0」のレコードは、解「X0_0,X1_0,X2_0,X3_0」及びエネルギー値「E0」である。ここで、第1の実施の形態と同様に、ある状態変数群における各状態変数の値の組を、状態変数群を表すX0などの符号に、「_1」のようにアンダースコア「_」と数字とを付して、例えば「X0_0」、「X0_1」のように区別するものとする。
解バッファ130には、識別番号「0」以外にも、識別番号「1」、「2」、「3」のレコードが格納される例が示されている。
解バッファ130に格納される解及びエネルギー値の組の数は、予め定められる。第2の実施の形態の例では、解バッファ130,230,330,430の各々に解及びエネルギー値の4つの組が格納されるものとする。ただし、解バッファ130,230,330,430の各々に格納される解及びエネルギー値の組の数は4以外の数でもよい。
図9は、エネルギー値の計算方法を説明する図である。
マトリクス90は、重み係数群W_00~W_33の各々に対して計算可能な部分エネルギー値E_00~E_33を例示する。部分エネルギー値E_00~E_33の符号において、アンダースコア「_」の後の数値は、それぞれW_00~W_33の数値部分に対応する。マトリクス90の各要素は対角に対して対称である。例えば、E_01=E_10である。
探索制御部160は、状態変数群X0に関して探索部140で探索された部分解を取得すると、当該部分解を、解バッファ130に保持される解に反映した解候補のエネルギー値を計算する。一方、データ記憶部120は、ノード100に割り当てられた状態変数群X0の各状態変数と結合のある状態変数に関する部分エネルギー値(マトリクス90の部分91)を計算するための重み係数群しか保持していない。例えば、ノード100では、部分エネルギー値E_00,E_10,E_20,E_30の各々を計算可能であるが、部分エネルギー値E_11~E_13,E_21~E_23,E_31~E_33の各々を計算することができない。このため、探索制御部160は、解バッファ130に保持される解において状態変数群X0の部分を新たな部分解に変更する際のエネルギー値を、次のように計算する。
状態変数の全体をSnとする。Snに対応するエネルギー値をEnとする。
また、Sn=Sa&Soと表す。Saは自ノードが担当する状態変数群であり、ノード100の場合、状態変数群X0に相当する。Soは他ノードが担当する状態変数群であり、ノード100に対しては、状態変数群X1,X2,X3に相当する。アンパサンド記号「&」は、&の左側の状態変数群と、&の右側の状態変数群とを組み合わせることを意味する。
エネルギー値Enは、En=Ea+Eoと表される。部分エネルギー値Eaは、Saに対応するエネルギー値である。部分エネルギー値Eoは、Soに対応するエネルギー値である。
自ノードで担当する状態変数群をSaからSa’に更新する場合における、エネルギー値Enに対する更新後のエネルギー値En’を求めることを考える。
Saに対する部分エネルギー値Eaは、自ノードで計算可能である。例えば、ノード100は、解バッファ130に保持される解の状態変数群X0の各状態変数の値と、W_00とから部分エネルギー値Eaを計算し得る。また、Sa’に対する部分エネルギー値Ea’は、自ノードで計算可能である。例えば、ノード100は、新たな部分解と、W_00とから部分エネルギー値Ea’を計算し得る。
よって、状態変数全体に対する更新後のエネルギー値En’は、En’=Ea’+Eo=Ea’+(En-Ea)となり、自ノードだけで計算可能である。
図10は、部分解による解バッファの更新例を示す図である。
図10では、ノード200の処理を例示するが、ノード100,300,400も同様にして、自ノードで得られた部分解により解バッファの解を更新する。
探索制御部260は、探索部240から新しい部分解X1_aを取得すると解バッファ230に格納された解を次のように更新する。
探索制御部260は、解バッファ230に格納されている解において、状態変数群X1の部分を、部分解X1_aに置換した解候補を生成する。解候補は、例えばデータ記憶部220に格納される。このとき、探索制御部260は、図9で説明した方法を用いて、解候補に対応するエネルギー値を計算する。本例では、解バッファ230に4つの解が保持されるため、解候補は4つ生成される。
探索制御部260は、解バッファ230に格納された4つの解、及び、生成した4つの解候補の各々のエネルギー値を比較して、上位n個(本例ではn=4)の解及び解候補を、解バッファ230に残す。上位n個の解及び解候補とは、エネルギー値の低い方から順に抽出したn個の解及び解候補を意味する。
例えば、探索制御部260は、解バッファ230に保持されるエネルギー値E0~E3の4つの解に対して、状態変数群X1の部分を部分解X1_aに置換したエネルギー値E0a~E3aの4つの解候補を生成する。ここで、エネルギー値の大小関係は、E0<E0a<E2a<E3<…であるとする。この場合、探索制御部260は、エネルギー値E0,E0a,E2a,E3に対応する4つの解を解バッファ230に保持し、その他の解及びエネルギー値を破棄する。
図11は、他ノードから受信した解による解バッファの更新例を示す図である。
図11では、ノード100の処理を例示するが、ノード200,300,400も同様にして、他ノードから受信した解により解バッファの解を更新する。
例えば、探索制御部160は、通信部150が他ノードから受信した解を取得する。当該解のエネルギー値はEbである。通信部150は、解と共に、当該解に対応するエネルギー値も他ノードから受信する。
探索制御部160は、解バッファ130に格納された4つの解、及び、他ノードから受信した解の各々のエネルギー値を比較して、上位n個(本例ではn=4)の解を、解バッファ130に残す。
例えば、探索制御部160は、解バッファ130に保持されるエネルギー値E0~E3の4つの解及び他ノードから受信した解のエネルギー値Ebを比較する。エネルギー値の大小関係は、E0<E1<Eb<E3<E2であるとする。この場合、探索制御部160は、エネルギー値E0,E1,Eb,E3に対応する4つの解を解バッファ130に保持し、その他の解及びエネルギー値を破棄する。
図12は、ノード間の解の共有例を示す図である。
例えば、探索制御部260は、探索部240で得られた部分解X1_aに基づいて、解バッファ230に保持される解を更新する。図12の例では、部分解X1_aを含む、エネルギー値E0aの解が解バッファ230に新たに格納される。当該エネルギー値E0aの解は、解バッファ230に保持される解のうち、エネルギー値が最小の解であるとする。
ノード100,200は、次のように、通信部150,250を介して、各々のノードが保持する解及び当該解に対応するエネルギー値を共有する。本例では、あるノードから他のノードへエネルギー値が最も小さい解を送信するものとするが、エネルギー値が小さい方から順に選択された複数の解を送信してもよい。
例えば、通信部250は、解バッファ230に保持される解のうち、エネルギー値が最小である解及び当該解のエネルギー値E0aを、ノード100に送信する。
通信部150は、ノード200より送信された解及びエネルギー値E0aを受信する。すると、解バッファ130に保持されるエネルギー値E0~E3とエネルギー値E0aとが比較される。例えば、E0<E0a<E2<E3<E1の場合、エネルギー値E0,E0a,E2,E3に対応する4つの解が解バッファ130に保持され、エネルギー値E1の解が破棄される。こうして、解バッファ130に保持される解が、ノード200から受信した解で更新される。
ノード200は、ノード300,400にも同様に解及びエネルギー値を送信する。ノード300,400は、ノード100と同様に、ノード200から受信した解及びエネルギー値に基づいて、自ノードの解バッファに保持される解を更新する。
図13は、探索部に対する部分問題の変更を説明する図である。
図13では、ノード200を例示して説明するが、ノード100,300,400も同様の処理を行う。
探索制御部260は、解バッファ230に格納された解に基づいて、他ノードが担当する状態変数群に属する各状態変数の値を決定する。そして、探索制御部260は、探索部240に対して、ノード200に割り当てられた状態変数群X1以外の状態変数群X0,X2,X3を固定した部分問題を設定する。
例えば、探索制御部260は、解バッファ230に保持される複数の解のうち、エネルギー値が最小の解を選択し、選択した解における状態変数群X0,X2,X3の各状態変数の値を採用する。
または、探索制御部260は、解バッファ230に保持される複数の解のうち、ランダムに1つの解を選択し、選択した解における状態変数群X0,X2,X3の各状態変数の値を採用してもよい。このとき、探索制御部260は、解バッファ230に保持される解のうち、エネルギー値が小さい方からk個(例えば、2個または3個程度)の解の中からランダムに、1つの解を選択してもよい。あるいは、探索制御部260は、解バッファ230に保持される複数の解の各々の状態変数群X0,X2,X3の各状態変数の値を比較して、状態変数群X0,X2,X3の各状態変数の値を決定してもよい。例えば、探索制御部260は、他の解と値が一致する状態変数の数が最も多い解を選択し、当該解における状態変数群X0,X2,X3の各状態変数の値を採用してもよい。
このようにして、探索制御部260は、解バッファ230から1つの解を選択し、当該解を基に状態変数群X0,X2,X3に属する各状態変数の値を決定し、重み係数群81に基づいて部分問題の情報、すなわち、式(2)のb’を変更する。探索制御部260は、状態変数群X1については探索部240のローカルメモリに現在保持されている部分解として、変更後のb’や重み係数群81に基づいてエネルギー値を再計算し、再計算した結果を、探索部240に設定する。エネルギー値の計算には、図9で説明した方法を用いることができる。そして、探索制御部260は、探索部240がローカルメモリに保持している部分解を始状態として、探索部240に次の探索を開始させる。
次に、情報処理システム2の処理手順を説明する。まず、制御装置50は、ノード100,200,300,400の各々に部分問題を割り当てる。そして、ノード100,200,300,400は、次に示す処理を実行する。ノード100を主に例示して説明するが、ノード200,300,400もノード100と同様の手順を実行する。
図14は、探索の全体制御の例を示すフローチャートである。
(S1)探索部140は、部分問題に対する解の探索を実行する。探索部140は、当該探索により部分解を得る。探索制御部160は、探索部140で得られた部分解を取得する。
(S2)探索制御部160は、探索後の解更新を実行する。探索後の解更新の処理の詳細は、後述される。
(S3)探索制御部160は、通信部150を介して、他ノードへの解送信を実行する。他ノードへの解送信の処理の詳細は、後述される。
(S4)探索制御部160は、通信部150を介して、他ノードからの解受信を実行する。他ノードからの解受信の処理の詳細は、後述される。
(S5)探索制御部160は、探索の全体制御の終了条件を満たすか否かを判定する。終了条件を満たさない場合、探索制御部160は、ステップS6に処理を進める。終了条件を満たす場合、探索制御部160は、ステップS7に処理を進める。終了条件は、例えば、全体制御の処理の開始から所定時間が経過したことや、上記のステップS1を所定回数実行したことなどである。
(S6)探索制御部160は、探索時の変数固定の処理を実行する。探索時の変数固定の処理は、部分問題の情報の変更を含む。探索時の変数固定の処理の詳細は、後述される。そして、探索制御部160は、ステップS1に処理を進める。
(S7)探索制御部160は、解バッファ130に保持される解を制御装置50に出力する。そして、探索制御部160は、探索の全体制御処理を終了する。
なお、ステップS3の他ノードへの解送信や、ステップS4の他ノードからの解受信は、上記のようにステップS2の後に実行されなくてもよく、所定の周期など、探索部140による探索とは非同期に、任意のタイミングで実行されてもよい。例えば、他ノードへの解送信の周期を、探索部140が探索した部分解を基に解バッファ130の解が更新される周期と同じにするか、または当該周期よりも長くすることが考えられる。また、他ノードからの解受信は、他ノードが解をプッシュ送信した際に実行されてもよい。このように、自ノードでの探索、他ノードへの解送信及び他ノードからの解受信は、それぞれ独立した処理として実行されてもよい。また、ステップS3の他ノードへの解送信や、ステップS4の他ノードからの解受信は、任意の順序で実行されてよい。例えば、ステップS3,S4は逆の順序で実行されてもよい。また、1つのノードが複数の他ノードから連続して解を受信することもある。
図15は、探索後の解更新の第1の例を示すフローチャートである。
探索後の解更新の処理は、ステップS2に相当する。
(S10)探索制御部160は、探索部140より、探索結果の部分解Spを取得する。
(S11)探索制御部160は、解候補生成ループを実行する。図15の手順において、iをループの実行回数とする。iの初期値を0とする。また、Kを解バッファ130に格納されている解の数とする。iはループが1回実行されるたびにインクリメントされる。i<Kである間、下記のステップS12~S14が繰り返し実行される。
(S12)探索制御部160は、解バッファ130からi番目の解S(i)及びエネルギー値E(i)を取得する。
(S13)探索制御部160は、解S(i)に対して、該当ビット、すなわち、ノード100が担当する状態変数群X0に属する状態変数の部分を、部分解Spに置換した解候補S’(i)を生成する。
(S14)探索制御部160は、解候補S’(i)のエネルギー値E’(i)を計算する。エネルギー値E’(i)の計算には、図9で説明した方法を用いることができる。
(S15)探索制御部160は、ループが1回実行されるたびに、iをインクリメントし、i=Kに達すると解候補生成ループを抜けて、ステップS16に処理を進める。
(S16)探索制御部160は、解バッファ130の元の解S(i)と生成した解候補S’(i)の計2K個のエネルギー値E(i)、E’(i)を比較し、エネルギー値の低いK個の解を選択する。選択されるK個の解には、解候補S’(i)が含まれ得る。
(S17)探索制御部160は、ステップS16で選択した選択したK個の解で解バッファ130の解を置換する。そして、探索制御部160は、探索後の解更新処理を終了する。
図16は、他ノードへの解送信の例を示すフローチャートである。
他ノードへの解送信の処理は、ステップS3に相当する。
(S20)探索制御部160は、解バッファ130の中から上位k個、すなわち、エネルギー値の低い解からk個を取得する。図16の手順において、kは1以上かつ解バッファ130に保持される解の数よりも小さい整数である。例えば、kの値は1~3程度の値から予め定められる。
(S21)探索制御部160は、選択したk個の解とエネルギー値とを通信部150を介して他ノードに送信する。解の送信先は、自ノード以外の全てのノードである。そして、探索制御部160は、他ノードへの解送信処理を終了する。
図17は、他ノードからの解受信の例を示すフローチャートである。
他ノードからの解受信の処理は、ステップS4に相当する。
(S30)通信部150は、他ノードから解Srとエネルギー値Erとを受信する。探索制御部160は、通信部150で受信した解Srとエネルギー値Erとを取得する。
(S31)探索制御部160は、解バッファ130の中のWorst解Sw、すなわち、エネルギー値が最大の解Swのエネルギー値Ewを取得する。
(S32)探索制御部160は、Er≦Ewであるか否かを判定する。Er≦Ewの場合、探索制御部160は、ステップS33に処理を進める。Er>Ewの場合、探索制御部160は、他ノードから受信した解Srを破棄して、他ノードからの解受信処理を終了する。
(S33)探索制御部160は、解バッファ130の中のWorst解Swを解Srで置換する。探索制御部160は、Worst解Swを破棄する。そして、探索制御部160は、他ノードからの解受信処理を終了する。
なお、図17では、他ノードから受信する解が1つの例を示したが、他ノードから受信する解が複数の場合、探索制御部160は、解バッファ130の解及び受信した解のうちエネルギー値が小さい方から所定数を解バッファ130に保持する。
また、図16,図17の手順をノード100,200,300,400が実行することで、解バッファ130,230,330,430に同じ解が共有される方向に作用する。ただし、解バッファ130,230,330,430に常に同じ解が保持されるとは限らない。
図18は、探索時の変数固定の例を示すフローチャートである。
探索時の変数固定の処理は、ステップS6に相当する。
(S40)探索制御部160は、解バッファ130の中から上位k個の解、すなわち、エネルギー値の低い解からk個の解のうち、1つの解Ssをランダムに選択する。図18の手順において、kは1以上かつ解バッファ130に保持される解の数よりも小さい整数である。
(S41)探索制御部160は、他ノードに割り当てられた変数部分を、選択した解Ssの値で固定するように、バイアス値を計算する。当該バイアス値は、式(2)のb’に相当する。
(S42)探索制御部160は、選択した解Ssとバイアス値b’とを探索部140に入力し、探索部140による探索を実行させる。探索部140による当該探索の始状態は、ステップS42の段階で探索部140に保持される部分解となる。また、探索制御部160は、選択した解Ssで他ノードが担当する変数部分を固定した場合のエネルギー値を探索部140に入力し、探索部140によりエネルギー値を更新させてもよい。そして、探索制御部160は、探索時の変数固定処理を終了する。
次に、図14~図18で例示した手順に基づく、解バッファ130,230,330,430の各々に保持される解の更新例を説明する。
図19は、解バッファに保持される解の更新の第1の例を示す図である。
初期解z0,z1,z2,z3は、それぞれノード100,200,300,400で最初に保持される解である。初期解z0,z1,z2,z3は、同じでもよいし、異なっていてもよい。図19の例では、初期解z0,z1,z2,z3は同じであり、何れも「X0_0,X1_0,X2_0,X3_0」である。最初の段階では、解バッファ130,230,330,430には解が保持されていない。なお、解バッファ130,230,330,430には、解と共にエネルギー値が格納されるが、解に対応するエネルギー値の図示を省略することがある。また、解バッファ130,230,330,430の各々に保持される解の数は4である。
ノード100は、ノード100に割り当てられた部分問題の解を探索することで、状態変数群X0で表される部分解X0_aを得る。ノード100は、初期解z0の状態変数群X0の部分を部分解X0_aで置換した解a0を生成し、解バッファ130に格納する。
ノード200は、ノード200に割り当てられた部分問題の解を探索することで、状態変数群X1で表される部分解X1_aを得る。ノード200は、初期解z1の状態変数群X1の部分を部分解X1_aで置換した解a1を生成し、解バッファ230に格納する。
ノード300は、ノード300に割り当てられた部分問題の解を探索することで、状態変数群X2で表される部分解X2_aを得る。ノード300は、初期解z2の状態変数群X2の部分を部分解X2_aで置換した解a2を生成し、解バッファ330に格納する。
ノード400は、ノード400に割り当てられた部分問題の解を探索することで、状態変数群X3で表される部分解X3_aを得る。ノード400は、初期解z3の状態変数群X3の部分を部分解X3_aで置換した解a3を生成し、解バッファ430に格納する。
ノード100は、解a0及び解a0のエネルギー値を、ノード200,300,400に送信する。ノード200,300,400は、解a0及び解a0のエネルギー値を受信し、自ノードの解バッファに格納する。
ノード200は、解a1及び解a1のエネルギー値を、ノード100,300,400に送信する。ノード100,300,400は、解a1及び解a1のエネルギー値を受信し、自ノードの解バッファに格納する。
ノード300は、解a2及び解a2のエネルギー値を、ノード100,200,400に送信する。ノード100,200,400は、解a2及び解a2のエネルギー値を受信し、自ノードの解バッファに格納する。
ノード400は、解a3及び解a3のエネルギー値を、ノード100,200,300に送信する。ノード100,200,300は、解a3及び解a3のエネルギー値を受信し、自ノードの解バッファに格納する。
その結果、ノード100,200,300,400は、解a0~a3を共有する。
例えば、ノード100,200,300,400は、自ノードの解バッファに保持される最良の解により他ノードが担当する状態変数を固定して、次の解探索に進む。
図20は、解バッファに保持される解の更新の第1の例(続き)を示す図である。
ノード100は、部分問題の解を探索することで、部分解X0_bを得る。ノード100は、解バッファ130に保持される解a0~a3の状態変数群X0の部分を部分解X0_bで置換した4つの解候補を生成する。ノード100は、解a0~a3及び当該4つの解候補のエネルギー値を比較し、解バッファ130に保持される解a0~a3を解b0~b3に更新する。解b0~b3は、それぞれ解a0~a3の状態変数群X0の部分を部分解X0_bで置換した解である。
ノード200は、部分問題の解を探索することで、部分解X1_bを得る。ノード200は、解バッファ230に保持される解a0~a3の状態変数群X1の部分を部分解X1_bで置換した4つの解候補を生成する。ノード200は、解a0~a3及び当該4つの解候補のエネルギー値を比較し、解バッファ230に保持される解a0~a3を解b4,a1,b5,b6に更新する。解b4,b5,b6は、それぞれ解a0,a2,a3の状態変数群X1の部分を部分解X1_bで置換した解である。
ノード300は、部分問題の解を探索することで、部分解X2_bを得る。ノード300は、解バッファ330に保持される解a0~a3の状態変数群X2の部分を部分解X2_bで置換した4つの解候補を生成する。ノード300は、解a0~a3及び当該4つの解候補のエネルギー値を比較し、解バッファ330に保持される解a0~a3を解b7,b8,a2,b9に更新する。解b7,b8,b9は、それぞれ解a0,a1,a3の状態変数群X2の部分を部分解X2_bで置換した解である。
ノード400は、部分問題の解を探索することで、部分解X3_bを得る。ノード400は、解バッファ430に保持される解a0~a3の状態変数群X3の部分を部分解X3_bで置換した4つの解候補を生成する。ノード400は、解a0~a3及び当該4つの解候補のエネルギー値を比較し、解バッファ430に保持される解a0~a3を解b10,b11,b12,a3に更新する。解b10,b11,b12は、それぞれ解a0,a1,a2の状態変数群X3の部分を部分解X3_bで置換した解である。
ノード100は、解b0~b3のうち、エネルギー値の最も小さい解b1と、解b1のエネルギー値とをノード200,300,400に送信する。ただし、前述のように、ノード100は、エネルギー値の小さい方から所定数の解と当該解のエネルギー値を、ノード200,300,400に送信してもよい。ノード200,300,400も同様である。ノード200,300,400は、解b1を受信すると、解b1のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード200は、解b4,a1,b5,b6のうち、エネルギー値の最も小さい解b4と、解b4のエネルギー値とをノード100,300,400に送信する。ノード100,300,400は、解b4を受信すると、解b4のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード300は、解b7,b8,a2,b9のうち、エネルギー値の最も小さい解b9及び解b9のエネルギー値を、ノード100,200,400に送信する。ノード100,200,400は、解b9を受信すると、解b9のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード400は、解b10,b11,b12,a3のうち、エネルギー値の最も小さい解b12及び解b12のエネルギー値を、ノード100,200,300に送信する。ノード100,200,300は、解b12を受信すると、解b12のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
その結果、ノード100,200,300,400は、例えば解b1,b4,b9,b12を共有する。
例えば、ノード100,200,300,400は、自ノードの解バッファに保持される最良の解により他ノードが担当する状態変数を固定して、次の解探索に進む。
図21は、解バッファに保持される解の更新の第1の例(続き)を示す図である。
ノード100は、部分問題の解を探索することで、部分解X0_cを得る。ノード100は、解バッファ130に保持される解b1,b4,b9,b12の状態変数群X0の部分を部分解X0_cで置換した4つの解候補を生成する。ノード100は、解b1,b4,b9,b12及び当該4つの解候補のエネルギー値を比較し、解バッファ130に保持される解b1,b4,b9,b12を解c0,b4,c1,c2に更新する。解c0,c1,c2は、それぞれ解b1,b9,b12の状態変数群X0の部分を部分解X0_cで置換した解である。
ノード200は、部分問題の解を探索することで、部分解X1_cを得る。ノード200は、解バッファ230に保持される解b1,b4,b9,b12の状態変数群X1の部分を部分解X1_cで置換した4つの解候補を生成する。ノード200は、解b1,b4,b9,b12及び当該4つの解候補のエネルギー値を比較し、解バッファ230に保持される解b1,b4,b9,b12を解c3,b4,c4,c5に更新する。解c3,c4,c5は、それぞれ解b1,b9,b12の状態変数群X1の部分を部分解X1_cで置換した解である。
ノード300は、部分問題の解を探索することで、部分解X2_cを得る。ノード300は、解バッファ330に保持される解b1,b4,b9,b12の状態変数群X2の部分を部分解X2_cで置換した4つの解候補を生成する。ノード300は、解b1,b4,b9,b12及び当該4つの解候補のエネルギー値を比較し、解バッファ330に保持される解b1,b4,b9,b12を解c6,c7,b9,b12に更新する。解c6,c7は、それぞれ解b1,b4の状態変数群X2の部分を部分解X2_cで置換した解である。
ノード400は、部分問題の解を探索することで、部分解X3_cを得る。ノード400は、解バッファ430に保持される解b1,b4,b9,b12の状態変数群X3の部分を部分解X3_cで置換した4つの解候補を生成する。ノード400は、解b1,b4,b9,b12及び当該4つの解候補のエネルギー値を比較し、解バッファ430に保持される解b1,b4,b9,b12を解c8,c9,b9,b12に更新する。解c8,c9は、それぞれ解b1,b4の状態変数群X3の部分を部分解X3_cで置換した解である。
ノード100は、解c0,b4,c1,c2のうち、エネルギー値の最も小さい解c1と、解c1のエネルギー値とをノード200,300,400に送信する。ノード200,300,400は、解c1を受信すると、解c1のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード200は、解c3,b4,c4,c5のうち、エネルギー値の最も小さい解c4と、解c4のエネルギー値とをノード100,300,400に送信する。ノード100,300,400は、解c4を受信すると、解c4のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード300は、解c6,c7,b9,b12のうち、エネルギー値の最も小さい解c6及び解c6のエネルギー値を、ノード100,200,400に送信する。ノード100,200,400は、解c6を受信すると、解c6のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード400は、解c8,c9,b9,b12のうち、エネルギー値の最も小さい解c8及び解c8のエネルギー値を、ノード100,200,300に送信する。ノード100,200,300は、解c8を受信すると、解c8のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
その結果、ノード100,200,300,400は、例えば解c1,c4,c6,c8を共有する。
例えば、ノード100,200,300,400は、自ノードの解バッファに保持される最良の解により他ノードが担当する状態変数を固定して、次の解探索に進む。
図22は、解バッファに保持される解の更新の第1の例(続き)を示す図である。
ノード100は、部分問題の解を探索することで、部分解X0_dを得る。ノード100は、解バッファ130に保持される解c1,c4,c6,c8の状態変数群X0の部分を部分解X0_dで置換した4つの解候補を生成する。ノード100は、解c1,c4,c6,c8及び当該4つの解候補のエネルギー値を比較し、解バッファ130に保持される解c1,c4,c6,c8を解d0,d1,c6,c8に更新する。解d0,d1は、それぞれ解c1,c4の状態変数群X0の部分を部分解X0_dで置換した解である。
ノード200は、部分問題の解を探索することで、部分解X1_dを得る。ノード200は、解バッファ230に保持される解c1,c4,c6,c8の状態変数群X1の部分を部分解X1_dで置換した4つの解候補を生成する。ノード200は、解c1,c4,c6,c8及び当該4つの解候補のエネルギー値を比較し、解バッファ230に保持される解c1,c4,c6,c8を解d2,c4,c6,c8に更新する。解d2は、解c1の状態変数群X1の部分を部分解X1_dで置換した解である。
ノード300は、部分問題の解を探索することで、部分解X2_dを得る。ノード300は、解バッファ330に保持される解c1,c4,c6,c8の状態変数群X2の部分を部分解X2_dで置換した4つの解候補を生成する。ノード300は、解c1,c4,c6,c8及び当該4つの解候補のエネルギー値を比較し、解バッファ330に保持される解c1,c4,c6,c8を解d3,c4,c6,d4に更新する。解d3,d4は、それぞれ解c1,c8の状態変数群X2の部分を部分解X2_dで置換した解である。
ノード400は、部分問題の解を探索することで、部分解X3_dを得る。ノード400は、解バッファ430に保持される解c1,c4,c6,c8の状態変数群X3の部分を部分解X3_dで置換した4つの解候補を生成する。ノード400は、解c1,c4,c6,c8及び当該4つの解候補のエネルギー値を比較し、解バッファ430に保持される解c1,c4,c6,c8を解d5,c4,d6,c8に更新する。解d5,d6は、それぞれ解c1,c6の状態変数群X3の部分を部分解X3_dで置換した解である。
ノード100は、解d0,d1,c6,c8のうち、エネルギー値の最も小さい解d1と、解d1のエネルギー値とをノード200,300,400に送信する。ノード200,300,400は、解d1を受信すると、解d1のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード200は、解d2,c4,c6,c8のうち、エネルギー値の最も小さい解d2と、解d2のエネルギー値とをノード100,300,400に送信する。ノード100,300,400は、解d2を受信すると、解d2のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード300は、解d3,c4,c6,d4のうち、エネルギー値の最も小さい解d4及び解d4のエネルギー値を、ノード100,200,400に送信する。ノード100,200,400は、解d4を受信すると、解d4のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード400は、解d5,c4,d6,c8のうち、エネルギー値の最も小さい解d6及び解d6のエネルギー値を、ノード100,200,300に送信する。ノード100,200,300は、解d6を受信すると、解d6のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
その結果、ノード100,200,300,400は、例えば解d1,d2,d4,d6を共有する。
ノード100,200,300,400は、以降も解バッファにおける解の更新を繰り返し行い、自ノードの解バッファに最終的に保持される解を、制御装置50に出力する。制御装置50に最終的な解を出力するノードは、ノード100,200,300,400のうちの代表のノードだけでもよい。制御装置50に出力される最終的な解は、各ノードで保持されるエネルギー値が最小の解、すなわち、最良の解でもよいし、各ノードで保持される全ての解またはエネルギー値が小さい方から所定数の解でもよい。
ここで、図19~図22の各解バッファの更新の流れは一例であり、ノード100,200,300,400は、自ノードでの部分問題の求解や自ノードから他ノードへの解の送信を、他ノードとは非同期に行える。
図15及び図19~図22で例示した方法によれば、ノード100,200,300,400により、各ノードの解バッファ内の全ての解に対して、部分解で置換した解候補を評価するので、多くの良解に対して、探索結果が早く反映され易いという利点がある。
なお、上記の例では、各ノードで探索された部分解で、当該ノードの解バッファの当該部分解に対応する部分を置換することで解候補を生成し、解バッファの解を解候補で置換するものとしたが、解バッファの解の更新には他の方法も考えられる。
例えば、ノード100,200,300,400は、各々の探索部で得られた部分解と、当該部分解を得るために固定で用いられた他ノードが担当する各状態変数の値とを含む解を、解候補として用いて、自ノードの解バッファの解を更新してもよい。この場合、該当のノードにおける1つの部分解に対する解候補の数は1つとなる。当該解候補のエネルギー値を得るために、例えば、探索制御部160は、探索時の変数固定に使用した解及び当該解のエネルギー値をデータ記憶部120に保持しておいてもよい。例えば、探索制御部160は、当該解候補のエネルギー値と解バッファ130に保持される解のエネルギー値とを比較し、解候補のエネルギー値が、解バッファ130に保持されるWorst解のエネルギー値よりも大きければ、Worst解を解候補で置換する。次に、このような解バッファの解の更新の手順の例を説明する。
図23は、探索後の解更新の第2の例を示すフローチャートである。
探索後の解更新の処理は、ステップS2に相当する。図23の手順は、図15の手順の代わりに実行される。
(S50)探索制御部160は、探索時の自ノード変数以外の変数固定に使用した解Sf、及び、解Sfのエネルギー値Efをデータ記憶部120に保持する。自ノード変数とは、ノード100が担当する状態変数群に含まれる状態変数である。
(S51)探索制御部160は、探索部140より、探索結果の部分解Spを取得する。
(S52)探索制御部160は、変数固定に使用した解Sfに対して、該当ビットを部分解Spに置換した解Sf’を生成する。
(S53)探索制御部160は、解Sf’のエネルギー値Ef’を計算する。エネルギー値Ef’の計算には、図9で説明した方法を用いることができる。
(S54)探索制御部160は、エネルギー値Ef,Ef’を比較し、小さい方の解を選択する。
(S55)探索制御部160は、ステップS54で選択した解で解バッファ130の中のWorst解を置換する。そして、探索制御部160は、探索後の解更新処理を終了する。
なお、探索部140により、状態変数の値の変化に伴って、式(5)に基づき、現在のステートに対するエネルギー値を更新させることも考えられる。その場合、探索制御部160は、ステップS53では、探索部140からエネルギー値Ef’を取得してもよい。
次に、図16~図18及び図23で例示した手順に基づく、解バッファ130,230,330,430の各々に保持される解の更新例を説明する。
図24は、解バッファに保持される解の更新の第2の例を示す図である。
初期解z0,z1,z2,z3は、それぞれノード100,200,300,400で最初に保持される解である。初期解z0,z1,z2,z3は、同じでもよいし、異なっていてもよい。図24の例では、初期解z0,z1,z2,z3は同じであり、何れも「X0_0,X1_0,X2_0,X3_0」である。最初の段階では、解バッファ130,230,330,430には解が保持されていない。なお、解バッファ130,230,330,430には、解と共にエネルギー値が格納されるが、解に対応するエネルギー値の図示を省略することがある。また、解バッファ130,230,330,430の各々に保持される解の数は4である。
ノード100は、ノード100に割り当てられた部分問題の解を探索することで、状態変数群X0で表される部分解X0_aを得る。ノード100は、初期解z0の状態変数群X0の部分を部分解X0_aで置換した解a0を生成し、解バッファ130に格納する。
ノード200は、ノード200に割り当てられた部分問題の解を探索することで、状態変数群X1で表される部分解X1_aを得る。ノード200は、初期解z1の状態変数群X1の部分を部分解X1_aで置換した解a1を生成し、解バッファ230に格納する。
ノード300は、ノード300に割り当てられた部分問題の解を探索することで、状態変数群X2で表される部分解X2_aを得る。ノード300は、初期解z2の状態変数群X2の部分を部分解X2_aで置換した解a2を生成し、解バッファ330に格納する。
ノード400は、ノード400に割り当てられた部分問題の解を探索することで、状態変数群X3で表される部分解X3_aを得る。ノード400は、初期解z3の状態変数群X3の部分を部分解X3_aで置換した解a3を生成し、解バッファ430に格納する。
ノード100は、解a0及び解a0のエネルギー値を、ノード200,300,400に送信する。ノード200,300,400は、解a0及び解a0のエネルギー値を受信し、自ノードの解バッファに格納する。
ノード200は、解a1及び解a1のエネルギー値を、ノード100,300,400に送信する。ノード100,300,400は、解a1及び解a1のエネルギー値を受信し、自ノードの解バッファに格納する。
ノード300は、解a2及び解a2のエネルギー値を、ノード100,200,400に送信する。ノード100,200,400は、解a2及び解a2のエネルギー値を受信し、自ノードの解バッファに格納する。
ノード400は、解a3及び解a3のエネルギー値を、ノード100,200,300に送信する。ノード100,200,300は、解a3及び解a3のエネルギー値を受信し、自ノードの解バッファに格納する。
その結果、ノード100,200,300,400は、解a0~a3を共有する。ここでは、解a0,a1,a2,a3の表記の順序は、エネルギー値の小さい方から大きい方へ並べた順序であるとする。解a0~a3のうち、解a0は、Best解、すなわち、最良の解である。解a0~a3のうち、解a3は、Worst解、すなわち、最悪の解である。
例えば、ノード100,200,300,400は、自ノードの解バッファに保持される最良の解a0により他ノードが担当する状態変数を固定して、次の解探索に進む。
図25は、解バッファに保持される解の更新の第2の例(続き)を示す図である。
ノード100は、部分問題の解を探索することで、部分解X0_bを得る。ノード100は、解a0の状態変数群X0の部分を部分解X0_bで置換した解b0を生成する。解b0は、変数固定に用いた解a0の自ノード担当の状態変数群の部分を自ノードで得た部分解で置換したものであり、解候補の一例である。ノード100は、解a0~a3,b0のエネルギー値を比較し、解バッファ130に保持される解a0~a3を解b0,a0~a2に更新する。すなわち、ノード100は、解バッファ130の解a3を解b0に置換する。また、ノード100は、解b0のエネルギー値が解a0のエネルギー値よりも小さい場合に、解a3を解b0に置換し、それ以外の場合には、解a3を解a0で置換してもよい。ノード200,300,400も同様である。
ノード200は、部分問題の解を探索することで、部分解X1_bを得る。ノード200は、解a0の状態変数群X1の部分を部分解X1_bで置換した解b4を生成する。ノード200は、解a0~a3,b4のエネルギー値を比較し、解バッファ230に保持される解a0~a3を解b4,a0~a2に更新する。すなわち、ノード200は、解バッファ230の解a3を解b4に置換する。
ノード300は、部分問題の解を探索することで、部分解X2_bを得る。ノード300は、解a0の状態変数群X2の部分を部分解X2_bで置換した解b7を生成する。ノード300は、解a0~a3,b7のエネルギー値を比較し、解バッファ330に保持される解a0~a3を解b7,a0~a2に更新する。すなわち、ノード300は、解バッファ330の解a3を解b7に置換する。
ノード400は、部分問題の解を探索することで、部分解X3_bを得る。ノード400は、解a0の状態変数群X3の部分を部分解X3_bで置換した解b10を生成する。ノード400は、解a0~a3,b10のエネルギー値を比較し、解バッファ430に保持される解a0~a3を解b10,a0~a2に更新する。すなわち、ノード400は、解バッファ430の解a3を解b10に置換する。
ノード100は、解b0,a0~a2のうち、エネルギー値の最も小さい解b0と、解b0のエネルギー値とをノード200,300,400に送信する。ただし、前述のように、ノード100は、エネルギー値の小さい方から所定数の解と当該解のエネルギー値を、ノード200,300,400に送信してもよい。ノード200,300,400も同様である。ノード200,300,400は、解b0を受信すると、解b0のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード200は、解b4,a0~a2のうち、エネルギー値の最も小さい解b4と、解b4のエネルギー値とをノード100,300,400に送信する。ノード100,300,400は、解b4を受信すると、解b4のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード300は、解b7,a0~a2のうち、エネルギー値の最も小さい解b7及び解b7のエネルギー値を、ノード100,200,400に送信する。ノード100,200,400は、解b7を受信すると、解b7のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード400は、解b10,a0~a2のうち、エネルギー値の最も小さい解b10及び解b10のエネルギー値を、ノード100,200,300に送信する。ノード100,200,300は、解b10を受信すると、解b10のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
その結果、ノード100,200,300,400は、例えば解b4,b7,b10,b0を共有する。ここで、解b4,b7,b10,b0の表記の順序は、エネルギー値の小さい方から大きい方へ並べた順序である。解b4,b7,b10,b0のうち、解b4は、Best解、すなわち、最良の解である。解b4,b7,b10,b0のうち、解b0は、Worst解、すなわち、最悪の解である。
例えば、ノード100,200,300,400は、自ノードの解バッファに保持される最良の解b4により他ノードが担当する状態変数を固定して、次の解探索に進む。
図26は、解バッファに保持される解の更新の第2の例(続き)を示す図である。
ノード100は、部分問題の解を探索することで、部分解X0_cを得る。ノード100は、解b4の状態変数群X0の部分を部分解X0_cで置換した解c10を生成する。ノード100は、解b4,b7,b10,b0,c10のエネルギー値を比較し、解バッファ130に保持される解b4,b7,b10,b0を解c10,b4,b7,b10に更新する。すなわち、ノード100は、解バッファ130の解b0を解c10に置換する。
ノード200は、部分問題の解を探索することで、部分解X1_cを得る。ノード200は、解b4の状態変数群X1の部分を部分解X1_cで置換した解c11を生成する。ノード200は、解b4,b7,b10,b0,c11のエネルギー値を比較し、解バッファ230に保持される解b4,b7,b10,b0を解c11,b4,b7,b10に更新する。すなわち、ノード200は、解バッファ230の解b0を解c11に置換する。
ノード300は、部分問題の解を探索することで、部分解X2_cを得る。ノード300は、解b4の状態変数群X2の部分を部分解X2_cで置換した解c7を生成する。ノード300は、解b4,b7,b10,b0,c7のエネルギー値を比較し、解バッファ330に保持される解b4,b7,b10,b0を解c7,b4,b7,b10に更新する。すなわち、ノード300は、解バッファ330の解b0を解c7に置換する。
ノード400は、部分問題の解を探索することで、部分解X3_cを得る。ノード400は、解b4の状態変数群X3の部分を部分解X3_cで置換した解c12を生成する。ノード400は、解b4,b7,b10,b0,c12のエネルギー値を比較し、解バッファ430に保持される解b4,b7,b10,b0を解c12,b4,b7,b10に更新する。すなわち、ノード400は、解バッファ430の解b0を解c12に置換する。
ノード100は、解c10,b4,b7,b10のうち、エネルギー値の最も小さい解c10と、解c10のエネルギー値とをノード200,300,400に送信する。ノード200,300,400は、解c10を受信すると、解c10のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード200は、解c11,b4,b7,b10のうち、エネルギー値の最も小さい解c11と、解c11のエネルギー値とをノード100,300,400に送信する。ノード100,300,400は、解c11を受信すると、解c11のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード300は、解c7,b4,b7,b10のうち、エネルギー値の最も小さい解c7及び解c7のエネルギー値を、ノード100,200,400に送信する。ノード100,200,400は、解c7を受信すると、解c7のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード400は、解c12,b4,b7,b10のうち、エネルギー値の最も小さい解c12及び解c12のエネルギー値を、ノード100,200,300に送信する。ノード100,200,300は、解c12を受信すると、解c12のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
その結果、ノード100,200,300,400は、例えば解c7,c12,c10,c11を共有する。ここで、解c7,c12,c10,c11の表記の順序は、エネルギー値の小さい方から大きい方へ並べた順序である。解c7,c12,c10,c11のうち、解c7は、Best解、すなわち、最良の解である。解c7,c12,c10,c11のうち、解c11は、Worst解、すなわち、最悪の解である。
例えば、ノード100,200,300,400は、自ノードの解バッファに保持される最良の解c7により他ノードが担当する状態変数を固定して、次の解探索に進む。
図27は、解バッファに保持される解の更新の第2の例(続き)を示す図である。
ノード100は、部分問題の解を探索することで、部分解X0_dを得る。ノード100は、解c7の状態変数群X0の部分を部分解X0_dで置換した解d7を生成する。ノード100は、解c7,c12,c10,c11,d7のエネルギー値を比較し、解バッファ130に保持される解c7,c12,c10,c11を解d7,c7,c12,c10に更新する。すなわち、ノード100は、解バッファ130の解c11を解d7に置換する。
ノード200は、部分問題の解を探索することで、部分解X1_dを得る。ノード200は、解c7の状態変数群X1の部分を部分解X1_dで置換した解d8を生成する。ノード200は、解c7,c12,c10,c11,d8のエネルギー値を比較し、解バッファ230に保持される解c7,c12,c10,c11を解d8,c7,c12,c10に更新する。すなわち、ノード200は、解バッファ230の解c11を解d8に置換する。
ノード300は、部分問題の解を探索することで、部分解X2_dを得る。ノード300は、解c7の状態変数群X2の部分を部分解X2_dで置換した解d9を生成する。ノード300は、解c7,c12,c10,c11,d9のエネルギー値を比較し、解バッファ330に保持される解c7,c12,c10,c11を解d9,c7,c12,c10に更新する。すなわち、ノード300は、解バッファ330の解c11を解d9に置換する。
ノード400は、部分問題の解を探索することで、部分解X3_dを得る。ノード400は、解c7の状態変数群X3の部分を部分解X3_dで置換した解d10を生成する。ノード400は、解c7,c12,c10,c11,d10のエネルギー値を比較し、解バッファ430に保持される解c7,c12,c10,c11を解d10,c7,c12,c10に更新する。すなわち、ノード400は、解バッファ430の解c11を解d10に置換する。
ノード100は、解d7,c7,c12,c10のうち、エネルギー値の最も小さい解d7と、解d7のエネルギー値とをノード200,300,400に送信する。ノード200,300,400は、解d7を受信すると、解d7のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード200は、解d8,c7,c12,c10のうち、エネルギー値の最も小さい解d8と、解d8のエネルギー値とをノード100,300,400に送信する。ノード100,300,400は、解d8を受信すると、解d8のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード300は、解d9,c7,c12,c10のうち、エネルギー値の最も小さい解d9及び解d9のエネルギー値を、ノード100,200,400に送信する。ノード100,200,400は、解d9を受信すると、解d9のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
ノード400は、解d10,c7,c12,c10のうち、エネルギー値の最も小さい解d10及び解d10のエネルギー値を、ノード100,200,300に送信する。ノード100,200,300は、解d10を受信すると、解d10のエネルギー値と自ノードの解バッファに保持される解のエネルギー値とを比較して、そのうちエネルギー値が小さい解を優先して4つ保持する。
その結果、ノード100,200,300,400は、例えば解d10,d7,d8,d9を共有する。
ノード100,200,300,400は、以降も解バッファにおける解の更新を繰り返し行い、自ノードの解バッファに最終的に保持される解を、制御装置50に出力する。制御装置50に最終的な解を出力するノードは、ノード100,200,300,400のうちの代表のノードだけでもよい。制御装置50に出力される最終的な解は、各ノードで保持されるエネルギー値が最小の解、すなわち、最良の解でもよいし、各ノードで保持される全ての解またはエネルギー値が小さい方から所定数の解でもよい。
ここで、図24~図27の各解バッファの更新の流れは一例であり、ノード100,200,300,400は、自ノードでの部分問題の求解や自ノードから他ノードへの解の送信を、他ノードとは非同期に行える。
図23~図27で例示した方法によれば、ノード100,200,300,400により、最良の解に対してのみ操作が行われ、自ノードが担当する状態変数群に対応する部分解を更新するので、解が改悪される可能性が小さいという利点がある。また、各ノードの探索部にエネルギー値を更新させる場合、解候補のエネルギー値を探索部から取得でき、各ノードが自ノードの解バッファを更新する際に、探索制御部160が解候補に対するエネルギー値の再計算を行わなくてもよいという利点がある。
なお、ノード100,200,300,400が担当する状態変数群が互いに重複しないように部分問題を割り当てる例を説明したが、次のように、各ノードが担当する状態変数群の一部が重複してもよい。
図28は、部分問題の分け方の例を示す図である。
例えば、制御装置50は状態変数群X0,X1,X2,X3で表される問題全体を3つの部分問題に分割し、当該3つの部分問題をノード100,200,300に割り当てる。ノード100には、状態変数群X0,X1が割り当てられる。ノード200には、状態変数群X1,X2が割り当てられる。ノード300には、状態変数群X2,X3が割り当てられる。
この場合、ノード100は、重み係数群W_00,W_10,W_20,W_30,W_01,W_11,W_21,W_31を保持し、部分問題の解の探索に用いる。ノード100に割り当てられた部分問題の解、すなわち、部分解は、状態変数群X0,X1の各状態変数により表される。例えば、探索部140は、重み係数群W_00,W_10,W_01,W_11を、探索部140のローカルメモリに保持して探索に用いる。
また、ノード200は、重み係数群W_01,W_11,W_21,W_31,W_02,W_12,W_22,W_32を保持し、部分問題の解の探索に用いる。ノード200に割り当てられた部分問題の解、すなわち、部分解は、状態変数群X1,X2の各状態変数により表される。例えば、探索部240は、重み係数群W_11,W_21,W_12,W_22を、探索部240のローカルメモリに保持して探索に用いる。
更に、ノード300は、重み係数群W_02,W_12,W_22,W_32,W_03,W_13,W_23,W_33を保持し、部分問題の解の探索に用いる。ノード300に割り当てられた部分問題の解、すなわち、部分解は、状態変数群X2,X3の各状態変数により表される。例えば、探索部340は、重み係数群W_22,W_32,W_23,W_33を、探索部340のローカルメモリに保持して探索に用いる。
なお、図28では、解バッファ130,230,330に格納されるエネルギー値及び探索制御部160,260,360の図示を省略している。解バッファ130,230,330の解及びエネルギー値は、それぞれ探索制御部160,260,360により更新され得る。
例えば、ノード200は、探索部240による探索結果として、部分解「X1_b,X2_b」を取得し、部分解「X1_b,X2_b」を含む解「X0_1,X1_b,X2_b,X3_1」及び当該解のエネルギー値を解バッファ230に格納する。解「X0_1,X1_b,X2_b,X3_1」は、解バッファ230の中でエネルギー値が最小の解である。ノード200は、解「X0_1,X1_b,X2_b,X3_1」及び当該解のエネルギー値をノード100,300に送信する。
ノード100は、ノード200から解「X0_1,X1_b,X2_b,X3_1」及び当該解のエネルギー値を受信し、解バッファ130に保持される解とのエネルギー値の比較に応じて、解バッファ130に保持される解を受信した解で置換する。
ノード300は、ノード200から解「X0_1,X1_b,X2_b,X3_1」及び当該解のエネルギー値を受信し、解バッファ330に保持される解とのエネルギー値の比較に応じて、解バッファ330に保持される解を受信した解で置換する。
このように、ノード100,200,300の各々が担当する状態変数群の一部を重複させてもよい。
また、各ノードが有する探索部の数は複数でもよい。次に、ノード100が複数の探索部を有する例を説明する。
図29は、ノードの他のハードウェア例を示す図である。
例えば、ノード100は、図4で例示したハードウェアに加えて、アクセラレータカード105aを更に有してもよい。アクセラレータカード105aは、アクセラレータカード105と同様に、イジングモデルのエネルギー関数で表される問題の解を探索するハードウェアアクセラレータである。
アクセラレータカード105aは、GPU111a及びRAM112aを有する。GPU111aは、アクセラレータカード105aにおける探索機能を実現する。当該探索機能は、FPGAやASICなどの他の種類の集積回路により実現されてもよい。RAM112aは、GPU111aの探索に用いられるデータやGPU111aにより探索された部分問題の解を保持する。
なお、アクセラレータカード105aは、アクセラレータカード105と同じ探索手法を用いるものでもよいし、アクセラレータカード105aとは異なる探索手法を用いるものでもよい。例えば、アクセラレータカード105がSA、アクセラレータカード105aがタブーサーチを用いるものでもよい。また、ノード100は、3以上のアクセラレータカードを有してもよい。
図30は、ノードの他の機能例を示す図である。
例えば、ノード100は、図5で例示した機能に加えて、探索部140aを更に有してもよい。探索部140aは、アクセラレータカード105aにより実現される。
探索部140aは、探索部140と同じ部分問題を扱ってもよいし、探索部140とは異なる部分問題を扱ってもよい。
探索部140,140aが同じ部分問題を扱う場合、探索部140,140aで解バッファ130を共有してよい。探索部140,140aが異なる部分問題を扱う場合、探索部140,140aで解バッファ130を共有してもよいし、探索部140,140aに別個の解バッファを割り当ててもよい。探索部140,140aに別個の解バッファを割り当てる例として、RAM102に第1の解バッファ及び第2の解バッファを設け、探索部140に第1の解バッファを割り当て、探索部140aに第2の解バッファを割り当てることが考えられる。
探索制御部160は、探索部140,140aで解バッファ130を共有する場合、探索部140,140aの各々の探索結果として得られた部分解に基づいて、解バッファ130に保持される解を更新する。また、探索制御部160は、解バッファ130に保持される解を他ノードに送信する。
探索部140,140aに別個の解バッファを割り当てる場合、探索制御部160は、探索部140の探索結果として得られた部分解に基づいて、探索部140に割り当てた第1の解バッファに保持される解を更新する。探索制御部160は、探索部140aの探索結果として得られた部分解に基づいて、探索部140aに割り当てた第2の解バッファに保持される解を更新する。また、探索制御部160は、第1の解バッファの解を他ノードに送信する際に、当該解のエネルギー値と第2の解バッファに保持される解のエネルギー値との比較に応じて第2の解バッファの解を更新する。同様に、探索制御部160は、第2の解バッファの解を他ノードに送信する際に、当該解のエネルギー値と第1の解バッファに保持される解のエネルギー値との比較に応じて第1の解バッファの解を更新する。
例えば、探索制御部160は、第1の解バッファに保持される解に基づいて、探索部140に対し、探索部140が担当する状態変数群以外の状態変数群における状態変数の値を固定する。探索制御部160は、第2の解バッファに保持される解に基づいて、探索部140aに対し、探索部140aが担当する状態変数群以外の状態変数群における状態変数の値を固定する。
このように、ノード100は、複数の探索部を有してもよい。ノード200,300,400もノード100と同様に複数のアクセラレータカードを備え、当該複数のアクセラレータカードにより実現される複数の探索部を有してもよい。また、前述のように、1つのノードにおける複数の探索部の少なくとも1つは当該ノードのCPUが実行するソフトウェアにより実現されてもよい。
上記のように、1つのノードの複数の探索部で用いられる探索手法は同じでもよいし、異なっていてもよい。また、ノード100,200,300,400が互いに異なる探索手法を用いてもよい。
図31は、複数の探索手法を用いる情報処理システムの例を示す図である。
例えば、ノード100はSQAを用いる。ノード200は、タブーサーチ(Tabu)を用いる。ノード300は、SAを用いる。ノード400は、GAを用いる。このように、ノード100,200,300,400が互いに異なる探索手法を用いてもよい。あるいは、ノード100,200,300,400の少なくとも2つのノードがSAを用い、他のノードがSQAやタブーサーチを用いるというように、少なくとも2つのノードで同じ探索手法を用いてもよい。ノード100,200,300,400の全てが同じ探索手法を用いてもよい。
例示のように、ノード単位に探索手法が異なってもよいし、1つのノードに複数の探索手法を用いる複数のアクセラレータが混載されてもよい。アクセラレータは、前述のように、FPGA、GPU、ASICなどにより実現される。第2の実施の形態で例示したように、1つのノードにFPGA、GPU、ASICなどのうちの少なくとも2種類の集積回路が混載されてもよい。
上記に説明した情報処理システム2によれば、求解性能を向上できる。具体的には次の通りである。
情報処理システム2では、複数のノードの各々が、各ノードで得られている複数の解のうちの最良の解を他のノードと共有し、共有した解に基づき各ノードでの次の探索において固定する状態変数群の各状態変数の値を決定する。より良い解の近傍には、更に良い解が存在する可能性が高いと推定される。このため、各ノードで発見された良解を他ノードと共有し、共有した解を基に固定する状態変数群の各状態変数の値を決定することで、探索空間をより良い解の近傍に絞り込め、何れかのノードが最適解に到達する可能性を向上できる。例えば、複数のノードの何れかで、所定時間内に、最適解あるいは予め定められた目標値よりもエネルギー値が小さくなる解が得られる可能性が高まる。こうして、情報処理システム2による求解性能を向上できる。
また、問題の規模の増大に伴い、各ノードの探索に利用可能なメモリ容量(例えば、探索部のローカルメモリのメモリ容量)の制約などによって、現状のノード数では一度に全ての部分問題を処理できない場合もある。
例えば、イジングモデルに置き換えられた問題の計算では、エネルギー関数に含まれる状態変数間の相互作用の大きさを表す重み係数が用いられる。問題規模の増大に応じて状態変数の数が増えると、重み係数の数も増加する。このため、重み係数の総サイズが、単一の探索部における探索実行に利用可能なメモリ容量(例えば、探索部のローカルメモリの容量)を超過することがある。
そこで、例えば、所定の制御装置により、求解対象の問題を複数の部分問題に分割し、同一の探索手法を用いる複数の探索部に複数の部分問題を割り当て、複数の探索部を同期させて、各々の部分問題を解かせることが考えられる。
しかし、問題規模の増大に伴って、予め用意された数の探索部では、一度に全ての部分問題を解くことができないことがある。また、複数の探索部を同期制御するシステムでは、探索部の拡張性に乏しく、新たな探索部の追加が容易でない。
例えば、予め用意された数の探索部では一度に全ての部分問題を解くことができない場合、1つの探索部において、探索対象の部分問題を入れ替えながら、幾つかの部分問題を順番に処理する方法も考えられる。この方法では、例えばノードなどの情報処理装置のHDDやSSDなどの補助記憶装置に、処理させる複数の部分問題に対応する複数の重み係数群を格納しておき、今回探索対象の部分問題に対応する重み係数群を、探索部のローカルメモリに格納する。しかし、この方法では、探索実行のためにローカルメモリに格納される重み係数のサイズが低減されるものの、部分問題の入れ替えに伴って、当該ローカルメモリと補助記憶装置との間での重み係数の入れ替えが生じる。重み係数の入れ替えには時間がかかり、遅延の要因になる。
一方、情報処理システム2によれば、各ノードは、互いに非同期に部分問題を解き、自ノードで得られた良解を非同期に他ノードと共有する。このため、探索部の拡張性に優れ、問題規模に対して探索部の数が少ない場合でも、探索部の追加を容易に行える。
しかも、あるノードが用いる探索手法は、他ノードが用いる探索手法と異なっていてもよい。また、単一ノード内の複数の探索部で互いに探索手法が異なっていてもよい。任意の探索手法を用いる探索部を使用できるため、探索部の拡張性に優れ、問題規模に対して探索部の数が少ない場合でも、探索部の追加を容易に行える。
例えば、予め用意された数の探索部では一度に全ての部分問題を解くことができない場合でも、容易に探索部を追加して、1つの探索部における部分問題の入れ替えを抑えることが可能になる。このため、情報処理システム2による探索が高速化する。その結果、所定時間内に、最適解あるいは予め定められた目標値よりもエネルギー値が小さくなる解が得られる可能性が高まる。
このように、情報処理システム2によれば、比較的規模の大きな問題に対しても求解性能を向上できる。
以上で説明した情報処理システム2は、例えば次の処理を実行する。下記の処理は情報処理システム1でも実行され得る。
情報処理システム2は、複数の状態変数を含むエネルギー関数により表される問題の解を探索する。情報処理システム2は、問題を分割することによって生成された複数の部分問題のそれぞれが割り当てられる複数のノードを有する。ノード100,200,300,400は、複数のノードの一例である。
複数のノードの各々は、複数の状態変数のうち、自ノードに割り当てられた部分問題に対応する状態変数群により表される部分解を探索し、当該部分解が反映された、問題の第1の解を含む複数の解を保持する。解バッファ130に保持される解は当該複数の解の一例である。解バッファ230,330,430に保持される解も同様である。
複数のノードのうちの第1ノードは、第1ノードで保持する複数の解のうちの少なくとも1つの解を複数のノードのうちの第2ノードに送信する。
第2ノードは、第1ノードから受信した解に基づいて、第2ノードで保持する複数の解の少なくとも一部を更新する。
これにより、第1ノード及び第2ノードにより共同で解が改善され、求解性能を向上できる。例えば、第1ノードで発見された良解を第2ノードと共有し、共有した解を基に、第2ノードで探索空間をより良い解の近傍に絞り込むことが可能になる。その結果、第2ノードが所定時間内に最適解やエネルギー関数の値が目標値より小さい解に到達する可能性を向上できる。
なお、第1ノードから受信した解に基づく第2ノードが保持する複数の解の少なくとも一部を更新する処理は、第1ノードが第2ノードに解を送信することで第2ノードが保持する複数の解の少なくとも一部を第2ノードに更新させる処理に対応する。
また、第1ノードは、第1ノードで保持する複数の解の各々に対応するエネルギー関数の値に基づいて、第2ノードに送信する少なくとも1つの解を選択する。例えば、エネルギー関数の値を最小化する問題では、第1ノードは、エネルギー関数の値が小さい解を優先して第2ノードに送信する。
これにより、第1ノードで発見されたより良い解を第2ノードと共有できる。その結果、例えば、第2ノードで探索空間を良解の近傍に絞り込む際の精度が向上される。
第2ノードは、第1ノードから受信した解に対応するエネルギー関数の値と第2ノードで保持する複数の解に対応するエネルギー関数の値との比較に応じて、第2ノードで保持する複数の解の少なくとも一部を、第1ノードから受信した解に置換する。例えば、エネルギー関数の値を最小化する問題では、エネルギー関数の値が小さい解が優先して保持される。
これにより、第2ノードで保持される解を適切に改善していくことができる。その結果、例えば、第2ノードで探索空間を良解の近傍に絞り込む際の精度が向上される。
また、第2ノードは、第2ノードで保持する複数の解のうちの少なくとも1つの解を第1ノードに送信し、第1ノードは、第2ノードから受信した解に基づいて、第1ノードで保持する複数の解の少なくとも一部を更新する。
第1ノード及び第2ノードで双方向に解を共有することで、第1ノード及び第2ノードの何れかで最適解やエネルギー関数の値が目標値より小さい解に到達する可能性を向上できる。
また、複数のノードの各々は、部分解の探索では、自ノードで保持する複数の解に基づいて、自ノードに割り当てられた部分問題に対応する状態変数群以外の他の状態変数群に含まれる状態変数を固定値に固定し、部分解の探索を行う。
各ノードで互いに共有した解を基に、各ノードでの探索空間をより良い解の近傍に絞り込むことで、各ノードにより共同で解が改善されてゆき、何れかのノードが所定時間内に最適解やエネルギー関数の値が目標値より小さい解に到達する可能性を向上できる。
また、複数のノードの各々は、自ノードに保持される複数の解のうち、自ノードに割り当てられた部分問題に対応する状態変数群の部分を、探索した部分解に置換することで第1の解を生成する。
これにより、各ノードは自ノードで得た部分解に基づいて、自ノードで保持される解よりも良い解を取得し得る。また、該当のノードで保持される全ての解に対して、部分解で置換した解候補を評価するので、多くの良解に対して、探索結果が早く反映され易くなる。
あるいは、複数のノードの各々は、複数の状態変数のうちの自ノードに割り当てられた部分問題に対応する状態変数群以外の他の状態変数群に含まれる状態変数に対して設定された固定値であって、部分解の探索に用いられた固定値を、部分解と組み合わせることで第1の解を生成してもよい。
これにより、各ノードは自ノードで得た部分解に基づいて、自ノードで保持される解よりも良い解を取得し得る。
また、複数のノードの各々は、複数の状態変数における2つの状態変数間の重みを示す重み係数の全体のうち、自ノードに割り当てられた部分問題に対応する状態変数群に含まれる状態変数に関係する部分を保持する。すなわち、複数のノードの各々は、重み係数の全体のうち、自ノードが担当する状態変数群に相当する部分以外の他の部分を保持しなくてよい。
これにより、各ノードに保持される重み係数のサイズを低減でき、各ノードでの省メモリ化を図れる。
また、第1ノード及び第2ノードの各々は、自ノードにおける部分問題の探索、及び、自ノードから他ノードへの解の送信を、互いに非同期に実行してもよい。
これにより、問題の規模が増大して、ノードの数が不足しても、新たなノードを容易に追加できる。ノードを容易に追加できることで、各ノードの探索部で部分問題の入れ替えを行わずに済む可能性が高まり、当該部分問題の入れ替えに伴う遅延を抑えられる。すなわち、問題規模の増大に対して、求解性能を容易に向上できる。
また、第1ノード及び第2ノードの各々は、互いに異なる探索アルゴリズムを用いて自ノードに割り当てられた部分問題に対応する状態変数群で表される部分解を探索してもよい。
これにより、問題の規模が増大して、ノードの数が不足しても、新たなノードを容易に追加できる。ノードを容易に追加できることで、各ノードの探索部で部分問題の入れ替えを行わずに済む可能性が高まり、当該部分問題の入れ替えに伴う遅延を抑えられる。すなわち、問題規模の増大に対して、求解性能を容易に向上できる。
また、第1ノードは、複数の部分問題のうち第1部分問題及び第2部分問題が割り当てられてもよく、互いに同じ探索アルゴリズムまたは異なる探索アルゴリズムを実行する第1探索部及び第2探索部を有してもよい。例えば、探索部140,140aは、それぞれ第1探索部及び第2探索部の一例である。第1探索部は、第1部分問題に対応する第1状態変数群で表される第1部分解を探索する。第2探索部は、第2部分問題に対応する第2状態変数群で表される第2部分解を探索する。
このように、1つのノードに2つ以上の探索部を設け、1つのノードに2つ以上の部分問題を割り当てることで、求解を効率的に実行することもできる。
更に、情報処理システム2は、制御部51を含んでもよい。制御部51は、複数のノードに複数の部分問題を割り当て、複数のノードの各々による部分解の探索、及び、ノード間での解の送受信が繰り返して一定時間行われると、複数のノードの各々が保持する複数の解のうちの少なくとも1つの解を取得し、取得した解を出力する。
これにより、複数のノードを用いて得られた最終的な解を適切に取得できる。前述のように、制御部51は、複数のノードが各々の解バッファに保持する少なくとも1つの解を取得し、取得した解を出力する。例えば、制御部51は、エネルギー値の小さい解を優先して出力してもよい。制御部51は、取得した解を組合せ最適化問題の解の形式に変換し、変換後の解の内容を、制御装置50に接続されたディスプレイに表示させたり、ネットワーク60に接続されたクライアントコンピュータなどのコンピュータに送信したりしてもよい。
また、制御部51の機能を制御装置50に設ける例を示したが、ノード100,200,300,400の何れか1つが制御部51の機能を有してもよい。例えば、ノード100,200,300,400の何れかのCPUが、当該ノードのRAMに記憶されたプログラムを実行することで制御部51の機能を発揮してもよい。
また、複数のノードの各々は、複数の解のうち、複数の解の各々に対応するエネルギー関数の値に応じて所定数の解を保持する。例えば、複数のノードの各々は、自ノードで得られた解のうちのエネルギー値が比較的良い解に絞って保持することで、各ノードの解バッファに要するメモリ容量を小さくでき、省メモリ化を図れる。
なお、第1の実施の形態の情報処理は、処理部12にプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、ノード100,200,300,400のCPUにプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体61に記録できる。
例えば、プログラムを記録した記録媒体61を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体61に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。