การโหลดบัสอย่างมีประสิทธิภาพ


10

นี่คือสิ่งที่ฉันทำเพื่อ บริษัท ท่องเที่ยวรถบัสเมื่อนานมาแล้วและฉันก็ไม่เคยพอใจกับผลลัพธ์ที่ได้ ฉันกำลังคิดเกี่ยวกับโครงการเก่านั้นเมื่อเร็ว ๆ นี้และคิดว่าฉันจะทบทวนปัญหานั้นอีกครั้ง

ปัญหา:

บริษัท การเดินทางด้วยรถบัสมีรถโดยสารหลายคันที่มีความจุผู้โดยสารที่แตกต่างกัน (เช่นรถบัสโดยสาร 50- 50 คัน, รถบัสโดยสาร 30 25 คัน ... และอื่น ๆ ) พวกเขาเชี่ยวชาญในการให้บริการขนส่งไปยังกลุ่มใหญ่มาก (300+ ผู้โดยสารต่อกลุ่ม) เนื่องจากแต่ละกลุ่มต้องการเดินทางด้วยกันพวกเขาจำเป็นต้องจัดการกองยานของตนอย่างมีประสิทธิภาพเพื่อลดของเสีย

ตัวอย่างเช่นผู้โดยสาร 88 คนได้รับการบริการที่ดีกว่าโดยรถบัสโดยสาร 30 คัน (ที่นั่งว่างเปล่า 2 ที่นั่ง) กว่ารถโดยสาร 50 คันสองคัน (ที่นั่งว่าง 12 คัน) อีกตัวอย่างหนึ่งผู้โดยสาร 75 คนจะได้รับการบริการที่ดีขึ้นโดยรถบัสโดยสาร 50 คันและรถบัสโดยสาร 30 คันหนึ่งประเภท

อัลกอริทึมที่ดีในการทำสิ่งนี้คืออะไร


3
ไม่ต้องจู้จี้จุกจิก แต่ฉันจะสงสัยจากมุมมองของ บริษัท รถบัส 2 50 รถโดยสารจะมีประสิทธิภาพมากขึ้นเนื่องจากค่าใช้จ่ายก๊าซจะไปเพียง 2 รถเมล์แทน 3 ดังนั้นนี่คือวิธีที่คุณทำ?
Dunk

8
ดูเหมือนว่าปัญหาเครื่องหลังซึ่งเป็นปัญหาหนัก ในทางปฏิบัติพื้นที่ค้นหาของคุณสำหรับเส้นทางที่กำหนดควรมีขนาดค่อนข้างเล็ก
chrisaycock

@Dunk - ฉันจะเป็นคนแรกที่ยอมรับว่าฉันไม่รู้เกี่ยวกับรถบัสและโลจิสติกส์การท่องเที่ยว แต่นั่นเป็นความต้องการของพวกเขา พวกเขามีที่ปรึกษาที่ได้รับค่าตอบแทนสูง
ระบบหยุดทำงาน

ที่นั่งว่างไม่เกี่ยวข้องสิ่งที่นับเป็นค่าใช้จ่ายในการดำเนินงาน ดูคำตอบของ philosodad
Loren Pechtel

@ LorenPechtel - อย่างที่ฉันพูดไปก่อนหน้านี้ฉันไม่ได้กำหนดกฎเกณฑ์ทางธุรกิจ
ระบบ

คำตอบ:


8

นี่คือ (ตัวอย่าง) ปัญหาการบรรจุถังขยะซึ่งมักสับสนกับปัญหาเครื่องหลัง ในถังบรรจุคุณมีถังขยะที่มีความจุที่แน่นอนและคุณพยายามแจกจ่ายวัตถุที่มีขนาดต่าง ๆ ลงในถังขยะ แนวคิดคือการใช้จำนวนถังขยะที่เป็นไปได้น้อยที่สุด

คุณไม่ได้พยายามลดจำนวนถังขยะ แต่คุณพยายามลดจำนวนที่นั่งว่าง และเป็นไปได้ว่าคุณกำลังพยายามลดจำนวนที่นั่งว่างในฝูงบินนั่นคือคุณมีกลุ่มทัวร์สี่ขนาดที่หลากหลายและคุณต้องการรองรับที่นั่งทั้งหมดด้วยจำนวนที่นั่งว่างที่น้อยที่สุด ฉันไม่สามารถนึกถึงอินสแตนซ์ของค้างคาวได้ แต่ฉันคิดว่ามันอาจเป็นไปได้ที่จะสร้างกองยานและกลุ่มทัวร์ที่คุณจะดีกว่าด้วยวิธีแก้ปัญหาที่ไม่ได้มาตรฐานสำหรับบางกลุ่มเพราะมันช่วยให้คุณหลีกเลี่ยง ใช้โซลูชันที่แย่ยิ่งกว่าสำหรับกลุ่มอื่น

มันแย่ลงเรื่อย ๆ จะเป็นอย่างไรถ้าคุณมีบัส 20,30 และ 50 บัส แต่ละคนใช้เชื้อเพลิงในปริมาณที่แตกต่างกัน แต่มีประสิทธิภาพมากขึ้นในการวิ่งหนึ่ง 50 มากกว่าวิ่ง 20 และ 30 แต่จากการวัดครั้งเดียวของเรา ทัวร์ผู้โดยสาร

นอกจากนี้รถเมล์ที่มีตัวเลขแปลก ๆ เช่น 28 หรือ 39 จะเอียงทางลัดจำนวนมากของเรา

ดังนั้นขึ้นอยู่กับความซับซ้อนของสถานการณ์คุณสามารถทำหนึ่งในสองสิ่งต่อไปนี้:

แผนผังการค้นหาแรกและละเอียดถี่ถ้วน: ใช้ชุดค่าผสมที่เป็นไปได้ทั้งหมดของรถโดยสาร หากคุณมีขนาดบัส 3 หรือ 4 ขนาดนี่อาจเป็นคำตอบที่สมเหตุสมผล ไม่เช่นนั้นการลดขนาดให้พอดีที่สุดจะให้ผลลัพธ์ที่สมเหตุสมผล แต่ไม่เหมาะสมที่สุด


ฉันไม่สามารถจินตนาการได้ว่าทำไมคำตอบนี้จึงลดลง การถอนเงินเพื่อชดเชย ทำได้ดี.
David Conrad

1

นี่คือวิธีแก้ปัญหาที่รวดเร็วและสกปรกใน Python:

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

ฉันจะตอบคำถามนี้จากมุมมองของลูกค้า ฉันไม่ต้องการอัลกอริทึมการเข้ารหัสแบบหนักสำหรับแอปพลิเคชันนี้ มีตัวแปรมากเกินไปที่สามารถเปลี่ยนแปลงได้ตลอดเวลา แม้ว่าจะไม่มีอะไรเกี่ยวกับรถโดยสารของคุณอาจเปลี่ยนน้ำหนักของปัจจัยที่สามารถเปลี่ยนแปลงได้หรือปัจจัยใหม่สามารถค้นพบได้ว่าฉันไม่เคยคิดถึง (เช่นการทำงานล่วงเวลากฎหมายและค่าใช้จ่ายอื่น ๆ )

ด้วยเหตุนี้ฉันจึงต้องการสร้างตารางการค้นหาของฉันเองตามจำนวนผู้โดยสารที่ร้องขอและฉันจะสร้างการตั้งค่าของตัวเองสำหรับชุดค่าผสมรถบัสที่ดีที่สุด ตัวอย่าง: 31-50 = 1 X 50, 51-60 = 2 X 30 สิ่งนี้จำเป็นต้องคำนวณจริงหรือไม่? เปลี่ยนการตั้งค่าได้ง่ายกว่าการใช้สูตรแก๊สและไดรเวอร์ คิดว่าชุดค่าผสมที่ดีที่สุดและจะทำกับมันและมีห้องมากมายสำหรับผู้ใช้ที่จะเปลี่ยนการตั้งค่าเหล่านี้ตามที่เห็นสมควร

สามารถค้นพบปัจจัยใหม่ รถโดยสารขนาดใหญ่จ่ายอัตราค่าโทรที่สูงขึ้นเป็นทวีคูณหรือไม่? ฉันจะได้รับไดรเวอร์ที่ถูกกว่าสำหรับรถโดยสารขนาดเล็กเมื่อมีกฎหมายใหม่สำหรับการรับรองเพิ่มเติมและการออกใบอนุญาตให้กับผู้ขับขี่รถโดยสารมากกว่า 30 คนหรือไม่

พวกเขาจ้างที่ปรึกษาใหม่ด้วยตรรกะที่แตกต่างกับสูตรของพวกเขาและแอพของคุณอาจต้องเขียนใหม่ คุณหมายถึงคุณต้องคำนึงถึงต้นทุนค่าที่จอดรถหรือไม่


สิ่งนี้ใช้ไม่ได้: 31-50 = 50 ที่นั่งรถบัสเว้นแต่ว่าจะใช้กับกลุ่มอื่นหรือเลิกใช้งานแล้วหรือไม่สามารถใช้งานได้ด้วยเหตุผลอื่น บริษัท รถบัสจากคำถามที่มีรถบัสโดยสาร 50 -15 คันน่าจะมีลูกค้าหลายรายในเวลาเดียวกัน
MSalters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.