2013-08-03 2 views
0

두 마을 간의 최단 경로를 찾기 위해 만든 방법에 대한 코드입니다. 문제는 if 문의 조건이 if(alt < villageCost[v])이 결코 발생하지 않기 때문에 while 루프가 끝나지 않는다는 것입니다. 이유를 알아내는 데 도움주세요!루프에서 걸리는 최단 경로 (Dijkstra)를 찾는 방법 구현

public ArrayList<Village> shortestPath(Village s, Village d){ 
    int[] villageCosts= new int[villages.size()]; 
    boolean[] wasVisited= new boolean[villages.size()]; 
    shortestPath = new ArrayList<Village>(); 
    int counter= wasVisited.length; 

    for(int i=0; i<villageCosts.length; i++){ //initialize to infinity 
     villageCosts[i]= Integer.MAX_VALUE; 
    } 

    villageCosts[s.getVillageName()] = 0; 
    System.out.println("This is the counter before the while loop: " +counter); 
    while(counter > 0){ 
      int mincost = Integer.MAX_VALUE; 
      int minindex= 0; 

     //if the minimum cost in villageCosts i still infinity 
     for(int i=0; i<villageCosts.length && wasVisited[i]==false; i++){ 
      if (mincost < villageCosts[i]){ 
       mincost = villageCosts[i]; 
       minindex= i; 
       wasVisited[i]= true; 
       counter--; 
       } 
      shortestPath.add(villages.get(i)); 
      } 

     if minimum cost in villegeCost is still infinity 
     if(villageCosts[minindex] == Integer.MAX_VALUE){ 
      System.out.println("No path exists."); 
      return null; 
      } 

    ArrayList<Road> connectingToMinIndex= villages.get(minindex).getConnectingRoads(); 
for(int i=0; i< connectingToMinIndex.size(); i++){ //roads connecting min index village 
for(int j=0; j < villages.get(minindex).getConnectingRoads().size(); j++){ 
for (int k = 0; k < villages.get(i).adjVillages.size(); k++){ 
     int v= villages.get(i).adjVillages.get(k).getVillageName(); 
     int alt= villageCosts[minindex] + villageCosts[i]; 
      if (alt < villageCosts[v]){ 
       villageCosts[v] = alt; 
       wasVisited[v]= true; 
       counter--; 
      } shortestPath.add(villages.get(alt)); 
        } 
       } 
      } 
     } //ends while loop 
     return shortestPath; 
    } 
+1

아. 그러면 가장 긴 경로 알고리즘이어야합니다. –

+0

코드에 따르면's.getVillageName()'은 int를 반환합니까? 사실입니까? 오해의 소지가 있습니다. – supersam654

+1

게시 된 코드에 따르면 소스 및 그래프 인수에는 차이가 없습니다. 두 가지 주장은 모두 동일하며 (마을) 마을이 없습니다. 또한 villageCosts [s.getVillageName()] = 0; 소스 이름을 사용하여 비용을 0으로 설정해야합니다. –

답변

0

디버깅하려면 while 루프 반복 횟수 제한을 설정하십시오. 그런 다음 필요에 따라 while 루프 내에서 System.out.print를 사용하여 각 반복마다 각 변수의 값을 인쇄하십시오. 설정된 반복 양이 완료되면 화면에 인쇄 된 결과를 검사하십시오. 이것이 루프를 디버깅하는 가장 좋은 방법입니다. 당신이 Integer.MAX_VALUEvillageCosts 모든 항목을 초기화하기 때문에 (다음 0 현재 변경)

if (mincost < villageCosts[i]){ 

당신은 유사 mincost를 초기화 :

1

이것은 사실이 없을 것

int mincost = Integer.MAX_VALUE;