Next: Up: Previous:

並列探索

前処理が終り, 全スタック領域がincompatible isletの集合に分割されたら, 並列探索を始める. 探索の各段で一つののincompatible isletに注目し, その isletから何も取り出さないか, または, 今までに選ばれたスタック領域全て と共存可能なもののうち, どれか一つを選ぶかの全通りについて, 残りの isletに対する処理を行なう.

この時, 要素数の少ないisletから順に探索を行なう. 言い替えれば探索木の 枝別れの数が, なるべく根に近い部分で少なく, 葉に近い部分で多くなるよう にする. これは, どのような順に処理をしても, 枝苅りが平均的には同じくら いの段数で起こるとすると, 同じ段数までの枝の数が少ない方が合計して探索 すべきノード数が少なくなるからである. 後の実験結果で, このことを検証す る.

並列度は子ノードの探索が全て独立に実行可能であることから, 容易に抽出で きる. 実際には, ある閾値を設け, その深さ迄を並列に, かつランダムなプロ セッサにforkして行ない, 残りは一つのプロセッサで逐次的に行なう. 閾値は, 枝苅りがないという仮定のもとで, 少なくともプロセッサ台数×10000個のノー ドが作られる深さを, 探索開始前に見積もり, その段数迄を並列に行なうよう に定めた(後の評価では, 閾値はプログラムに対する入力として与えている). なお, 動的な負荷分散は行なっていない. 後の実験結果で, 動的な負荷分散を 行なった場合にどれだけの改善が得られる可能性があるかを検討する.

枝苅りは以下のように行なう. あるノードを根とする探索を行なう時に, その ノードの子供で達成し得るエネルギーの最大値を与える. もしこの最 大値が, 現在までに達成されたエネルギー値より小さければそのノードはそれ 以上探索しない. この最大値は探索木全体の根における最大値を探索開始前に 計算して, 後は探索が一段進む毎に, その段で実際に得られた値と, その段で 得られるエネルギーの最大値との差を引いていくことによって計算する.



Mitsubishi Research Institute,Inc.
Thu Feb 27 10:00:46 JST 1997