簡體   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