python - مترجم - دجانغو إيجاد مسارات بين اثنين من الذئاب في الرسم البياني



فيلم جانغو 1966 مترجم (1)

هذا هو في الغالب سؤال منطقي، ولكن يتم السياق في جانغو.

في قاعدة البيانات لدينا لدينا فيرتكس وفئات الخط، وهذه تشكل شبكة (العصبية)، ولكن هو غير مرتبة وأنا لا يمكن تغييره، انها قاعدة بيانات قديمة

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)

الآن، في التطبيق، سوف يكون المستخدم قادرا على تحديد بصريا اثنين من قمة الرأس (الدوائر الخضراء أدناه)

سوف جافاسكريبت ثم إرسال بيكاي من هذين فيرتكسيس إلى جانغو، وعليها أن تجد الطبقات الخط الذي يرضي طريق بينهما، في هذه الحالة، 4 خطوط الحمراء التالية:

منطق الأعمال:

  • A فيرتكس يمكن أن يكون 1-4 خطوط ذات الصلة به
  • خط يمكن أن يكون 1-2 فيرتكسيس ذات الصلة به
  • لن يكون هناك سوى طريق واحد ممكن بين اثنين من فيرتكسيس

ما لدي حتى الآن:

  • أنا أفهم أن الجواب ربما يتضمن التكرار
  • يجب أن يتم العثور على المسار من خلال محاولة كل مسار من فيرتكس واحدة حتى الآخر هو العثور عليها، فإنه لا يمكن العثور عليها مباشرة
  • وبما أن هناك تقاطعات أربعة وثلاثة طرق، يجب حفظ جميع الطرق التي تجري محاكمتها طوال فترة التكرار (غير متأكد من ذلك)

وأنا أعلم أن المنطق الأساسي هو حلقات من خلال جميع خطوط كل فيرتكس، ومن ثم الحصول على فيرتكس أخرى من هذه الخطوط، والحفاظ على المشي بشكل متكرر، ولكن أنا حقا لا أعرف من أين تبدأ على هذا واحد.

هذا هو بقدر ما يمكنني الحصول عليه، ولكن ربما لا يساعد (view.py):

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...

وكما أشرت، فإن هذا ليس مسألة جانغو / بيثون ذات صلة، ولكن مسألة منطقية / خوارزمية.

للعثور على مسارات بين اثنين من الذئاب في الرسم البياني يمكنك استخدام الكثير من الخوارزميات: ديجكسترا ، A * ، دفس ، بفس ، فلويد-وارشال الخ .. يمكنك اختيار اعتمادا على ما تحتاجه: أقصر / مسار الحد الأدنى، وجميع المسارات ...

كيفية تنفيذ هذا في جانغو؟ أقترح أن لا تطبق الخوارزمية على النماذج نفسها، لأن هذا يمكن أن تكون مكلفة (في الوقت المناسب، الاستعلامات دب، الخ ...) خصيصا للرسوم البيانية الكبيرة. بدلا من ذلك، أود بدلا من ذلك تعيين الرسم البياني في بنية البيانات في الذاكرة وتنفيذ الخوارزمية أكثر من ذلك.

يمكنك إلقاء نظرة على هذا نيتورككس ، وهو كامل جدا (هيكل البيانات + خوارزميات) ومكتبة موثقة جيدا. الثعبان الرسم البياني ، الذي يوفر بنية بيانات مناسبة ومجموعة كاملة من الخوارزميات الهامة (بما في ذلك بعض المذكورة أعلاه). المزيد من الخيارات في مكتبة بيثون الرسم البياني





logic