سؤال

المشكلة: لدي مجموعة كبيرة من النقاط. تحتوي كل نقطة من هذه النقاط على قائمة بالمراجع إلى نقاط أخرى مع المسافة بينها المحسوبة بالفعل وتخزينها. أحتاج إلى تحديد أقصر طريق يبدأ من أصل ويمر عبر عدد محدد من النقاط إلى أي وجهة.

على سبيل المثال: أنا في إجازة وأنا أقيم في مدينة معينة. أحرز رحلة طريقة واحدة لرؤية أي أربع مدن وأريد السفر الأقل بعد ممكنة. لا أستطيع زيارة نفس المدينة أكثر من مرة.

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

ما هي أفضل طريقة للبحث عن أقصر طريق؟

هل كانت مفيدة؟

المحلول

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


للمجادين في المستقبل: خوارزمية فلويد وارشال وجميع الاختلافات التي يشبهها فلويد غير قابل للتطبيق هنا.

نصائح أخرى

في عموما، يجب عليك أن تكون متغيرات سيئة صارمة ... أعتقد أنه يجب عليك استخدام بعض الاختلافات في طريقة Branch_and_boundhttp://en.wikipedia.org/wiki/branch_and_bound.

إما Bredth البحث الأول كما norheim.se قال أو خوارزمية dijkstra سيكون اقتراحي كذلك.

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

ربما هذا هو ما يعنيه الملصق الأصلي عن طريق "التكرار من خلال كل احتمال يدويا وتخزين أقصر مسار"، لكنني اعتقدت أنني أود أن أدلي بصراحة ما يبدو أنه حل خط الأساس.

افترض أن لديك بالفعل خوارزمية مسار من جهة نظرتين - وهذا له حلول كلاسيكية لمختلف أنواع الرسوم البيانية. افترض أن جميع المسافات غير نادرة و D (A-> B-> C) = D (A-> B) + D (B-> C).

الأساسيات هي أن المسار يبدأ في S يذهب من خلال واحدة من المدن المتوسطة "ABCD" وينتهي مع E:

على سبيل المثال sabcde، sacbde، الخ ...

مع 4 مدن وسيطة فقط، تقوم بتعداد جميع التباديلات ال 24. لكل اعتبا منها، استخدم قصر خوارزمية ثنائية النقطتين لحساب المسار من الرأس إلى الذيل، ومسافة إجمالية.

ثم بالنظر إلى نقطة البداية والنهاية، هناك 12 إمكانيات تعلق على أحد ABCD ولكل إمكانيتين للداخلية. لقد قمت بحساب هذه المسافات بالفعل، لذلك تضيف المسافة من S إلى الرأس والذيل إلى E. اختر الحد الأدنى. لذا، بمجرد قيامك بالمسافات المتوسطة للمجموعة الثابتة من المدن الداخلية التي تحتاج إلى القيام بها 12 مشكلتين من أقصاص المسار لمدة 12 نقطة لأي زوج من نقاط البداية والنهاية.

من الواضح أن هذه الموازين سيئة مع عدد متزايد من المدن الوسيطة. ليس من الواضح لي أنه يمكن أن تفعله بشكل أفضل إلا إذا فرضت قيودا أكبر على بنية الرسم البياني (هل هذا في مساحة إقليدية مادية؟ مثلث غير المساواة؟).

مثالي الفكر: لنفترض أن جميع المسافات المتوسطة بين المدن هي (1). مع عدم وجود تقييد على الرسم البياني، فإن المسافة من S إلى أي مدينة متوسطة قد تكون 1000 باستثناء واحد كونه 1. نفسه بالنسبة للذيل. لذلك يمكنك إجبار المدينة الأولى على الزيارة لتكون أي شيء. الآن، اذهب طبقة واحدة إلى أسفل، خذ أول مدينة مثل "نقطة البداية". تطبيق الحجة نفسها: يمكنك أن تجعل أفضل مسار يذهب إلى أي من المدن التالية من خلال التلاعب بالمسافات في الرسم البياني.

لذلك يبدو أن التعقيد لا يمكن أن يساعد دون افتراضات إضافية.

هذا هو الوضع في الوقت المحدد الشائع والحقيقي، أي واحد يمكن أن يسقط في واجهة مستخدم خريطة التسجيل المجاورة يمنحك المسار بنفس الترتيب، يمكنك إضافة قائمة الوجهة. لا يمنحك المسار الأمثل على الرغم من توفر API خرائط Google الخاصة بهم الحل.

تقدم API خرائط Google الحل لهذا. في الطلب لمعرفة المسار الذي تضطر إليه لتزويد العلم "OptimizeWoints": صحيح ". سوف يبدو الطلب مثل هذا.

var request = {
            origin: start,
            destination: end,
            waypoints: waypts,
            optimizeWaypoints: true,
            travelMode: google.maps.TravelMode.DRIVING
        };

ويمكنك رؤية الرمز الكامل للأداة المساعدة في مصدر العرض كأداة مساعدة كاملة يتم تطويرها في JavaScript و HTML.

اتمنى ان يساعد ذلك.

يبدو أن حواف الرسم البياني الخاص بك هي ثنائية الاتجاه. في هذه الحالة، الخوارزمية التي تبحث عنها هي خوارزمية dijkstra.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top