我有一个图和一个启发式表,其中包含列表连接和节点值以及成本(启发式表)。
它们在序言中的表示如下。
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和网络上进行搜索(找到关于贪婪搜索工作原理的注意事项),但是没有什么可以解释使用序言代码实际工作的方式。它说明了如何在java
,C++
等中执行此操作,但我没有使用这些语言。
有人能把我朝正确的方向吗?我在某处读到可以使用findall?但是,如何将启发式值组合到节点(例如,节点“ B”,其成本为2,从A到B),我是否用启发式值/成本3替代成本2,请在更多内容中进行解释。详细介绍我或将我定向到另一种对现在有利的资源?
我也许可以创建一个谓词来帮助在每次迭代中找到下一个节点(当然使用启发式值)?
请记住,我是Prolog的初学者,正在尝试各种方法,但努力将它们拼凑在一起。
更新:这是我在link中搜索到的大部分信息
答案 0 :(得分:1)
我认为您需要知道什么是启发式值以及如何在搜索算法中使用它。
我的回答:
n
是我们要到达的节点
s
是源节点
h()
是启发式函数。 h(n)
是可接受的(?)
价值,我更愿意将其视为达到n
的估算费用
来自来源s
。我们仅在不安全的情况下将其称为启发式商品
高估了成本。
w(a,b)
是从a
到b
g()
是一项提供实际成本从n
到达节点s
的功能
通过总结w(a,b)
,其中a
和b
都是从
n
至s
。
现在要回答您的问题,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
是在序言中用于实施这两次搜索的正确方法。