[英]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编写。
不仅仅是带有collect参数的简单递归吗?
public void traverse(Node n, Set<Node> visisted) {
visited.add(n);
for (Node neighbour : n.getNeighbours()) {
if (!visited.contains(neighbour)) {
traverse(neighbour, visited);
}
}
}
一个有趣的问题...但是仍然不清楚从到目前为止的响应中最初的问题/目标是什么。
这是问题的有效重述吗?:
如果那是您问题的正确“读物”,请考虑以下观察结果:
因此:所有节点都通过某个“距离”“连接”,并且您想访问所有节点,同时将经过的“距离”最小化。
那是对的吗?
如果是这样,我认为您的问题几乎就是经典的“旅行推销员问题”。 我看到的唯一区别是,有时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.