2013-01-13 2 views
5

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

Func<SEquatableEdge<VectorD3>, double> cityDistances = delegate(SEquatableEdge<VectorD3> edge) 
{ 

    if(edge.IsPassableBy(agent)) 
     return edgeWeight; // Edge is passable, return its weight 
    else 
     return -1; // Edge is impassable, return -1, which means, that path finder should skip it 

}; 

Func<VectorD3, double> heuristic = ...; 

TryFunc<VectorD3, IEnumerable<SEquatableEdge<VectorD3>>> tryGetPath = graph2.ShortestPathsAStar(cityDistances, heuristic, sourceCity); 

मैं ग्राफ की एक प्रति बनाने और अगम्य किनारों को हटाकर इस समस्या को हल करने की कल्पना कर सकते हैं, लेकिन यह कंप्यूटर के संसाधनों की अनावश्यक बर्बादी है। क्या कोई, कृपया मुझे इस समस्या को हल करने के तरीके पर संकेत दे सकता है? या कोई समाधान नहीं है और मुझे स्रोत अपडेट करना चाहिए?

+6

एक त्वरित हैक अगम्य किनारों एक वजन असली कम से कम पथ का कुल वजन से भी बड़ा है कि बनाने के लिए किया जाएगा। ए * एल्गोरिथ्म हमेशा प्राथमिकता कतार के अंत करने के लिए अपने "ऊबड़" किनारों युक्त रास्तों पर आ जाएगा और वास्तविक कम से कम पथ मिल जाएगा। इस दृष्टिकोण का नुकसान यह है कि * यदि लक्ष्य के लिए हर पथ को पार करता एक "ऊबड़" बढ़त तो काट दिया एल्गोरिथ्म बल्कि सही बात कर रहे हैं और नाकाम रहने * से, एक पथ का चयन करेंगे है। –

+2

@EricLippert उस वर्कअराउंड के चारों ओर एक कामकाज यह हो सकता है कि आप परिणामस्वरूप पथ की लंबाई देखेंगे, और यदि यह आपके "अपरिवर्तनीय" किनारे के वजन से अधिक है, तो आप उम्मीद करेंगे कि यह पथ खोजने में विफल रहेगा। – Luaan

+0

आप एक कस्टम विधि दूरी पुनर्प्राप्ति विधि निर्दिष्ट करना चाहते हैं, जैसे 'DelegateIncidenceGraph' आपको क्या चाहिए करने के लिए मतलब बातें नहीं कर रहे हैं? – Superbest

उत्तर

0

आपके वजन को double प्रकार के दिए गए हैं, तो आप एक अप्रत्याशित किनारे के वजन के लिए double.PositiveInfinity का उपयोग करने में सक्षम होना चाहिए।

जैसे एरिक लिपर्ट कहते हैं, उच्च वजन का विफलता मामला एक पूर्ण पथ है, हालांकि double.PositiveInfinity से कोई अतिरिक्त या घटाव अभी भी अनंत होना चाहिए। double प्रकार का परीक्षण करने के लिए एक IsPositiveInfinity विधि है।

तो, अनंत को अगम्य वजन सेट करके देखें और अंतिम पथ की लंबाई का परीक्षण करें।

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