遍历一个扭曲的无向,未加权的图形:每个节点的最小访问量

时间:2010-11-27 07:54:36

标签: java algorithm graph graph-theory

我正在尝试编写将遍历未定向的未加权图形的代码。本质上,该方法将被传递一个节点(它知道它的所有邻居)。然后,该方法必须通过从一个节点到另一个节点有效地构建图形模型,并收集节点相互链接的信息。最后,该方法将包含所有节点和连接它们的所有顶点的完整列表。

*问题的关键在于有效的词和我的意思。让我把注意力集中在这个小图上:

graph

假设我从节点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编写。

4 个答案:

答案 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)

一个有趣的问题......但仍然不清楚最初的答案中的原始问题/目标是什么。

这是问题的有效重新陈述吗?:

  • 指定了起始节点
  • 访问每个节点的成本为“1”
  • 目标:访问每个节点
  • 目标:规划最小化成本的路线
  • 约束:未指定最终节点(可能是任何节点)
  • 在产生任何费用之前,该算法完全了解图表(搜索每个可能的路径不会 - 本身 - 产生任何费用)

如果这是对您的问题的正确“解读”,请考虑以下观察结果:

  • 如果“访问节点”的成本是“1”,那与“遍历任何边缘的成本”相同是“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;
}
}