• 検索結果がありません。

第 5 章 枝刈り機構のオーバヘッドの削減 41

5.3 記述例

5.3 記述例 47

48 第5章 枝刈り機構のオーバヘッドの削減

ks sum cap[ ] = sum

ks sum cap items@((val,size) :rest)

|cap < 0 = 0

|cap == 0 = sum

|cap > 0 = max (ks (sum+val) (cap−size) items) (ks sum cap rest)

a. 素朴な記述

ks sum cap[ ] = sum À ε

ks sum cap items@((val,size) :rest)

|cap < 0 = 0 À ε

|cap == 0 = sum À ε

|cap > 0 = sum + (val/size)∗cap À

maxB (ks (sum+val) (cap−size) items) (ks sum cap rest)

b. IS を用いる記述

ks sum cap[ ] = sum À ε

ks sum cap items@((val,size) :rest)

|cap < 0 = 0 À ε

|cap == 0 = sum À ε

|cap > 0 = sum + (val/size)∗cap À

maxB0 (ks (sum+val) (cap−size) items) (ks sum cap rest)

where

maxB0 xs ys =maxB (spec (cap ≤size 2) xs) (spec (cap <size) ys)

c. 粒度を調節する記述

5.2 ナップサック問題を解くプログラム

5.3 記述例 49 が成り立つ.(items は利得率で降順に整列してあるから v/s≤val/sizeである.)さら に,cap−size∗20 のとき,

x0 = (sum+val 2) + (val/size)(cap−size 2)

となり,x0 =x ≥y が成り立つ.したがって,cap ≥size∗2 のとき x を間引くように すればよい.

また,cap−size <0のとき,x=−∞となるから,y0 ≥xである.ゆえに,cap < size のとき y を間引くようにすればよい.IS を用いる従来の記述に,判定式 cap ≥size∗2 と cap < size による間引きの記述を追加して,粒度を調節する記述(図 5.2 c)を得る.

粒度を調節する記述は簡潔である.素朴な記述との類似性に注意されたい.粒度を調節 するプログラムは,素朴なプログラムの構造を完全に残している.追加した記述は,本質 的には,計算の終端,近似値,間引きの記述のみである.このように,提案手法に基づけ ば,簡潔さを失うことなく粒度の調節を記述できる.

5.3.2 8 パズル

8 パズルとは,3×3に仕切られた盤上にある 1 8 と書かれた八つのタイルを図 5.3 のような配置に揃えるパズルである.ここでは解に至る最小の手数を求めるプログラムを 取り上げる.

まず,IS を用いない素朴なプログラムを示す(図 5.4 a).タイルが目的の配置になっ たら手数を返して計算を終える.揃っていなければ,タイルを一つスライドした配置か ら解に至る手数を再帰的に求めて,それらの最小値を取る.cost は手数を示す累積変数,

conf はタイルの配置である.isGoal は配置を判定し,children は空白に隣接する各タ イルをスライドした各配置からなるリストを返す.

次に,IS を用いるプログラムを示す(図5.4 b).この関数 pz は二項関係を とする IS を返す.近似値にはマンハッタン距離を用いる.マンハッタン距離MD は,各座標の 差の絶対値の和

MD (x1, y1) (x2, y2) =|x1−x2|+|y1−y2|

と表される.あるタイルの現在地から目的地までのマンハッタン距離は,そのタイルを目

2 5 1

7 6 3

8 4

−→

1 2

3 4 5

6 7 8

5.3 8 パズルの初期配置と目的配置

50 第5章 枝刈り機構のオーバヘッドの削減

pz cost conf

|isGoal conf =cost

|otherwise =foldl1min [pz (cost + 1)cf |cf children conf ]

a. 素朴な記述

pz cost conf

|isGoal conf =cost ¿ ε

|otherwise =cost + md conf ¿

foldl1minB [pz (cost + 1)cf |cf children conf ]

b. IS を用いる記述

pz cost conf

|isGoal conf =cost ¿ ε

|otherwise =cost + md conf ¿

foldl1minB0 [pz (cost + 1)cf |cf children conf ] where

minB0 (x ¿xs) (y ¿ys) = minB (spec (x + 2 y) (x ¿xs)) (spec (y+ 2 x) (y ¿ys)) c. 粒度を調節する記述

5.4 8 パズルを解くプログラム

的地にスライドさせるのにかかる最小の手数である.ゆえに,現在の配置から目的の配 置に至るまでにかかる最小の手数は,各タイルの目的地までのマンハッタン距離の総和

md conf として表せる.この総和をそれまでの手数に加えた値を近似値とする.

提案手法に基づき,粒度調節の記述を追加する.minB (x ¿x0 ¿xs0) (y¿y0 ¿ys0) において,x0 ≤y のときx を,y0 ≤x のときy を間引くようにすればよい.間引きの判 定式を,ks とは異なる方法により求める.pz では minB を可変長のリストに適用して

5.4 実験 51

関連したドキュメント