我正在尝试编写将遍历未定向的未加权图形的代码。本质上,该方法将被传递一个节点(它知道它的所有邻居)。然后,该方法必须通过从一个节点到另一个节点有效地构建图形模型,并收集节点相互链接的信息。最后,该方法将包含所有节点和连接它们的所有顶点的完整列表。
*问题的关键在于有效的词和我的意思。让我把注意力集中在这个小图上:
假设我从节点G开始。我可以访问C,B,F,D,H,J或E.我想最小化访问节点的次数,并且为了访问节点,我必须在去往该节点的路上通过所有节点。
示例:假设我决定访问节点C.下一个要访问的节点可以是A,B,F,D,H,J或E.但是,要访问除A之外的任何节点,我必须再次通过G,这被认为是低效的。并且为了访问A,我将不得不再次访问G和C然后通过C然后G返回到图的其余部分。所以我决定访问A.这意味着我必须再次通过C才能到达G.因此,从逻辑的角度来看,最后访问C分支是有意义的。
但是,程序从节点G开始时,并不知道分支C导致死胡同。在我写这篇文章的时候,我认为这可能是不可能的,但我还是会问它:无论如何都要尽可能有效地遍历这个图表(正如我之前所定义的那样)只使用给定的信息(即程序只知道关于它访问过的节点和从这些节点发出的边缘?或者我应该使用变量Dijkstra的算法来确保我访问每个节点?
如果重要的话,这将全部用Java编写。
答案 0 :(得分:3)
您是否只想遍历整个图形(无论采用何种路径),并在每个节点上执行某些操作,或者您是否要计算从一个节点到任何其他节点的最短路径? (我可能不理解你的目标。)
在第一种情况下,坚持使用遍历算法,例如Breadth First Search。另一方面,您可能需要使用相同加权边(即= 1)来考虑Dijkstra。
当您只对一个起始节点感兴趣并且所有边具有相同的权重时,您可以将BFS视为Dijkstra的特例。使用不同的成本,您可以使用统一成本搜索。
答案 1 :(得分:1)
不仅仅是一个带有collect-argument的简单递归吗?
public void traverse(Node n, Set<Node> visisted) {
visited.add(n);
for (Node neighbour : n.getNeighbours()) {
if (!visited.contains(neighbour)) {
traverse(neighbour, visited);
}
}
}
答案 2 :(得分:1)
一个有趣的问题......但仍然不清楚最初的答案中的原始问题/目标是什么。
这是问题的有效重新陈述吗?:
如果这是对您的问题的正确“解读”,请考虑以下观察结果:
因此:所有节点都通过一些“距离”“连接”,你想要访问所有节点,同时最小化“距离”。
这是对的吗?
如果是这样,我认为你的问题几乎就是经典的“旅行商问题”。我看到的唯一区别是,有时TSP的声明要求“起始节点和终端节点是相同的”。但是 - 我认为 - 你允许起始节点和终端节点不同。
如果这听起来是正确的 - 而你真的只是想以有效的方式“解决”TSP - 那么加入那些试图做同样事情的人群!可能没有更好的解决方案,只需“尝试所有组合,每个组合,并采取最小化”。
答案 3 :(得分:0)
这是遍历图的所有节点并计算遍历的最低成本希望它将有助于你
package capgemni;
/**
*
* @author amit
*/
public class Graphtraversing {
public static void main(String[] args) {
int res = 0;
String[] input1= {"A", "B", "C", "D"};
int[] input2 = {4, 8, 6, 3, 3, 5};
res = minimum_cost(input1, input2);
System.out.println(res);
}
static int minimum_cost(String[] input1,int[] input2)
{
int d = input1.length;
int costmatrix[][]=new int[input1.length][input1.length];
int i=0,j=0,k=0;
for(i=0;i<input1.length;i++){
for(j=i;j<input1.length;j++){
costmatrix[i][j]=0;
}
}
for(i=0;i<input1.length;i++){
for(j=i;j<input1.length;j++){
if(i==j){
costmatrix[i][j] = 0;
}
else{
costmatrix[i][j] = input2[k];
k++;
}
}
}
for(i=0;i<input1.length;i++){
for(j=0;j<input1.length;j++){
costmatrix[j][i] = costmatrix[i][j];
}
}
int cost = 0;
int mcost = 0;
int first = 1;
for(i=0; i<input1.length; i++){
for(j=0; j<input1.length; j++){
cost = cost + costmatrix[i][j];
}
if(first == 1 ){
mcost = cost;
first = 0;
}
else if(cost < mcost){
mcost = cost;
}
cost = 0;
}
return mcost;
}
}