Jgrapht: DeltaSteppingShortestPath غير قادر على حل SSSP على مسار بثلاث حواف أو أكثر

تم إنشاؤها على ٣٠ أكتوبر ٢٠٢٠  ·  5تعليقات  ·  مصدر: jgrapht/jgrapht

 * JGraphT version: 1.5.0 [also tested on 1.4.0]
 * Java version (java -version)/platform:  adopt-openjdk-15/windows [also tested on oracle 1.8.0_265/windows]

مشكلة
لا يمكن لـ DeltaSteppingShortestPath حل مشكلة أقصر مسار على رسم بياني حيث يكون الرأس الهدف على بعد 3 حواف أو أكثر من قمة المصدر.

خطوات إعادة الإنتاج (مثال ترميز صغير)

DirectedWeightedMultigraph<String, DefaultWeightedEdge> graph = new DirectedWeightedMultigraph<>(DefaultWeightedEdge.class);
graph.addVertex("v0");
graph.addVertex("v1");
graph.addVertex("v2");
graph.addVertex("v3");
graph.addEdge("v0", "v1");
graph.addEdge("v1", "v2");
graph.addEdge("v2", "v3");
new DeltaSteppingShortestPath<>(graph).getPath("v0", "v3") // this returns null
new DijkstraShortestPath<>(graph).getPath("v0", "v3") // this returns a non-null result

سلوك متوقع
يجب أن تجد DeltaSteppingShortestPath حلاً مشابهًا لـ DijkstraShortestPath

معلومات أخرى

bug

التعليق الأكثر فائدة

لقد أصلحت الخطأ في فرعي المحلي. سأرسل PR بعد دمج # 972 منذ أن أجريت تغييراتي فوق تلك الالتزامات.

في الأساس ، تذهب المشكلة على النحو التالي: حساب عدد المجموعات صحيح. ومع ذلك ، فإن التكرار على بنية الجرافة أثناء حساب أقصر مسار غير صحيح لأن كل مجموعة يتم اجتيازها مرة واحدة فقط. لكي تكون صحيحة ، يجب أن يكون عدد المجموعات مساويًا لـ ceil(L/delta) حيث L هو أقصى وزن لأقصر مسار في الرسم البياني.

في تطبيقنا ، لدينا عدد المجموعات المحسوبة كـ

numOfBuckets = (int) (Math.ceil(maxEdgeWeight / delta) + 1);

والرؤوس يتم تخصيصها للمجموعات كـ

private int bucketIndex(double distance) {
    return (int) Math.round(distance / delta) % numOfBuckets;
}

لذلك قد يتم عبور بعض الحاويات عدة مرات. لإصلاح هذه المشكلة ، يلزم البدء بأول حاوية غير فارغة في كل تفاعل ، كما هو موضح هنا:

Screenshot from 2021-01-17 12-57-23

ال 5 كومينتر

SChudakov هل يمكنك إلقاء نظرة؟

@ د - مايكل بالتأكيد ، سأفعل.

SChudakov بالنسبة لي يبدو أن هناك مشكلة في حساب الدلاء

numOfBuckets = (int) (Math.ceil(maxEdgeWeight / delta) + 1);

https://github.com/jgrapht/jgrapht/blob/master/jgrapht-core/src/main/java/org/jgrapht/alg/shortestpath/DeltaSteppingShortestPath.java#L312

عند تشغيل الاختبار من أعلى ، يكون عدد المجموعات اثنين ، لأن maxEdgeWeight في الرسم البياني هي 1 (ودلتا = 1).
يوضح هذا على الأقل سبب عدم تمكنه من حل رسم بياني بأكثر من 3 حواف متسلسلة.

لقد أصلحت الخطأ في فرعي المحلي. سأرسل PR بعد دمج # 972 منذ أن أجريت تغييراتي فوق تلك الالتزامات.

في الأساس ، تذهب المشكلة على النحو التالي: حساب عدد المجموعات صحيح. ومع ذلك ، فإن التكرار على بنية الجرافة أثناء حساب أقصر مسار غير صحيح لأن كل مجموعة يتم اجتيازها مرة واحدة فقط. لكي تكون صحيحة ، يجب أن يكون عدد المجموعات مساويًا لـ ceil(L/delta) حيث L هو أقصى وزن لأقصر مسار في الرسم البياني.

في تطبيقنا ، لدينا عدد المجموعات المحسوبة كـ

numOfBuckets = (int) (Math.ceil(maxEdgeWeight / delta) + 1);

والرؤوس يتم تخصيصها للمجموعات كـ

private int bucketIndex(double distance) {
    return (int) Math.round(distance / delta) % numOfBuckets;
}

لذلك قد يتم عبور بعض الحاويات عدة مرات. لإصلاح هذه المشكلة ، يلزم البدء بأول حاوية غير فارغة في كل تفاعل ، كما هو موضح هنا:

Screenshot from 2021-01-17 12-57-23

أعتقد أنه يمكننا إغلاق هذا الآن.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

IngerMathilde picture IngerMathilde  ·  5تعليقات

nikhilbhardwaj picture nikhilbhardwaj  ·  3تعليقات

hulk-baba picture hulk-baba  ·  13تعليقات

jsichi picture jsichi  ·  12تعليقات

jsichi picture jsichi  ·  12تعليقات