Tải xe buýt hiệu quả


10

Đây là điều tôi đã làm cho một công ty du lịch xe buýt từ lâu, và tôi chưa bao giờ hài lòng với kết quả này. Tôi đã suy nghĩ về dự án cũ gần đây và nghĩ rằng tôi sẽ xem xét lại vấn đề đó.

Vấn đề:

Công ty du lịch xe buýt có một số xe buýt với sức chứa hành khách khác nhau (ví dụ 15 xe buýt 50 hành khách, 25 xe buýt 30 hành khách ... vv). Họ chuyên cung cấp dịch vụ vận chuyển cho các nhóm rất lớn (hơn 300 hành khách mỗi nhóm). Vì mỗi nhóm cần đi du lịch cùng nhau, họ cần quản lý đội tàu của mình một cách hiệu quả để giảm chất thải.

Chẳng hạn, 88 hành khách được phục vụ tốt hơn bởi ba xe buýt 30 hành khách (2 ghế trống) so với hai xe buýt 50 hành khách (12 ghế trống). Một ví dụ khác, 75 hành khách sẽ được phục vụ tốt hơn bởi một xe buýt 50 hành khách và một xe buýt 30 hành khách, kết hợp nhiều loại.

Một thuật toán tốt để làm điều này là gì?


3
Không kén chọn, nhưng tôi sẽ nghi ngờ từ quan điểm của công ty xe buýt, 2 50 xe buýt chở khách sẽ hiệu quả hơn vì chi phí xăng chỉ chuyển sang 2 xe buýt thay vì 3. Đây thực sự là cách bạn đã làm?
Dunk

8
Điều này nghe có vẻ như vấn đề về chiếc ba lô , vốn là NP-hard. Trong thực tế, không gian tìm kiếm của bạn cho một tuyến đường nhất định phải khá nhỏ.
chrisaycock

@Dunk - Tôi sẽ là người đầu tiên thừa nhận rằng tôi không có ý tưởng gì về hậu cần xe buýt và tour du lịch, nhưng đó yêu cầu của họ. Họ thậm chí đã có một nhà tư vấn được trả lương cao, người đã làm nó bằng tay.
Hệ thống xuống

Ghế trống là không liên quan, những gì được tính là chi phí hoạt động. Do đó, hãy nhìn vào câu trả lời của philosodad.
Loren Pechtel

@LorenPechtel - Như tôi đã nói trước đây, tôi không ra lệnh cho các quy tắc kinh doanh, tôi chỉ thực hiện chúng.
Hệ thống xuống

Câu trả lời:


8

Đây là (một loại) một ví dụ về vấn đề đóng gói bin, thường bị nhầm lẫn với vấn đề ba lô. Trong thùng đóng gói, bạn có các thùng có công suất nhất định và bạn đang cố gắng phân phối các đồ vật có kích cỡ khác nhau vào các thùng. Ý tưởng là sử dụng số lượng thùng ít nhất có thể.

Bạn không thực sự cố gắng giảm thiểu số lượng thùng, tuy nhiên, bạn đang cố gắng giảm thiểu số lượng ghế trống. Và có thể là bạn đang cố gắng giảm thiểu số lượng ghế trống trong toàn đội, nghĩa là bạn có bốn nhóm du lịch với nhiều kích cỡ khác nhau và bạn muốn chứa tất cả số ghế đó với số lượng ghế trống ít nhất. Tôi không thể nghĩ ra một ví dụ ngay lập tức, nhưng tôi tưởng tượng có thể xây dựng một đội tàu và một nhóm các tour du lịch để bạn có thể tốt hơn với một giải pháp không đạt tiêu chuẩn cho một số nhóm vì nó cho phép bạn tránh sử dụng một giải pháp thậm chí còn tồi tệ hơn cho một số nhóm khác.

Nó trở nên tồi tệ hơn. Điều gì sẽ xảy ra nếu bạn có 20,30 và 50 xe khách. Mỗi người sử dụng một lượng nhiên liệu khác nhau, nhưng sẽ hiệu quả hơn khi chạy một 50 so với chạy 20 và 30. Nhưng từ biện pháp duy nhất của chúng tôi (số lượng ghế trống ít nhất), sẽ rất hợp lý khi chạy cho 50 hành khách du lịch.

Ngoài ra, xe buýt có số lạ, như 28 hoặc 39, sẽ làm lệch rất nhiều phím tắt của chúng tôi.

Vì vậy, tùy thuộc vào mức độ phức tạp của tình huống, bạn có thể thực hiện một trong hai điều sau:

Cây tìm kiếm đầu tiên và đầy đủ: sử dụng mọi sự kết hợp có thể của xe buýt. Nếu bạn chỉ có 3 hoặc 4 kích cỡ xe buýt, đây có lẽ là một giải pháp hợp lý. Nếu không, một cái gì đó như giảm phù hợp nhất sẽ mang lại kết quả hợp lý, nhưng không tối ưu.


Tôi không thể tưởng tượng được tại sao câu trả lời này lại bị hạ thấp. Nâng cao để bù đắp. Làm tốt.
David Conrad

1

Đây là một giải pháp nhanh và bẩn trong 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, [])

Khi tôi chạy nó, tôi nhận được:

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

Mã đang thực hiện tìm kiếm theo chiều sâu thông qua các tình huống có thể xảy ra. Vì thứ tự không quan trọng ( [30, 50]giống như [50, 30]), chúng tôi có thể làm cho không gian tìm kiếm nhỏ hơn rất nhiều bằng cách chỉ thêm các xe buýt có cùng kích thước hoặc lớn hơn. Đó là lý do tại sao add30()có thể gọi add50(), nhưng không phải là cách khác.


0

Tôi sẽ trả lời điều này từ góc độ khách hàng. Tôi sẽ không muốn một thuật toán mã hóa cứng cho ứng dụng này. Có quá nhiều biến số có thể thay đổi theo thời gian. Mặc dù không có gì về xe buýt của bạn có thể thay đổi trọng lượng của các yếu tố có thể thay đổi hoặc các yếu tố mới có thể được phát hiện mà tôi không bao giờ nghĩ tới (ví dụ: theo thời gian, luật pháp và các chi phí lái xe khác).

Vì điều này, tôi muốn có thể tạo bảng tra cứu của riêng mình dựa trên một loạt số lượng hành khách được yêu cầu và tôi sẽ tạo các cài đặt của riêng mình cho các kết hợp xe buýt tốt nhất. Ví dụ: 31-50 = 1 X 50, 51-60 = 2 X 30. Điều này có thực sự cần phải tính toán không? Dễ dàng thay đổi cài đặt hơn một loạt các công thức bao gồm ghế, ga và trình điều khiển. Tìm ra sự kết hợp tốt nhất và được thực hiện với nó và có nhiều chỗ để người dùng thay đổi các cài đặt này khi họ thấy phù hợp.

Các yếu tố mới có thể được phát hiện. Do xe buýt lớn hơn phải trả một tỷ lệ cao hơn theo cấp số nhân về phí cầu đường? Tôi có thể có được các trình điều khiển ít tốn kém hơn cho các xe buýt nhỏ không khi luật mới về chứng nhận và cấp phép bổ sung tăng lên đối với các tài xế xe buýt trên 30 hành khách?

Họ thuê một nhà tư vấn mới với logic khác với công thức của họ và ứng dụng của bạn có thể cần phải được viết lại. Bạn có nghĩa là bạn phải yếu tố chi phí đậu xe?


Điều này không hoạt động: 31-50 = xe buýt 50 chỗ, trừ khi chúng đã được sử dụng cho các nhóm khác hoặc hết dịch vụ hoặc không có sẵn vì các lý do khác. Công ty xe buýt từ câu hỏi, với 15 xe buýt 50 hành khách rất có thể sẽ có nhiều khách hàng cùng một lúc.
MSalters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.