0

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が、現在は機能しています。ただし、元の深さ優先は指定された深さで解決策を見つけていましたが、なぜ反復深化を使用してそれを行うことができないのですか?私が指定した方法で行ったのですか?

4

0 に答える 0