我是这个网站的新手,所以希望你们不介意帮忙。
无论如何,我被要求编写代码来查找特定图表上图表浏览的最短成本,其详细信息从文件中读取。图表如下所示:
http://img339.imageshack.us/img339/8907/graphr.jpg
这是一个人工智能课程,所以我应该使用足够好的搜索方法(允许使用暴力,但不能用于满分)。
我一直在阅读,我认为我正在寻找的是一个具有恒定启发价值的A *搜索,我相信这是一个统一的成本搜索。我无法解决如何在Java中应用它的问题。
基本上,这就是我所拥有的:
顶点类 -
ArrayList<Edge> adjacencies;
String name;
int costToThis;
边缘类 -
final Vertex target;
public final int weight;
现在,我正在努力研究如何将统一成本概念应用到我想要的目标路径。基本上我必须从特定节点开始,访问所有其他节点,并以相同的最低成本在同一节点上结束。
据我了解,我可以使用PriorityQueue来存储我所有的旅行路径,但是我无法理解如何将目标状态显示为访问所有其他节点的起始节点。
到目前为止,这是我所拥有的,这是非常不合适的:
public static void visitNode(Vertex vertex) {
ArrayList<Edge> firstEdges = vertex.getAdjacencies();
for(Edge e : firstEdges) {
e.target.costToThis = e.weight + vertex.costToThis;
queue.add(e.target);
}
Vertex next = queue.remove();
visitNode(next);
}
最初,它接受起始节点,然后递归访问PriorityQueue中的第一个节点(具有下一个最低成本的路径)。
我的问题基本上是,如果该路径处于目标状态,如何阻止我的程序遵循队列中指定的路径?队列当前存储了Vertex对象,但在我看来这不会起作用,因为我无法存储是否在Vertex对象中访问过其他顶点。
非常感谢帮助! 约什
编辑:我应该提一下之前访问过的路径可能会再次访问。在我提供的情况下,这不是有益的,但是可能存在这样的情况:访问先前访问过的节点以到达另一个节点将导致更短的路径(我认为)。所以我不能只根据已经访问过的节点来做这件事(这也是我第一次想到的)
答案 0 :(得分:1)
两条评论:
1)当您设置顶点的costToThis时,会覆盖现有值,这会影响队列中的所有路径,因为顶点由许多路径共享。我不会将costToThis存储为Vertex的一部分。相反,我会定义一个Path类,它包含路径的总成本加上组成它的节点列表。
2)我不确定我是否正确理解了目标状态的问题。但是,我将部分路径添加到队列的方式如下:如果路径长度 我希望这会有所帮助......