我的人工智能课程中有一个项目。我需要为我的程序实现Greedy Search算法。我的项目描述是: 给出了两个名为“tree.txt”和“heuristic.txt”的文本文件。 “tree.txt”将定义搜索树,其中每一行将包含父子关系和它们之间的路径成本。每个数据将用空格分隔。
e.g。
A B 5
A C 3
B D 6
第一行中的第一个字符是Start节点(此处为A),目标节点为“G”。
“heuristic.txt”将定义启发式,h(n),值。每行将包含每个节点的启发式值。每个数据将用空格分隔。
e.g。
A 20
B 15
C 18
输出: 程序应该提供从起始节点到目标的解决方案路径和路径成本。
现在我的问题是我从理论上熟悉贪婪搜索,但实际上从未在编码中实现过。我真的不知道从哪里开始。我们可以用任何语言自由开发我们的程序。大多数情况下,我有Java和C#的技能。如果有人可以给我一些想法,或者帮助我提供任何类似的例子或教程。任何形式的帮助将不胜感激。很抱歉这么多的写作。提前谢谢:)))
答案 0 :(得分:0)
我建议使用python这个解决方案。 要在程序中实现图形,请使用简单的python字典。这是代码:
class Tree:
def _init_(self,dict,heuristic):
self.tree=tree
self.heuristic=heuristic
def getHeuristicValue(self,state)
value=self.heuristic.get(state)
return value
构造函数调用类似于:
g = Graph({'A':{'B':5,'C':3},'B':{'D':6}},{'A':20,'B':15,'C':18})
getHeuristic
python函数传递接受一个状态作为参数,并返回该状态的启发式值。
要了解python的字典类,我建议你阅读the tutorial
要使用python实现搜索算法,您应该实现这个简单的伪代码:
function Tree-Search(initialNode,goalNode) returns a solution,or failure
frontier.push(initialNode) with the value of the function heuristic(initialNode.state)+the path cost to reaxh this node
while(frontier)
node<-frontier.pop()
if node.state==GoalNode.state
return node
expand node, adding the resulting nodes to the frontier
return None
对于边界,您必须使用优先级队列,因为您必须使用较低值g(n)+h(n)
弹出节点(其中g(n)
是到达此节点的路径成本,h(n)
是启发式函数的值。)
要实现优先级队列,您应该使用标准库heapq
的堆节点是一个必须包含四个组件的数据结构:
node.state :节点对应的状态空间中的状态。
node.parent :搜索树中生成此节点的节点。
node.action :应用于父级以生成节点的操作。
node.pathCost :是g(n),从初始状态到节点的路径成本。
最后,为了扩展节点,你可以使用这个python函数:
def actions(self,state):
'''return a tuple that contain the state child of state '''
return tuple(self.tree.get(state))
我建议您查看问题this。
您可以简单地从算法输出返回的node.state
返回解决方案,而node.parent
不是null,这是您的解决方案。
我希望这对你的项目有用。