繁体   English   中英

扭曲遍历无向,无权图:对每个节点的最少访问

[英]Traversing an undirected, unweighted graph with a twist: minimum visits to each node

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

*问题的症结在于有效这个词和我的意思。 让我将您的注意力转向这张小图:

图形

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

您是否只想遍历整个图形(与路径无关),并对每个节点进行一些操作,还是要计算从一个节点到任何其他节点的最短路径? (我可能不明白您的目标。)

在第一种情况下,请坚持使用广度优先搜索之类的遍历算法。 另一方面,您可能希望通过使用相同加权的边(即= 1)来考虑Dijkstra

当您仅对一个起始节点感兴趣并且所有边的权重相同时,您可以将BFS视为Dijkstra的特例。 对于不同的成本,您可以使用统一成本搜索。

不仅仅是带有collect参数的简单递归吗?

public void traverse(Node n, Set<Node> visisted) {

  visited.add(n);

  for (Node neighbour : n.getNeighbours()) {

    if (!visited.contains(neighbour)) {
      traverse(neighbour, visited);
    }

  }

}

一个有趣的问题...但是仍然不清楚从到目前为止的响应中最初的问题/目标是什么。

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

  • 指定了起始节点
  • 访问每个节点的成本为“ 1”
  • 目标:访问每个节点
  • 目标:计划一条将成本降至最低的路线
  • 约束:未指定最终节点(可以是任何节点)
  • 该算法在产生任何成本之前就完全了解该图(搜索所有可能的路径本身不会产生任何成本)

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

  • 如果“访问节点”的成本为“ 1”,则与“遍历任何边缘的成本”为“ 1” ......因为“访问节点”之间存在一对一的对应关系”和“穿越边缘”。 (您不能输入节点,除非遍历它的边缘。)
  • 如果没有直接连接两个节点,则它们仍然是“传递连接”的,因为您可以简单地遍历中间节点。 (或者:您似乎没有约束条件“您可能不会重新访问节点”。)

因此:所有节点都通过某个“距离”“连接”,并且您想访问所有节点,同时将经过的“距离”最小化。

那是对的吗?

如果是这样,我认为您的问题几乎就是经典的“旅行推销员问题”。 我看到的唯一区别是,有时TSP的语句要求“开始节点和结束节点相同”。 但是-我认为-您允许起始节点和结束节点不同。

如果这听起来正确,而您实际上只是在试图以一种有效的方式“解决” TSP,那么请尝试做同一件事的众多人士加入您的行列! 除了简单地“尝试所有组合,对每个分数评分并获得最低分数”,没有比这更好的解决方案了。

这是遍历图的所有节点并计算遍历的最小成本,希望对您有帮助

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;
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM