問題表現:(5リットルの壷の水の量、8リットルの壷の水の量) 初期状態:(5,0)または(0,8) [または(0,0)または(5,8)] 目標状態:(2、X) 操作: (X,Y)⇒(5、Y)、(X,Y)⇒(X,8) (X,Y)⇒(0、Y)、(X,Y)⇒(X,0) (X,Y)⇒(X−Z、Y+Z=8) (X,Y)⇒(X+Z=5、YーZ) (5,0)⇒(0,5)⇒(5,5)⇒(2,8)
5×m−8×n=2 ⇒ 5 10 8 (m=2、n=1) 15 20 16 25 24 30 35 32 40 40 45 50 48 (m=10、n=6) : : :
8×n−5×m=2となった後、5を空にし8に入れる ⇒ 8 5 16 15 24 20 32 30 (n=4、m=6) 40 40 48 45 56 55 64 60 72 70 (n=9、m=14) : : :
残った水の量=A×m−B×n A=k×A1、B=k×B1とすると 残った水の量=k(A1×m−B1×n)、kの倍数 ⇒(4、X)? 5m−8n⇒m=4、n=2 ⇒(1、X)? 5m−8n⇒m=5、n=3 目標状態に到着できる必要条件:最大公約数の倍数 なぜ最大公約数か? m回 ┃ ┃ ┃ k ┃ これはどのような状態か? ┗━━━┛ ┃ ┃ ┃ A ┃ ┃ k ┃ ┣━━━┫ ┣━━━┫ ┃ A ┃ ┃ ┃ ┣━━━┫ ┃ B ┃ ┃ A ┃ ┣━━━┫ ┣━━━┫ : : : : : : ┣━━━┫ ┣━━━┫ ┃ A ┃ ┃ ┃ ┣━━━┫ ┃ B ┃ ┃ A ┃ ┗━━━┛ ┗━━━┛ k+B×n=A×m
問題表現: (渡ってない父の数、渡ってない息子の数、渡ってない船の数) 初期状態:(1,n,1) 目標状態:(0,0,0) (1,n,1)⇒(1,n−2,0) ⇒(1,n−1,1)⇒(0,n−1,0) ⇒(0,n,1)⇒… nの条件:n≧2
最短のコストでAからIに行くにはどう行ったらいいか?A─┬─B(5)───E(8)× ├─C(3)─┬─E(6)─┬─F(10)× │ │ └─H(8)───I(11) │ ├─F(7)─┬─G(10) │ │ ├─H(11)× │ │ └─I(13)× │ └─H(11)× └─D(4)─┬─F(9)× └─G(10)─┬─F(17)× └─I(14)×
【最小コスト探索】 stack S=[a,b,c] push_down(x,[a,b,c])=[x,a,b,c] pop_up([x,a,b,c])=x 次に枝を伸ばすべきノードの集合 各ノードはコストを属性としてもっており、 スタック中のノードはコストの昇順に並べられてる。 past_list L=[a,b,c] append(x,[a,b,c])=[x,a,b,c] car([x,a,b,c])=x, cdr([x,a,b,c])=[a,b,c], tail([a,b,c])=c, x∈L 過去に通ったノードの集合で、最小コストを記録する 同じノードになったとき、 展開する価値があるかどうか判断する g(n) nまでのコスト g(n,n') g(n)+(nからn'までのコスト) スタック 順序組(タプル) リスト ┃ a ┃ ┃ ┏┻┓ ┃ b ┃ ┏━╋━┓ a┏┻┓ ┃ c ┃ ┃ ┃ ┃ b┏┻┓ ┗━━━┛ a b c c [] cost_mini_search(init,goal)=>cost: stack:=[]; past_list:=[]; stack:=push_down(init,stack); g(init):=0; loop: if stack=[] then goto fail; n:=pop_up(stack); stack:=cdr(stack); if n=goal then goto success; past_list:=append(n,past_list); for all ni:=next(n); g(n,ni):=g(n)+cost(n,ni); if ¬(ni∈past_list) then do; stack:=push_down(ni,stack); g(ni):=g(n,ni); od; else do; if g(n,ni)<g(ni) then g(ni):=g(n,ni); od; sort stack increasingly by g(n). goto loop; success: cost:=g(n);
0 1 2 3 4 5 6 ┏━━━━━━━━━┳━┳━┓ 0 ┃ ┃ ┃ ┏━━━━━━━┛ ┃ ┃ 1┃ ┃ ┃ ┃ ┃ ┃ ━━┓ ━━━━┫ ┃ 2┃ ┃ ┃ ┃ ┃ ┃ ┗━━ ┃ ━━┳━┫ ┃ 3┃ ┃ ┃ ┃ ┃ ┃ ┏━━━┛ ┃ ┃ ┃ ┃ 4┃ ┃ ┃ ┃ ┗━┻━━━━━┻━━━━━┛ 初期状態 (0,0) ⇒ 目標 (6,0) 予測コストの評価関数 h(x,y)=|x-6|+|y-0|=y-x+6 この関数は妥当か? 初期状態 (0,0)⇒副目標 (6,4)⇒目標 (6,0) 初期状態 (0,0)⇒副目標 (3,3)⇒副目標 (6,4)⇒目標 (6,0)
【初期状態】 【目標状態】 ┏━┳━┳━┓ ┏━┳━┳━┓ ┃1┃5┃2┃ ┃1┃2┃3┃ ┣━╋━╋━┫ ┣━╋━╋━┫ ┃4┃ ┃3┃ ┃4┃5┃6┃ ┣━╋━╋━┫ ┣━╋━╋━┫ ┃7┃8┃6┃ ┃7┃8┃ ┃ ┗━┻━┻━┛ ┗━┻━┻━┛ 【問題表現】[x1,x2,x3,x4,x5,x6,x7,x8,x9] 【操作】 [S,x2,x3,x4,x5,x6,x7,x8,x9]→[x2,S,x3,x4,x5,x6,x7,x8,x9] →[x4,x2,x3,S,x5,x6,x7,x8,x9] [x1,S,x3,x4,x5,x6,x7,x8,x9]→[S,x1,x3,x4,x5,x6,x7,x8,x9] →[x1,x3,S,x4,x5,x6,x7,x8,x9] →[x1,x5,x3,x4,S,x6,x7,x8,x9] [x1,x2,x3,x4,S,x6,x7,x8,x9]→[x1,S,x3,x4,x2,x6,x7,x8,x9] →[x1,x2,x3,S,x4,x6,x7,x8,x9] →[x1,x2,x3,x4,x6,S,x7,x8,x9] →[x1,x2,x3,x8,x6,x6,x7,S,x9]
x1 x2 x3 x4 x5 x6 x7 x8 x9
評価値が不適切な例 ┏━┳━┳━┓ ┃ ┃2┃3┃ ┣━╋━╋━┫ ┃4┃5┃6┃ ┣━╋━╋━┫ ┃7┃8┃1┃ ┗━┻━┻━┛
|
山登り法:
| |||||||
最良優先探索:選択されなかった節点を残し、一番良い節点を選択する | ||||||||
|
f'(p)=g'(p)+h'(p)A アルゴリズムは目標までの経路を探索することは保証されているが、 それが最適解である保証はない。
h'=8 h'=7 初期 初期 g=3┏━━┻━━┓g=5 g=3┏━━┻━━┓g=5 ┃ ┃ ┃ ┃ h'=4 A B h'=5 h'=5 A B h'=2 ┃ ┃ ┃ ┃ g=6┗━━┳━━┛g=3 g=6┗━━┳━━┛g=3 目標 目標 AとBのどちらを経由すべきか?各地点における推定評価値 h'(p) と評価値 h(p) の間に