Java中具有统一成本搜索的图巡更

Java中具有统一成本搜索的图巡更,java,search,graph,artificial-intelligence,Java,Search,Graph,Artificial Intelligence,我是这个网站的新手,所以希望你们不介意帮一个小家伙 不管怎样,我被要求编写代码,在一个特定的图形上查找一次图形浏览的最短成本,其详细信息从文件中读取。下图所示: 这是一门人工智能课程,所以我希望使用一种足够体面的搜索方法(蛮力是允许的,但不是满分) 我一直在读,我想我要找的是一个具有常数启发值的A*搜索,我相信这是一个统一成本搜索。我不知道如何在Java中应用它 基本上,我有: 顶点类- ArrayList<Edge> adjacencies; String name; int c

我是这个网站的新手,所以希望你们不介意帮一个小家伙

不管怎样,我被要求编写代码,在一个特定的图形上查找一次图形浏览的最短成本,其详细信息从文件中读取。下图所示:

这是一门人工智能课程,所以我希望使用一种足够体面的搜索方法(蛮力是允许的,但不是满分)

我一直在读,我想我要找的是一个具有常数启发值的A*搜索,我相信这是一个统一成本搜索。我不知道如何在Java中应用它

基本上,我有:

顶点类-

ArrayList<Edge> adjacencies;
String name;
int costToThis;
现在,我正在努力研究如何将统一成本的概念应用到我想要的目标路径中。基本上,我必须从一个特定的节点开始,访问所有其他节点,然后以最低的成本在同一个节点上结束

据我所知,我可以使用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);
   }
publicstaticvoidvisitnode(顶点){
ArrayList FirstEdge=vertex.GetAdjaces();
对于(边e:第一条边){
e、 target.costToThis=e.weight+vertex.costToThis;
queue.add(例如,target);
}
顶点下一步=队列。删除();
visitNode(下一个);
}
首先,这将获取起始节点,然后递归地访问PriorityQueue中的第一个节点(具有下一个最低成本的路径)

我的问题基本上是,如果队列中指定的路径处于目标状态,如何阻止程序跟随该路径?队列当前存储顶点对象,但在我看来这不起作用,因为我无法存储顶点对象中是否访问过其他顶点

非常感谢您的帮助! 乔希


编辑:我应该提到,以前访问过的路径可能会再次访问。在我提供的例子中,这是没有好处的,但是可能有一种情况,即访问以前访问过的节点以到达另一个节点会导致更短的路径(我认为)。因此,我不能仅仅基于已经访问的节点(这也是我的第一个想法)

两条评论:

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


2) 我不确定我是否正确理解了你的目标状态问题。但是,我将向队列添加部分路径的方法如下:如果路径的长度为“…我被要求编写代码…”-由谁编写?也许是老师?如果是的话,请把你的问题贴上“家庭作业”的标签……啊,是的,对不起,这是家庭作业。我的错。我希望这符合规定。我应该很清楚,我不是要求完整的代码(我不想欺骗自己脱离教育!),只是解释一下(最好使用标准库)如何以正确的方式执行搜索。编辑:我应该提到,以前访问过的路径可能会再次访问。在我提供的例子中,这是没有好处的,但是可能有一种情况,即访问以前访问过的节点以到达另一个节点会导致更短的路径(我认为)。所以我不能只根据已经访问的节点来做(这也是我的第一个想法)1)是的,当我的有序列表正确时,我以艰难的方式发现了这个错误,但是成本这个值显然是错误的,因为它们被覆盖了。Path类的想法是我提出的,但还没有实现,尽管它显然很有意义,所以谢谢。2) 我忘了提到以前走过的任何一条路都可以再走一次。在我提供的例子中,这对任何路径都没有好处,但这是使用示例数据,并且可能并不总是正确的。我的搜索需要至少遍历所有节点一次,然后返回到起始节点。我解决了这个问题。实现了一个路径类,并使用我的优先级队列对路径进行排序,同时添加每个新顶点并将边成本关联到它。使用队列进行统一成本搜索,然后在访问所有节点后返回目标>=1,当前节点==开始节点。再次感谢你的帮助!
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);
   }