कुशल बस लोड हो रहा है


10

यह कुछ ऐसा है जो मैंने एक लंबे समय से पहले बस यात्रा कंपनी के लिए किया था, और मैं परिणामों से कभी खुश नहीं था। मैं हाल ही में उस पुरानी परियोजना के बारे में सोच रहा था और सोचा था कि मैं उस समस्या पर फिर से विचार करूंगा।

मुसीबत:

बस यात्रा कंपनी में विभिन्न यात्री क्षमता वाली कई बसें हैं (जैसे 15 50-यात्री बसें, 25 30-यात्री बसें ... आदि)। वे बहुत बड़े समूहों (प्रति समूह 300 यात्री) को परिवहन की पेशकश करने में विशेष थे। चूंकि प्रत्येक समूह को कचरे को कम करने के लिए कुशलतापूर्वक अपने बेड़े का प्रबंधन करने के लिए एक साथ यात्रा करने की आवश्यकता होती है।

उदाहरण के लिए, 88 यात्रियों को दो 30-यात्री बसों (12 खाली सीटों) की तुलना में तीन 30-यात्री बसों (2 खाली सीटों) द्वारा बेहतर सेवा प्रदान की जाती है। एक और उदाहरण, एक 50-यात्री बस और एक 30-यात्री बस, प्रकारों के मिश्रण से 75 यात्रियों को बेहतर सेवा दी जाएगी।

ऐसा करने के लिए एक अच्छा एल्गोरिथ्म क्या है?


3
पिकी नहीं होना चाहिए, लेकिन मुझे बस कंपनी के दृष्टिकोण से संदेह होगा, 2 50 यात्री बसें अधिक कुशल होंगी क्योंकि गैस की लागत केवल 3 के बजाय 2 बसों की ओर जा रही है। तो क्या वास्तव में यह आपने कैसे किया?
डंक

8
यह नैकस्पैक समस्या की तरह लगता है , जो एनपी-हार्ड है। व्यवहार में, किसी दिए गए मार्ग के लिए आपका खोज स्थान बहुत छोटा होना चाहिए।
क्रिसकॉक

@Dunk - मैं पहली बार स्वीकार करने के लिए मैं बस और दौरे रसद के बारे में पता नहीं है कि हो जाएगा, लेकिन यह है कि था उनके आवश्यकता। यहां तक ​​कि उनके पास अत्यधिक भुगतान करने वाले सलाहकार भी थे जिन्होंने इसे मैन्युअल रूप से किया।
सिस्टम डाउन

खाली सीटें अप्रासंगिक हैं, जो मायने रखता है परिचालन लागत। इस प्रकार दर्शनशास्त्र के उत्तर को देखें।
लोरेन Pechtel

@ लॉरेनचिप - जैसा कि मैंने पहले कहा था, मैं व्यापार नियमों को निर्धारित नहीं करता, मैं उन्हें लागू करता हूं।
सिस्टम डाउन

जवाबों:


8

यह बिन पैकिंग समस्या का एक उदाहरण है (जैसे), जो अक्सर समस्या के साथ उलझन में है। बिन पैकिंग में, आपके पास एक निश्चित क्षमता के डिब्बे हैं, और आप विभिन्न आकारों की वस्तुओं को डिब्बे में वितरित करने का प्रयास कर रहे हैं। विचार डिब्बे की कम से कम संभव संख्या का उपयोग करना है।

आप डिब्बे की संख्या को कम करने की कोशिश नहीं कर रहे हैं, हालांकि, आप खाली सीटों की संख्या को कम करने की कोशिश कर रहे हैं। और यह संभव है कि आप बेड़े में खाली सीटों की संख्या को कम करने की कोशिश कर रहे हैं, अर्थात, आपके पास विभिन्न आकारों के चार दौरे समूह हैं, और आप उन सभी को खाली सीटों की सबसे कम संख्या के साथ समायोजित करना चाहते हैं। मैं बल्ले से एक उदाहरण के बारे में नहीं सोच सकता, लेकिन मुझे लगता है कि यह एक बेड़े और दौरे समूहों का एक सेट बनाने के लिए संभव हो सकता है जैसे कि आप कुछ समूह के लिए घटिया समाधान के साथ बेहतर होंगे क्योंकि इससे आपको बचने की अनुमति मिलती है कुछ अन्य समूह के लिए एक भी बदतर समाधान का उपयोग करना।

ये और ख़राब हो जाता है। अगर आपके पास 20,30 और 50 यात्री बसें हैं तो क्या होगा प्रत्येक व्यक्ति अलग-अलग मात्रा में ईंधन का उपयोग करता है, लेकिन एक 50 और 30 को चलाने के लिए इसकी तुलना में अधिक कुशल होना आवश्यक है। लेकिन हमारे एकल माप (खाली सीटों की कम से कम संख्या) से, यह 50 में से किसी एक को चलाने के लिए समझ में आता है। यात्री का दौरा।

इसके अलावा, 28 या 39 जैसी अजीब संख्या वाली बसें, हमारे बहुत सारे शॉर्टकट को तिरछा कर देती हैं।

इसलिए, स्थिति की जटिलता के आधार पर, आप दो चीजों में से एक कर सकते हैं:

सबसे पहले, और संपूर्ण खोज पेड़: बसों के हर संभव संयोजन का उपयोग करें। यदि आपके पास केवल 3 या 4 बस आकार हैं, तो यह संभवतः एक उचित समाधान है। अन्यथा, सबसे अच्छा फिट घटने जैसा कुछ उचित होगा, लेकिन इष्टतम नहीं, परिणाम।


मैं सोच भी नहीं सकता कि यह जवाब क्यों दिया गया। क्षतिपूर्ति करने के लिए। बहुत बढ़िया।
डेविड कॉनराड

1

यहाँ पायथन में एक त्वरित और गंदा समाधान है:

def add50(passengers, buses):
    proposed = buses + [50]
    if sum(proposed) < passengers:
        return add50(passengers, proposed)
    return proposed

def add30(passengers, buses):
    proposed = buses + [30]
    if sum(proposed) < passengers:
        proposed30 = add30(passengers, proposed)
        proposed50 = add50(passengers, proposed)
        return proposed30 if sum(proposed30) < sum(proposed50) else proposed50
    return proposed

print add30(88, [])
print add30(75, [])
print add30(105, [])

जब मैं इसे चलाता हूं, मुझे मिलता है:

[30, 30, 30]
[30, 50]
[30, 30, 50]

कोड संभावित परिदृश्यों के माध्यम से गहराई-पहली खोज कर रहा है। चूंकि ऑर्डर मायने नहीं रखता ( [30, 50]जैसा है [50, 30]), हम केवल एक ही आकार या बड़े की बसों को जोड़कर खोज स्थान को बहुत छोटा कर सकते हैं। इसलिए add30()कॉल कर सकते हैं add50(), लेकिन दूसरे तरीके से नहीं।


0

मैं ग्राहक के नजरिए से इसका जवाब देने जा रहा हूं। मैं इस एप्लिकेशन के लिए हार्ड कोडित एल्गोरिथ्म नहीं चाहूंगा। बहुत से चर हैं जो समय के साथ बदल सकते हैं। यद्यपि आपकी बसों के बारे में कुछ भी नहीं बदल सकता है क्योंकि कारकों का वजन बदल सकता है या नए कारक खोजे जा सकते हैं जिनके बारे में मैंने कभी नहीं सोचा था (उदाहरण के लिए समय, कानून और अन्य चालक लागत)।

इस वजह से, मैं अनुरोध किए गए यात्रियों की संख्या के आधार पर अपनी स्वयं की लुकअप तालिका बनाने में सक्षम होना चाहता हूं और मैं सर्वश्रेष्ठ बस संयोजनों के लिए अपनी स्वयं की सेटिंग्स बनाऊंगा। उदाहरण: ३१-५० = १ एक्स ५०, ५१-६० = २ एक्स ३०। क्या इसकी वास्तव में गणना करने की आवश्यकता है? सीटों, गैस और ड्राइवरों को फ़ार्मुलों के एक समूह की तुलना में सेटिंग्स को बदलने में आसान। सबसे अच्छे संयोजन का पता लगाएं और उसके साथ करें और उपयोगकर्ता के लिए इन सेटिंग्स को बदलने के लिए बहुत जगह है क्योंकि वे फिट दिखते हैं।

नए कारकों की खोज की जा सकती है। क्या बड़ी बसें टोलों पर तेजी से अधिक दर का भुगतान करती हैं? जब मैं 30 से अधिक यात्रियों वाली बसों के ड्राइवरों पर अतिरिक्त प्रमाणन और लाइसेंस के लिए एक नया कानून लाता हूं, तो क्या मुझे छोटी बसों के लिए कम महंगे ड्राइवर मिल सकते हैं?

वे अपने फार्मूले के लिए एक अलग तर्क के साथ एक नए सलाहकार को नियुक्त करते हैं और आपके ऐप को फिर से लिखना पड़ सकता है। आप पार्किंग की कारक लागत का मतलब है?


यह काम नहीं करता है: 31-50 = 50 सीट बस, जब तक कि वे पहले से ही अन्य समूहों के लिए उपयोग नहीं किए जाते हैं, या सेवा से बाहर हैं, या अन्य कारणों से अनुपलब्ध हैं। सवाल से बस कंपनी, 15 50-यात्री बसों के साथ एक बार में कई ग्राहक होने की संभावना है।
मसलक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.