如何实现贪心搜索算法

时间:2015-01-07 16:50:48

标签: java c# algorithm search greedy

我的人工智能课程中有一个项目。我需要为我的程序实现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#的技能。如果有人可以给我一些想法,或者帮助我提供任何类似的例子或教程。任何形式的帮助将不胜感激。很抱歉这么多的写作。提前谢谢:)))

1 个答案:

答案 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,这是您的解决方案。

我希望这对你的项目有用。