2012-09-23 12 views
6

जावा में चौड़ाई पहली खोज को लागू करने के लिए मेरे पास स्कूल के उत्कृष्टता के रूप में है। मैं लगभग सब कुछ को लागू किया है लेकिन समस्या यह है कि मेरी खोज काम नहीं कर रहा है और मैं नहीं कर सकते मुझे सलाह और मुझे जहां अंतिम समस्या हो सकती है पर कुछ दिशा-निर्देश देने के लिए आप पूछ समस्या :(तो इम लगता है।ब्रेडथ फर्स्ट सर्च - जावा

public ArrayList<SearchNode> search(Problem p) { 
     // The frontier is a queue of expanded SearchNodes not processed yet 
     frontier = new NodeQueue(); 
     /// The explored set is a set of nodes that have been processed 
     explored = new HashSet<SearchNode>(); 
     // The start state is given 
     GridPos startState = (GridPos) p.getInitialState(); 
     // Initialize the frontier with the start state 
     frontier.addNodeToFront(new SearchNode(startState)); 

     // Path will be empty until we find the goal. 
     path = new ArrayList<SearchNode>(); 

     // The start NODE 

     SearchNode node = new SearchNode(startState); 

     // Check if startState = GoalState?? 
     if(p.isGoalState(startState)){ 
      path.add(new SearchNode(startState)); 
      return path; 
     } 


     do { 

      node = frontier.removeFirst(); 
      explored.add(node); 

      ArrayList reachable = new ArrayList<GridPos>(); 
      reachable = p.getReachableStatesFrom(node.getState()); 

      SearchNode child; 

      for(int i = 0; i< reachable.size(); i++){ 

       child = new SearchNode((GridPos)reachable.get(i)); 

       if(!(explored.contains(child) || frontier.contains(child))){ 
        if(p.isGoalState(child.getState())){ 
         path = child.getPathFromRoot() ; 
         return path; 
        } 
        frontier.addNodeToFront(child); 
       } 

      } 
     }while(!frontier.isEmpty()); 


     return path; 
    } 

आप

+1

यह कैसे काम नहीं कर रहा है? सटीक होना। – Borgleader

+0

ऐसा लगता है कि यह "गलत" नोड्स और पथ की खोज कर रहा है। – mrjasmin

+0

आपके पास बहुत सी विधियां हैं जिन्हें आप हमें नहीं दिखा रहे हैं। ऐसा लगता है कि आप दो अलग-अलग सरणी/सूचियों से नोड्स निकालने और पहुंचने योग्य नोड्स को केवल एक में डालने लगते हैं। आपकी हालत भी अजीब है, आपको क्लासिक कार्यान्वयन में केवल 'एक्सप्लोरर्ड' सूची की जांच करनी चाहिए। मूल विचार यह है कि: सूची की शुरुआत से पहले नोड निकालें, अपने सभी पड़ोसियों को एक ही सूची के अंत में जोड़ें। जब सूची खाली हो या जब आप उस सूची में गंतव्य नोड जोड़ते हैं तो रोकें। – IVlad

उत्तर

8
frontier.addNodeToFront(child); 

अपने कोड (getReachableStatesFrom(), आदि) के बाकी संभालने है सही, अपने कतार के सामने से तत्वों को जोड़ने गहराई पहले खोज के रूप में निष्पादित करने के लिए अपने कोड का कारण होगा धन्यवाद।

+0

हां, आप सही हैं। मेरे द्वारा बेवकूफ गलती इसे वापस नोड जोड़ने के लिए इसे बदलने के बाद, ऐसा लगता है कि यह "लगभग काम करता है": डी – mrjasmin

+2

@ user1285737 यदि आप किसी अन्य स्थान की पहचान कर सकते हैं जहां आपके कोड में कोई समस्या हो सकती है, तो एक और प्रश्न खोलने के लिए स्वतंत्र महसूस करें :) अगर आपको विश्वास है कि मैं मैंने इस सवाल का उचित जवाब दिया है, मेरा जवाब स्वीकार करना धन्यवाद देने का पसंदीदा तरीका है। सौभाग्य! –

0

के लिए चौड़ाई पहली खोज को लागू करना, आप शू उल एक कतार का उपयोग करें। यह प्रक्रिया बहुत जटिल हो सकती है। तो, इसे आसान रखना बेहतर है। आपको एक नोड के बच्चों को कतार में बाएं करना चाहिए (बाएं दाएं) और फिर नोड (प्रिंट डेटा) पर जाएं। फिर, आपको कतार से नोड को हटा देना चाहिए। कतार खाली होने तक आपको इस प्रक्रिया को जारी रखना चाहिए। आप यहां बीएफएस के कार्यान्वयन को देख सकते हैं: https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/TreeTraverse.java

संबंधित मुद्दे