Prolog中的A *寻路算法

时间:2019-05-03 12:24:32

标签: algorithm prolog path-finding

一个2d网格世界充满了障碍物,并为导航20X20网格空间的船舶提供了“充电站”。船上航行的燃料数量有限,没有充电站就可以航行。

期望的解决方案是对当前实现的重大改进,或者是首选的A *搜索算法的交换。您应该能够在随机生成的网格世界中导航。

我是Prolog的新手,我正在寻找一个大概的方法,以了解如何在Prolog中实现寻路A *算法

solve_task_bt(Task,Current,Depth,RPath,[cost(Cost),depth(Depth)],NewPos) :-
  achieved(Task,Current,RPath,Cost,NewPos).
solve_task_bt(Task,Current,D,RR,Cost,NewPos) :-
  Current = [c(F,P)|RPath],
  search(P,P1,R,C),
  \+ memberchk(R,RPath),  % check we have not been here already
  D1 is D+1,
  F1 is F+C,
  solve_task_bt(Task,[c(F1,P1),R|RPath],D1,RR,Cost,NewPos).  % backtrack search

achieved(go(Exit),Current,RPath,Cost,NewPos) :-
  Current = [c(Cost,NewPos)|RPath],
  ( Exit=none -> true
  ; otherwise -> RPath = [Exit|_]
  ).
achieved(find(O),Current,RPath,Cost,NewPos) :-
  Current = [c(Cost,NewPos)|RPath],
  ( O=none    -> true
  ; otherwise -> RPath = [Last|_],map_adjacent(Last,_,O)
  ).

search(F,N,N,1) :-
  map_adjacent(F,N,empty).

0 个答案:

没有答案