मैं एक भारित ग्राफ, कोई नकारात्मक वजन है के बजाय औसत बढ़त लागत, और मैं एक से दूसरे नोड से पथ को खोजने के लिए चाहते हैं, एकल चरण के लिए लागत को कम करने की कोशिश कर रहा । मुझे यात्रा की कुल लागत को कम करने की आवश्यकता नहीं है (जैसे कि डिजस्ट्रा करता है) लेकिन औसत चरण-लागत। हालांकि, मुझे एक बाधा है: के, पथ में नोड्स की अधिकतम संख्या।मार्ग समस्या: कम से कम कुल लागत
उदाहरण एक से जम्मू तक जाने के लिए तो के लिए हो सकता है डिज्कस्ट्रा इस पथ (कोष्ठक के बीच वजन)
A (4) D (6) J -> total cost: 10
और कलन विधि मैं की जरूरत है, की स्थापना कश्मीर = 10,
की तरह कुछ मिलेगा मिलेगाA (1) B (2) C (2) D (1) E (3) F (2) G (1) H (3) J -> total cost: 15
इस समस्या के लिए किसी भी अच्छी तरह से ज्ञात एल्गोरिथ्म है?
अग्रिम धन्यवाद।
यूगेनियो
templatetypedef के जवाब के रूप में संपादित करें। कुछ प्रश्न:
1) तथ्य यह है कि औसत को चलाने के लिए चक्र को कई बार लेना मेरे समस्या के लिए अच्छा नहीं है: शायद मुझे इसका उल्लेख करना चाहिए था लेकिन मैं उसी नोड पर जाना चाहता हूं एक से अधिक बार
2) यह सच है कि मैं नकारात्मक वजन की जरूरत नहीं है फायदा उठाने के लिए संभव है?
3) जब आप ने कहा कि ओ (KE) आप पूरे एल्गोरिथ्म के लिए या सिर्फ अतिरिक्त भाग के लिए मतलब था?
चलिए इस सरल कार्यान्वयन को सी में लेते हैं जहां n = nodes की संख्या ई = किनारों की संख्या, डी दूरी के साथ एक वेक्टर है, पूर्ववर्ती के साथ पी वेक्टर और एक संरचना किनारों (यू, वी, डब्ल्यू) किनारों को याद करते हैं रेखांकन में
for (i = 0; i < n; ++i)
d[i] = INFINITY;
d[s] = 0;
for (i = 0; i < n - 1; ++i)
for (j = 0; j < e; ++j)
if (d[edges[j].u] + edges[j].w < d[edges[j].v]){
d[edges[j].v] = d[edges[j].u] + edges[j].w;
p[edges[j].v] = u;
}
मुझे यकीन है कि कैसे मैं अपने जवाब के अनुसार कोड को संशोधित करना चाहिए नहीं कर रहा हूँ; कुल लागत के बजाय औसत को ध्यान में रखना चाहिए यह पर्याप्त होना चाहिए?
for (i = 0; i < n; ++i)
d[i] = INFINITY;
d[s] = 0;
for (i = 0; i < n - 1; ++i)
steps = 0;
for (j = 0; j < e; ++j)
if ((d[edges[j].u]+ edges[j].w)/(steps+1) < d[edges[j].v]/steps){
d[edges[j].v] = d[edges[j].u] + edges[j].w;
p[edges[j].v] = u;
steps++;
}
लेकिन वैसे भी मुझे नहीं पता कि एक ही समय में के सीमा को कैसे ध्यान में रखा जाए ... आपकी मदद के लिए अग्रिम धन्यवाद।
संपादित जब से मैं कुछ त्रुटियाँ मैं इस नैफ समाधान के बारे में सोच रहा हूँ बर्दाश्त कर सकते हैं:
- precompute सभी कम से कम रास्तों और एक संशोधित ग्राफ़ के सभी कम से कम पथ एक
- precompute में याद , जहां मैंने एक निश्चित वजन पर किनारों को काट दिया और उन्हें बी
जब मुझे पथ की आवश्यकता है, तो मैं ए में देखता हूं, उदाहरण के लिए से एक्स y को यह मार्ग है x-> Z-> y तो हर कदम मैं बी में लग रहे हैं, के लिए इतना x> z मैं अगर वहाँ बी में एक कनेक्शन है, अगर नहीं मैं अन्यथा रखने x> जेड देखने के लिए मैं पथ x> z को बी द्वारा प्रदान किए गए उपपथ के साथ भरता हूं, जो x-> j-> h-> z जैसे कुछ हो सकता है; तो मैं z-> y के लिए वही करता हूं। प्रत्येक बार मैं यह भी जांचूंगा कि क्या मैं चक्रीय पथ जोड़ रहा हूं।
शायद मुझे कुछ अजीब पथ मिलेंगे लेकिन यह ज्यादातर मामलों में काम कर सकता है। यदि मैं विभिन्न "कट थ्रेसहोल्ड" के साथ प्रयास करने का समाधान बढ़ाता हूं तो शायद मैं के बाधा का सम्मान करने के करीब भी हो सकता हूं।
आप * क्योंकि Bellman- फोर्ड यात्रा लंबाई के रास्तों पटरियों इस के साथ सावधान रहना होगा अप करने के लिए * कश्मीर, इसलिए सिर्फ कश्मीर Bellman- फोर्ड पुनरावृत्तियों के बाद मिनट लागत वाली पथ की खोज जरूरी आप सही उत्तर नहीं देता है। इसे ठीक करने के तरीके के लिए मेरा समाधान देखें। – templatetypedef
हाय @ हैपुक उत्तर के लिए धन्यवाद, मुझे यकीन नहीं है कि मैंने सवाल तैयार किया है या नहीं। फिलहाल मैं वास्तव में बेलमैन-फोर्ड का उपयोग कर रहा हूं लेकिन मुझे जो पथ मिलते हैं वे बहुत कम हैं और प्रत्येक किनारे की लागत बहुत अधिक है ... मैं सबसे लंबी यात्रा (अधिक किनारों, प्रति किनारे कम लागत) प्राप्त करना चाहता हूं, लेकिन अगर मैंने नियम के रूप में "अधिकांश के किनारों पर उपयोग" सेट किया है, मुझे वही परिणाम मिलेंगे जो मुझे मिल रहा है, है ना? – Eugenio
माफ करना, मैं http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm नहीं धन्यवाद @templatetypedef Bellman- फोर्ड – Eugenio