Prolog でゴール検索エージェントを作成しています。という名前の述語が 2 つありsearch
ます。問題のある場所Type == explore
と他の場所にありType == climb
ます。
使用される深さは定数 = 10 であることに注意してください。プログラムはすべてのテスト ケースに対して正しいパスを提供していましたが、最短ではなかったので、ここからを使用するというアイデアを得ましたlength(Actions,_)
。
最初のsearch
述語にはうまく機能しますが、後者の検索述語を満たすために同様のものを追加しようとするとType == climb
、無限ループに陥り、時間がかかりすぎます。これは私がそのために持っていたものです:
search(Problem,Actions):-
Problem = [Goal-A-X,Y-Depth],
Goal = [Type,_,_],
Type == climb,
length(List,_),
depthfirst([A-X,Y],List,Depth),!,concat(List,[climb],Actions).
なぜこうなった?
完全なコードは次のとおりです。
search(Problem,Actions):-
Problem = [Goal-A-X,Y-Depth],
Goal = [Type,_,_],
Type == explore,
length(Actions,_),
depthfirst([A-X,Y],Actions,Depth),!.
search(Problem,Actions):-
Problem = [Goal-A-X,Y-Depth],
Goal = [Type,_,_],
Type == climb,
depthfirst([A-X,Y],List,Depth),concat(List,[climb],Actions).
depthfirst([A-X,Y],[],_):-
goal([_,Gx,Gy]),
Gx == X,
Gy == Y.
depthfirst([A-X,Y],[Action|Sol],Maxdepth):-
Maxdepth > 0,
s([A-X,Y],[A1-X1,Y1],Action),
Max1 is Maxdepth - 1,
depthfirst([A1-X1,Y1],Sol,Max1).
編集:
わかりました、指定されている「深さ」に関連していることがわかりました。MaxDepth
から制約を削除しましたdepthfirst
が、現在は機能しています。ただし、元の深さ優先は指定された深さで解決策を見つけていましたが、なぜ反復深化を使用してそれを行うことができないのですか?私が指定した方法で行ったのですか?