2014-02-27 6 views
4

이 알고리즘이 있으며 재귀 적 역 추적을 사용하여 그래프 검색을 구현하려고합니다. 내 모든 코드의트리 구조의 재귀 역 추적

첫째 : 코드 그게 전부

public static boolean buildTree(GenericTreeNode<String> inputNode){ 

    while(!interruptFlag) 
    { 
     try { Thread.sleep(200); } catch(InterruptedException e) {} 

     gui.frame.MainWindow.progress.setText("Iterations Deployment: " + c); 
     gui.panel.ResultMatrix.setResult(mappingList); 
     Multimap<String,String> openList = LinkedHashMultimap.create(); 

     openList = UtilityClasses.getOpenList.getOpenList(dataMap, ApplicationList, HardwareList, mappingList); 

    if(openList.isEmpty() && !mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI)) 
      { 
       gui.frame.MainWindow.labelSuccess.setText("Mapping not succesful!"); 
       return false; 

      } 
    if(openList.isEmpty() && mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI)) 
      { 
       System.out.println(calculateOverallCost.getOverallCosts()); 
       System.out.println("Mapping done:" + " " + mappingList); 
       gui.panel.ResultMatrix.setResult(mappingList); 

       return true; 
      } 

    if(!openList.isEmpty() && (!mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI))) 
     { 

      for(String s : openList.keySet()) 
      { 
       for(String h : openList.get(s)) 
       { 
       GenericTreeNode<String> child = new GenericTreeNode<String>(s + ":" + h); 
       inputNode.addChild(child); 
       child.setCosts(UtilityClasses.CostFunction.calculateCostFunction(s, h)); 
       } 
      } 
      List<GenericTreeNode<String>> childlist = inputNode.getChildren(); 
      Collections.sort(childlist); 

      for(int i = 0; i < childlist.size() ; i++) 
     {    
      inputNode = childlist.get(i); 
        // do something  
      if (buildTree(inputNode)) 
       { 
       return true; 
       } 
      else 
      { 
      // undo something 
      } 

     } 

는 지금까지 있습니다. 그것은 영원히 나무를 만듭니다. 나무의 모든 노드가 가능한 해결책이며, 경험적 비용 함수에 의해 정렬됩니다. 첫 번째 2 if-clause은 종료 및 반환 조건입니다. 해결책이 있다면 꽤 원활하게 찾을 수 있습니다. 그러나 빠른 해결책이 없으면 마지막 단계를 실행 취소하고 다른 조합을 시도해야합니다. 최악의 경우 모든 조합을 테스트해야합니다.

childlist은 모든 하위 노드를 비용 기능으로 정렬하여 유지합니다. 가장 적은 비용 기능을 가진 제품이 확장을 위해 선택됩니다. 트리를 만드는 것은 재귀 적으로 이루어 지지만 백 트랙킹에 문제가 있습니다. 나는 한 걸음 뒤로 가서 두 번째로 좋은 노드를 시도하는 등의 검색을받지 못한다. 그래프는 매 단계마다 확장되어 새로 계산 된 openList으로 계산됩니다. 부모 노드에 대한 참조를 저장했습니다 (도움이 될 수있는 경우).

openlist은 가능한 모든 다음 단계 -> 노드를 포함하는 목록입니다.

어쩌면이 그림이 내 문제를 더 잘 설명하는 데 도움이됩니다. enter image description here 어쩌면 내가 알고 싶었던 검색이 그 이상입니다. 그러나 해결책이 있는지 없는지 상관없이 지금까지 가지고있는 코드는 휴가가 끝날 때까지 붙어 있습니다. 나는 많은 다른 일을 시도했지만,이 되돌아 오는 추적은 작동하지 않는 것 같습니다. 제 종류의 문제 또는 적어도 그럴 수는 없습니다.

+0

이 코드는 문제를 해결하는 데 필요한 정보를 제공하지 않습니다. UtilityClasses.getOpenList.getOpenList (dataMap, ApplicationList, HardwareList, mappingList) mappingList 내에 저장된 내용을 설명하고 내용을 수정하는 코드를 제공하십시오. –

+0

언급 한 클래스는 한 단계에서 트리 노드를 포함하는 openList를 반환합니다. MappingList에는, 전개 용으로 선택된 모든 노드가 포함됩니다. 코드가 되돌아 오면 mappingList에서 노드를 제거해야합니다. – Alika87

+0

당신이 제공 한 코드에는 mappingList로부터 어떤 엘리먼트도 제거되지 않습니다. 또한 코드가 매우 복잡합니다. 더 읽기 쉽고 디버깅하기 쉽도록하려면 현재 하나의 함수로 결합 된 세 가지 다른 것들, 즉 트리 만들기, 트리 트래버스 및 GUI 상호 작용을 코드로 분리 해보십시오. 또한 정적 함수 호출이나 인스턴스 변수를 사용하지 마십시오. –

답변

2

정확하게 이해했다면, 이 필요합니다.

나는 몇 가지 세부 사항을 ommited, 그러나 나는 (내가 그것을 테스트하지 않은)이 코드는 당신을 도울 것입니다 생각 :

public static boolean buildTree(GenericTreeNode<String> inputNode) { 
    if (interruptFlag) { 
     // search was interrupted 
     // answer has not be found yet 
     return false; 
    } 

    boolean something = openList.isEmpty() && !mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI); 
    if (something) { 
     // ... Mapping not succesful! 
     // answer can't be found 
     return false; 

    } 

    boolean answerFound = openList.isEmpty() && (mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI)); 
    if (answerFound) { 
     // ... 
     return true; 
    } 

    // answer has not been found 
    // visit each children 
    // order children list by cost 
    // ... 
    List<GenericTreeNode<String>> childlist = // ... 
    Collections.sort(childlist); 

    for (int i = 0; i < childlist.size(); i++) { 
     inputNode = childlist.get(i); 
     // do something 
     boolean childHasAnswer = buildTree(inputNode); 
     if (childHasAnswer) { 
      // answer was found 
      return true; 
     } // else: our children do not have the answer 
    } 

    // neither we or our children have the answer, let's go to the parent 
    return false; 
} 

내가 주로 첫번째 동안을 삭제하고, 마지막으로 다른 삭제.

+0

옳은 대답이 100 % 아니었지만 올바른 해결책을 찾는데 좋은 힌트를주었습니다. 고맙습니다. – Alika87