0

私がやりたいのは、いくつかのgivinfacsのあるルートを見つけることです。私はいくつかの調査を行いましたが、基本的なステップと再帰的なステップを追加する必要があることをすでに知っています。実装しましたが、転送する必要がある場合は機能しません。したがって、それが隣人である場合、それは機能しますが、そうでない場合は機能しません。

これは私が持っているものです:

p(zwolle,apeldoor,36).
p(apeldoorn,zutphen,22).
p(hengelo,zwolle,60).
p(zutphen,hengelo,45).
p(arnhem,apeldoorn,30).
p(arnhem,zutphen,24). 


%basic step
route(Begin,End,PastCitys):-
       not(member(End,PastCitys)),
   p(Begin,End,_).

%recursief
route(Begin,End,PastCitys):-
  p(Begin,Stepover,_),
      not(member(Stepover,PastCitys)),
  route(Stepover,End).

plan(Begin,End):-
   route(Begin,End,[Begin]).

どんな助けでも大歓迎です

4

2 に答える 2

0

Floyd-Warshallアルゴリズムを調べる必要があると思います。Prologでコーディングするだけです。再帰と訪問されたノードのリストを使用する方法は、まったく最適ではありません(Richard O'Keefe、「The Craft of Prolog」、第5.4章を参照)。しかし、通常、ウォーシャルアルゴリズムはグラフ操作ライブラリにすでに存在しているため、その使用方法を研究する必要があります。

于 2012-05-15T22:42:17.693 に答える
0

複雑さの昇順で 3 つのヒントを次に示します。

  1. 'apeldoorn' のスペルを 1 回間違えたので、それが原因で、明らかなテストroute(zwolle,apeldoorn)が機能しません。
  2. 隣接関係が対称的であるという事実を表現する必要があります。これにより、その事実がどちらの方法で表現されていても、A から B へのルートを見つけることができます。
  3. ルートが存在する場合でも、ルートを見つける前に、不運な入力で無限ループに入る可能性があります。そのためには、再帰的なステップを実行するときにサイクルに入らないようにする「発生チェック」が必要です。
于 2012-05-15T13:17:18.310 に答える