A *在Prolog中搜索

时间:2017-02-27 00:05:19

标签: search prolog

我尝试在prolog中实现15puzzle解算器,以尝试学习语言并利用本机回溯。我跟随了一些在线resources并编写了这个简单版本的A *算法。

所有这一切都是生成节点的所有子节点并将它们粘贴在队列BFS样式的末尾(最终我打算用优先级队列替换它以提高效率),并探索所有子节点,回溯解决方案的findall。

相关代码:

solve(State,Soln) :- f_function(State,0,F),
                 search([State#0#F#[]],[],S), reverse(S,Soln).

search([State#_#_#Soln|_], All, Soln) :-
   goal(State).
search([B|R], All, S) :-
   gen(B, R, Children),
   %insert_all(Children,R,Open),     %insertion sort option
   append(R, Children, Open),        %naive option
   append(All, Children, Allnew),
   search(Open, Allnew, S).

gen(State#D#_#A, R,C) :-
   findall(Child#D1#F1#[Move|A],
         (  mover(State, Child, Move),
            D1 is D + 1,
            f_function(Child, D1, F1),
            \+member(Child, R)
         ), C).

此代码找到了简单初始配置的解决方案,只需要几个动作即可到达解决方案,但对于更复杂的测试用例,它不会停止。

为了避免无限循环,我保留一个列表所有生成的状态(即使它们已经从队列中消失),并在添加它们之前检查我的新孩子与该列表。

如果有人能告诉我为什么不停止,我会非常感激!

0 个答案:

没有答案