* 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
معلومات أخرى
SChudakov هل يمكنك إلقاء نظرة؟
@ د - مايكل بالتأكيد ، سأفعل.
SChudakov بالنسبة لي يبدو أن هناك مشكلة في حساب الدلاء
numOfBuckets = (int) (Math.ceil(maxEdgeWeight / delta) + 1);
عند تشغيل الاختبار من أعلى ، يكون عدد المجموعات اثنين ، لأن 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;
}
لذلك قد يتم عبور بعض الحاويات عدة مرات. لإصلاح هذه المشكلة ، يلزم البدء بأول حاوية غير فارغة في كل تفاعل ، كما هو موضح هنا:
أعتقد أنه يمكننا إغلاق هذا الآن.
التعليق الأكثر فائدة
لقد أصلحت الخطأ في فرعي المحلي. سأرسل PR بعد دمج # 972 منذ أن أجريت تغييراتي فوق تلك الالتزامات.
في الأساس ، تذهب المشكلة على النحو التالي: حساب عدد المجموعات صحيح. ومع ذلك ، فإن التكرار على بنية الجرافة أثناء حساب أقصر مسار غير صحيح لأن كل مجموعة يتم اجتيازها مرة واحدة فقط. لكي تكون صحيحة ، يجب أن يكون عدد المجموعات مساويًا لـ
ceil(L/delta)
حيثL
هو أقصى وزن لأقصر مسار في الرسم البياني.في تطبيقنا ، لدينا عدد المجموعات المحسوبة كـ
والرؤوس يتم تخصيصها للمجموعات كـ
لذلك قد يتم عبور بعض الحاويات عدة مرات. لإصلاح هذه المشكلة ، يلزم البدء بأول حاوية غير فارغة في كل تفاعل ، كما هو موضح هنا: