使用启发式值在序言中进行贪婪搜索

时间:2018-08-27 19:58:18

标签: prolog graph-algorithm

我有一个图和一个启发式表,其中包含列表连接和节点值以及成本(启发式表)。

图: Graphical representation

启发式表格: The cost of visiting node

它们在序言中的表示如下。

s(a,b,2).
s(a,c,1).
s(b,e,4).
s(b,g,2).
s(c,d,1).
s(c,x,3).
s(x,g,1).

h(a,9)
h(b,3)
h(c,2)
h(d,8)
h(e,4)
h(g,0)
h(x,2)

我的查询,如何使用启发式值h(a,9)进行贪婪搜索以在每次迭代中找到下一个节点。

我知道如何使用DFS获得尽可能短的路径并使用列表存储该路径。我不知道如何在贪婪搜索中考虑每个节点的启发式值,以解决这个问题-我知道它会扩展最低的h值节点,以找到它的下一个邻居。

DFS:

depthfirstsearch(GoalN,Path,[GoalN|Path]) :- goal(GoalN).

depthfirstsearch(Node,Path,Solution) :- s(Node,NextNode,_), \+member(NextNode,Path), 
depthfirstsearch(NextNode,[Node|Path],Solution) 

我已经在SO和网络上进行搜索(找到关于贪婪搜索工作原理的注意事项),但是没有什么可以解释使用序言代码实际工作的方式。它说明了如何在javaC++等中执行此操作,但我没有使用这些语言。

有人能把我朝正确的方向吗?我在某处读到可以使用findall?但是,如何将启发式值组合到节点(例如,节点“ B”,其成本为2,从A到B),我是否用启发式值/成本3替代成本2,请在更多内容中进行解释。详细介绍我或将我定向到另一种对现在有利的资源?

我也许可以创建一个谓词来帮助在每次迭代中找到下一个节点(当然使用启发式值)?

请记住,我是Prolog的初学者,正在尝试各种方法,但努力将它们拼凑在一起。

更新:这是我在link中搜索到的大部分信息

1 个答案:

答案 0 :(得分:1)

我认为您需要知道什么是启发式值以及如何在搜索算法中使用它。

我的回答:

  • n是我们要到达的节点

  • s是源节点

  • h()是启发式函数。 h(n)是可接受的(?) 价值,我更愿意将其视为达到n估算费用 来自来源s。我们仅在不安全的情况下将其称为启发式商品 高估了成本。

  • w(a,b)是从ab

  • 的实际成本
  • g()是一项提供实际成本n到达节点s的功能 通过总结w(a,b),其中ab都是从 ns

现在要回答您的问题,AFAIK您可以通过两种方式使用此启发式方法:

  • 正如您所说,您可以懒惰地忽略w(a,b)值并使用 h(b)个值对后继节点进行排序(其中b是任何后继节点 节点)-这称为最佳优先搜索算法

  • 另一种方法是根据值h(b) + g(b)(其中b是任何后继节点)对后继节点进行排序-这称为 A * 搜索算法。

推荐读物:

  • Stuart J Russell和Peter Norvig,“人工智能-一种现代方法,第三版”

  • Ivan Brakto,“人工智能的序言编程”,培生教育,2011年8月。

P.S。 findall是在序言中用于实施这两次搜索的正确方法。