[英]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.