2017-02-14 11 views
11

में दो चरम सीमाओं के बीच पथ ढूंढना यह ज्यादातर तार्किक प्रश्न है, लेकिन संदर्भ Django में किया जाता है।Django ग्राफ़

हमारे डेटाबेस में हम वर्टेक्स और रेखा वर्ग है, ये एक (तंत्रिका) नेटवर्क बनाने, लेकिन यह अव्यवस्थित है और मैं इसे बदल नहीं सकते, यह एक विरासत डाटाबेस

class Vertex(models.Model) 
    code = models.AutoField(primary_key=True) 
    lines = models.ManyToManyField('Line', through='Vertex_Line') 

class Line(models.Model) 
    code = models.AutoField(primary_key=True) 

class Vertex_Line(models.Model) 
    line = models.ForeignKey(Line, on_delete=models.CASCADE) 
    vertex = models.ForeignKey(Vertex, on_delete=models.CASCADE) 

है अब, आवेदन में , उपयोगकर्ता नेत्रहीन चयन दो vertexes में सक्षम हो जाएगा (नीचे हरी हलकों)

enter image description here

जावास्क्रिप्ट तो Django के लिए इन दो vertexes के pk भेज देंगे,

enter image description here

व्यापार तर्क:

  • एक शीर्ष 1-4 हो सकता है और यह लाइन वर्गों है कि उन दोनों के बीच एक मार्ग को पूरा करना, इस मामले में, निम्नलिखित 4 लाल लाइन्स को खोजने के लिए है यह करने के लिए संबंधित लाइन्स
  • एक लाइन हो सकता है 1-2 vertexes इसे से संबंधित
  • वहाँ केवल दोनों के बीच एक संभव मार्ग होगा vertexes

क्या मैं अब तक है:

  • मैं समझता हूँ कि इस सवाल का जवाब शायद प्रत्यावर्तन शामिल है कि
  • पथ जब तक दूसरे को ढूंढ रहा है एक वर्टेक्स से हर पथ कोशिश कर रहा द्वारा मिल जाना चाहिए, यह सीधे नहीं किया जा सकता पाया
  • के बाद से वहाँ चार और तीन तरह जंक्शनों, सभी मार्गों मुकदमा चल रहा प्रत्यावर्तन भर सहेजा जाना चाहिए (यह एक अनिश्चित)

मैं जानता हूँ कि बुनियादी तर्क प्रत्येक के सभी लाइनों के माध्यम से पाशन है वर्टेक्स, और फिर इन पंक्तियों के अन्य वर्टेक्स प्राप्त करें, और फिर से चलते रहें, लेकिन मुझे नहीं पता कि इस पर कहां से शुरू करना है।

def findRoute(request): 
    data = json.loads(request.body.decode("utf-8")) 
    v1 = Vertex.objects.get(pk=data.get('v1_pk')) 
    v2 = Vertex.objects.get(pk=data.get('v2_pk')) 
    lines = v1.lines.all() 
    routes = [] 
    for line in lines: 
     starting_line = line 
     #Trying a new route 
     this_route_index = len(routes) 
     routes[this_route_index] = [starting_line.pk] 
     other_vertex = line.vertex__set.all().exclude(pk=v1.pk) 
     #There are cases with dead-ends 
     if other_vertex.length > 0: 
     #Mind block... 

उत्तर

13

आप बताया गया है के रूप में, यह एक Django/पायथन संबंधित प्रश्न नहीं है, लेकिन एक तार्किक:

यह जहाँ तक मैं मिल सकता है के रूप में (views.py) है, लेकिन यह शायद मदद नहीं करता है/एल्गोरिदमिक पदार्थ।

एक ग्राफ आप एल्गोरिदम के उपयोग कर सकती है में दो vertexes के बीच पथ ढूंढने के लिए: Dijkstra, A*, DFS, BFS, Floyd–Warshall आदि .. तुम तुम क्या जरूरत पर निर्भर करता है चुन सकते हैं: कम से कम/न्यूनतम पथ, सभी रास्तों ..

Django में इसे कैसे कार्यान्वित करें? मैं सुझाव देता हूं कि मॉडलों पर एल्गोरिदम लागू न करें, क्योंकि यह महंगा हो सकता है (समय की अवधि में, डीबी प्रश्न, आदि ...) विशेष रूप से बड़े ग्राफ के लिए; इसके बजाय, मैं ग्राफ को इन-मेमोरी डेटा स्ट्रक्चर में मैप करना चाहता हूं और इसके ऊपर एल्गोरिदम निष्पादित करना चाहता हूं।

आप इस Networkx पर एक नज़र डाल सकते हैं, जो एक बहुत ही पूर्ण (डेटा संरचना + एल्गोरिदम) और अच्छी तरह से प्रलेखित लाइब्रेरी है; python-graph, जो एक उपयुक्त डेटा संरचना और महत्वपूर्ण एल्गोरिदम का एक पूरा सेट प्रदान करता है (ऊपर उल्लिखित कुछ सहित)। Python Graph Library

+0

पर अधिक विकल्प मैं व्यक्तिगत रूप से संबंधों से ऐसा करना चाहता था क्योंकि यह तेज़ी से लग रहा था, लेकिन नेटवर्कक्स वास्तव में अद्भुत है और अन्य परियोजनाओं के साथ मदद करता है – Mojimi