【问题标题】:Graph Tour with Uniform Cost Search in JavaJava 中统一成本搜索的图导览
【发布时间】: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


【解决方案1】:

两个cmets:

1) 当您设置一个顶点的 costToThis 时,您会覆盖现有值,这会影响队列中的所有路径,因为该顶点由许多路径共享。我不会将 costToThis 存储为 Vertex 的一部分。相反,我会定义一个 Path 类,其中包含路径的总成本以及组成它的节点列表。

2) 我不确定我是否正确理解了您对目标状态的问题。但是,我将部分路径添加到队列的方式如下:如果路径的长度

我希望这会有所帮助...

【讨论】:

  • 1) 是的,当我的有序列表正确时,我发现了这个错误,但 costToThis 值显然是错误的,因为它们被覆盖了。 Path 类的想法是我有的,但还没有实现,虽然它显然很有意义,所以谢谢。 2)我忘了提到以前走过的任何路径都可以再次旅行。在我提供的情况下,这对任何路径都没有好处,但这是使用示例数据,可能并不总是如此。我的搜索需要至少遍历所有节点一次,然后回到起始节点。
  • 我解决了这个问题。实现了一个路径类,并使用我的优先级队列对路径进行排序,同时添加每个新顶点并将边缘成本关联到它。使用队列进行统一成本搜索,然后在访问完所有节点 >= 1 且当前节点 == 起始节点后返回目标。再次感谢您的帮助!
猜你喜欢
  • 2015-10-08
  • 2017-09-07
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
相关资源
最近更新 更多