Ефективне завантаження шини


10

Це я щось давно робив для туристичної компанії, і я ніколи не був задоволений результатами. Я недавно думав про той старий проект і думав, що перегляну цю проблему.

Проблема:

Туристична компанія має кілька автобусів різної пасажирської місткості (наприклад, 15 50 пасажирських автобусів, 25 30 пасажирських автобусів ... тощо). Вони спеціалізувалися на пропонуванні перевезень дуже великим групам (300+ пасажирів на групу). Оскільки кожній групі потрібно подорожувати разом, їм потрібно було ефективно керувати своїм флотом, щоб зменшити кількість відходів.

Наприклад, 88 пасажирів краще обслуговувати три автобуси на 30 пасажирів (2 вільних місця), ніж два автобуси на 50 пасажирів (12 вільних місць). Інший приклад: 75 пасажирів краще обслуговуватимуть один автобус на 50 пасажирів та один автобус на 30 пасажирів, це комбінація типів.

Який хороший алгоритм для цього?


3
Не бути прискіпливим, але я б підозрював з точки зору автобусної компанії, 2 50 пасажирських автобусів були б ефективнішими, оскільки витрати на газ йдуть лише на два автобуси замість 3. Отже, це насправді, як ви це зробили?
Данк

8
Це звучить як проблема з рюкзаком , який є важким для NP. На практиці ваш пошуковий простір для певного маршруту повинен бути досить малим.
chrisaycock

@Dunk - Я першим визнаю, що не маю уявлення про автобусну та туристичну логістику, але це була їхня вимога. У них навіть був високооплачуваний консультант, який робив це вручну.
Запуск системи

Вільні місця не мають значення, на що рахуються операційні витрати. Таким чином подивіться на відповідь філосодаду.
Лорен Печтел

@LorenPechtel - Як я вже говорив раніше, я не диктую ділові правила, я просто їх виконую.
Запуск системи

Відповіді:


8

Це (на зразок) приклад проблеми з упаковкою у смітник, яку часто плутають із проблемою рюкзака. У упаковці для сміття у вас є баки певної ємності, і ви намагаєтесь розподілити об'єкти різного розміру в бункери. Ідея полягає у використанні якомога меншої кількості бункерів.

Ви точно не намагаєтеся мінімізувати кількість бункерів, хоча намагаєтесь мінімізувати кількість вільних місць. І не виключено, що ви намагаєтеся мінімізувати кількість порожніх місць на флоті, тобто у вас є чотири туристичні групи різного розміру, і ви хочете розмістити всіх з найменшою кількістю вільних місць. Я не можу придумати екземпляр прямо з кажана, але я думаю, що можливо було б побудувати флот і набір тур-груп таким, щоб вам було краще з нестандартним рішенням для якоїсь групи, оскільки це дозволило вам уникнути використовуючи ще гірше рішення для якоїсь іншої групи.

Погіршується. Що робити, якщо у вас є 20,30 та 50 пасажирських автобусів. Кожен з них використовує різну кількість палива, але ефективніше бігати на 50, ніж на 20 та 30. Але з нашого єдиного заходу (найменша кількість вільних місць) є сенс бігати або за 50 туристичний тур.

Крім того, автобуси із дивними номерами, як-от 28 чи 39, перекривили б багато наших ярликів.

Отже, залежно від складності ситуації, ви можете зробити одне з двох:

По-перше, і вичерпне дерево пошуку: використовуйте всі можливі комбінації автобусів. Якщо у вас є лише 3 або 4 розміри шини, це, ймовірно, розумне рішення. Інакше щось на зразок зменшення найкращого пристосування дасть розумні, але не оптимальні результати.


Я не уявляю, чому ця відповідь була спростована. Прохання про компенсацію. Молодці.
Девід Конрад

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 автобусів, якщо вони вже використовуються для інших груп, або не працюють, або недоступні з інших причин. Автобусна компанія з питання, з 15 автобусами на 50 пасажирів, швидше за все, матиме декількох клієнтів одночасно.
MSalters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.