【问题标题】:Heuristic algorithms in prologprolog 中的启发式算法
【发布时间】:2011-01-05 00:14:31
【问题描述】:

我对 Prolog 不是很有经验,我正在尝试解决一个关于使用启发式算法(例如 A* 或 BFS 或爬山)来找到给定问题的解决方案的练习。

由于我不熟悉这种编程并且在 google 中的搜索并没有真正帮助我,我想知道是否有人可以给我一个链接到一个类似的已经解决的例子,看看这是如何完成的。 我不是要复制任何东西,只是我确实研究了很多关于序言命令等的知识,而且我确实知道这些算法在理论上是如何工作的以及它们如何解决问题(例如,在我的练习中,我认为 BFS 或 A* 会是个好选择)但我不明白我应该如何在 prolog 中编写一个实际使用算法并给出解决方案的程序。

只是澄清一下,我真的相信真正的序言代码示例将非常有用,而不是对算法如何工作的理论解释。我知道应该如何解决问题,使其发生,特别是在序言中我不明白的..

提前谢谢..

【问题讨论】:

    标签: prolog


    【解决方案1】:

    奇怪的是,我最近在 Prolog 中实现了 BFS。我没有在任何地方发布代码并且我很犹豫是否这样做,因为它是对可能被重用的分配的重新实现。

    我可以给你实际的 BFS 定义:

    % performs a BFS, with the given goal and queue
    bfs( Goal, [[Goal|[Path]]|_], Path ).
    bfs( Goal, [State|Rest], Result ) :-
        successors_list( State, Successors ),
        remove_seen( Successors, NewStates ),
        add_to_seen( NewStates ),
        append( Rest, NewStates, Queue ),
        bfs( Goal, Queue, Result ).
    

    对于这个问题,“目标”是一个特定的数字,“路径”是实现该目标所需的操作序列。第二个参数是队列,其中每个状态都表示为两个元素的列表(第一个是当前数字,第二个是生成该数字所需的路径)。它返回在“路径”中获取给定数字所需的路径。使用断言将看到的状态集记录在数据库本身中。

    在这个定义之外,一切都是特定的问题。

    编辑: 我应该说大多数事情都是针对特定问题的。我重新审视了我的代码,做了一些小的修改,并改变了它解决的问题。它与我觉得很舒服发布它的作业有很大不同,所以这里是:BFS in Prolog(AI)

    【讨论】:

    • 谢谢回答..非常有帮助!
    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2011-08-09
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多