【发布时间】:2010-04-24 08:02:10
【问题描述】:
我是这个网站的新手,所以希望你们不介意帮助一个小块。
无论如何,我被要求编写代码来查找特定图表上的图表游览的最短成本,该图表的详细信息是从文件中读取的。图表如下:
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 对象中是否已访问过其他顶点。
非常感谢您的帮助! 乔什
编辑:我应该提到以前访问过的路径可能会再次访问。在我提供的情况下,这没有好处,但可能存在访问先前访问过的节点以到达另一个节点的情况会导致更短的路径(我认为)。所以我不能只根据已经访问过的节点来做(这也是我的第一个想法)
【问题讨论】:
-
"...我被要求编写代码..." - 是谁?可能是老师?如果是这样,请将您的问题标记为“作业”...
-
啊,是的,对不起,这是作业。我的错。我希望这是在规则之内。我应该清楚,我不是要求完全编写的代码(我不想在教育中欺骗自己!),只是解释(最好使用标准库)我如何以正确的方式执行搜索。
-
编辑:我应该提到以前访问过的路径可能会再次访问。在我提供的情况下,这没有好处,但可能存在访问先前访问过的节点以到达另一个节点的情况会导致更短的路径(我认为)。所以我不能只根据已经访问过的节点来做(这也是我的第一个想法)
标签: java search graph artificial-intelligence