효율적인 버스 로딩


10

이것은 오래 전에 버스 여행 회사에서 한 일이며 결과에 결코 만족하지 않았습니다. 나는 최근에 그 오래된 프로젝트에 대해 생각하고 있었고 그 문제를 다시 생각할 것이라고 생각했습니다.

문제:

버스 여행 회사에는 승객 용량이 다른 여러 버스가 있습니다 (예 : 15 명의 50 인승 버스, 25 명의 30 인승 버스 등). 그들은 매우 큰 그룹 (그룹 당 300 명 이상의 승객)에게 운송을 제공하는 것을 전문으로했습니다. 각 그룹은 함께 여행해야하므로 폐기물을 줄이기 위해 차량을 효율적으로 관리해야했습니다.

예를 들어 88 명의 승객은 2 인의 50 인승 버스 (12 개의 빈 좌석)보다 3 인의 30 인승 버스 (2 개의 빈 좌석)를 이용하는 것이 좋습니다. 또 다른 예로, 75 명의 승객은 한 유형의 50 인승 버스와 하나의 30 인승 버스를 이용하는 것이 좋습니다.

이를위한 좋은 알고리즘은 무엇입니까?


3
까다 롭지는 않지만 버스 회사 입장에서는 가스 비용이 3 대가 아닌 2 대의 버스를 향하고 있기 때문에 2 대의 50 대의 여객 버스가 더 효율적이라고 생각합니다.
덩크

8
이것은 배낭 문제 처럼 들리는데 , 이는 NP-hard입니다. 실제로, 주어진 경로에 대한 검색 공간은 매우 작아야합니다.
chrisaycock

@Dunk는 - 나는 버스 투어 물류에 대해 아무 생각이 없다는 것을 인정하는 첫번째가 될 것이다, 그러나 그것은 이었다 자신의 요구 사항. 그들은 수작업으로 고액의 컨설턴트를 고용하기도했습니다.
시스템 다운

빈 좌석은 관련이 없으며 운영 비용은 얼마입니까? 따라서 철학자의 답을보십시오.
Loren Pechtel 2016 년

@LorenPechtel-이전에 말했듯이 비즈니스 규칙을 지시하지 않고 그냥 구현합니다.
시스템 다운

답변:


8

이것은 빈 포장 문제의 한 예이며, 종종 배낭 문제와 혼동됩니다. 빈 포장에는 특정 용량의 빈이 있으며 다양한 크기의 물체를 빈에 분배하려고합니다. 가장 적은 수의 용지함을 사용하는 것이 좋습니다.

빈 수를 최소화하려고하지는 않지만 빈 자리 수를 최소화하려고합니다. 또한 차량 전체의 빈 좌석 수를 최소화하려고 할 수 있습니다. 즉, 다양한 크기의 4 개의 투어 그룹이 있으며 가장 적은 수의 빈 좌석으로 모든 좌석을 수용하려고합니다. 나는 박쥐에서 즉시 인스턴스를 생각할 수 없지만 함대와 일련의 여행 그룹을 구성하여 피할 수 있기 때문에 일부 그룹에 대한 하위 표준 솔루션을 사용하는 것이 좋습니다. 다른 그룹에게는 더 나쁜 해결책을 사용합니다.

악화된다. 승객 버스가 20,30 및 50 대인 경우 어떻게됩니까? 각각의 연료는 서로 다른 양의 연료를 사용하지만 20과 30을 달리는 것보다 50을 달리는 것이 더 효율적입니다. 그러나 우리의 단 하나의 척도 (최소의 빈 좌석 수)에서 여객 여행.

또한 28 또는 39와 같은 이상한 숫자의 버스는 많은 지름길을 왜곡합니다.

따라서 상황의 복잡성에 따라 다음 두 가지 중 하나를 수행 할 수 있습니다.

첫째, 철저한 검색 트리 : 가능한 모든 버스 조합을 사용하십시오. 3 또는 4 개의 버스 크기 만있는 경우 이는 합리적인 솔루션 일 것입니다. 그렇지 않으면 Best fit 감소와 같은 결과는 합리적이지만 최적의 결과는 아닙니다.


이 답변이 왜 다운 투표되었는지 상상할 수 없습니다. 보상을지지합니다. 잘 했어.
David Conrad

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

고객 관점에서이 질문에 대답하겠습니다. 이 응용 프로그램에 대한 하드 코딩 된 알고리즘을 원하지 않습니다. 시간이지나면서 변할 수있는 변수가 너무 많습니다. 버스에 대해서는 아무것도 변하지 않을 수 있지만 요인의 무게가 변하거나 내가 생각하지 못한 새로운 요인이 발견 될 수 있습니다 (예 : 초과 근무, 법률 및 기타 운전자 비용).

이로 인해 요청 된 승객 수의 범위에 따라 자체 조회 테이블을 만들 수 있기를 원하며 최상의 버스 조합을위한 고유 한 설정을 만들려고합니다. 예 : 31-50 = 1 X 50, 51-60 = 2 X 30. 실제로 계산해야합니까? 시트, 가스 및 드라이버를 고려한 여러 공식보다 설정을 쉽게 변경할 수 있습니다. 가장 좋은 조합을 찾아서 완료하고 사용자가 원하는대로 이러한 설정을 변경할 수있는 충분한 공간이 있어야합니다.

새로운 요소가 발견 될 수있었습니다. 버스가 클수록 통행료가 기하 급수적으로 높아 집니까? 30 명 이상의 버스 운전사에게 추가 인증 및 라이센스에 관한 새로운 법률이 올라갈 때 소형 버스를위한 저렴한 드라이버를받을 수 있습니까?

공식과 다른 논리를 가진 새로운 컨설턴트를 고용하고 앱을 다시 작성해야 할 수도 있습니다. 주차 비용을 고려해야합니까?


작동하지 않습니다 : 31-50 = 50 석 버스. 다른 그룹에 사용되지 않거나 서비스를받지 않거나 다른 이유로 이용할 수없는 경우를 제외하고. 15 명의 50 인승 버스가있는이 버스 회사는 한 번에 여러 고객을 보유 할 가능성이 높습니다.
MSalters 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.