Часова складність алгоритму Холд-Карпа для TSP


9

Коли я переглянув " Підхід до динамічного програмування до послідовних проблем " Майкла Холда та Річарда М. Карпа, я поставив таке питання: чому складність їх алгоритму для TSP становить (k=2n1k(k1)(n1k))+(n1) (стор. 199), я маю на увазі, звідки вони беруть коефіцієнт k ? Якщо я правильно зрозумів, k1 означає кількість доповнень для кожної підмножини міст. Тоді чому кожна операція додавання поєднується з невідомими мені k операціями? Я припускаю, що це якось пов'язано з мінімумом, але обчислювальний мінімум не вимагає такої кількості операцій.

Алгоритм динамічного програмування Held і Karp і незалежно Беллман працює наступним чином: для кожної пари (S,ci) , що означає шлях, що проходить через c1 , всі елементи S і закінчуються при обчисленні ci

OPT[S,ci]=min{OPT[S{ci},cj]+d(cj,ci):cjS{ci}},

де d(cj,ci) означає відстань між містами cj і ci . Тоді у формулі з паперу k означає розмір S .

Відповіді:


5

Додаток нижче, що роз'яснює умови k(k1) :

Отже, якщо вивчити терміни у виразі, ви можете передбачити (як аналогія) термін - це перерахування всіх бінарних рядків, що містять 1, які мають перше положення 1. Іншими словами, ми дозволяємо кожній позиції у двійковому рядку відображати вибір того, чи є одне із яти міст у задачі в тому саме підмножині, яке ми розглядаємо на той час. Так, для 5 міст 10101 відповідає підмножині {1,3,5}.(n1k)kn

Таким чином, для обчислення всіх підмножин {1, ..., }, ми просто підраховуємо кожне двійкове підмножина (тобто рахуємо через двійкові рядки) розміру = 2 (тобто двійкові рядки розміром які містять два 1-х), то size = 3, тоді розмір = 4, ... тоді розмір = n. (Зверніть увагу, що підмножина size = 1 повинна містити лише перше місто, і тому неважливо обчислити його часткове відстань, оскільки відстань від 1 -> у всіх інших містах підмножини -> 1 рівно 0.)nn

У кожній підмножині з містами ми повинні враховувати до кандидат-оптимальні, часткові шляхи. Зокрема, оптимальний, сумарний шлях міг би пройти через даний підмножина і закінчитись у будь-якому з міст , виключаючи перше місто. Тоді для кожного такого підпункту-кандидата ми обчислюємо оптимальний тур до цього моменту як мінімум будь-якого з попередніх, шлях розміру = плюс відстань від міста-термінала для цього під-шляху до місто-термінал для поточного кандидата в під-шлях. Це дає такі порівняння, які ми повинні зробити. Невідповідність між моїм терміном іkk1k1k1(k1)(k2)(k1)(k2)k(k1)Термін у пов'язаному аналізі - це нотаційна різниця (я б підсумував інший діапазон, враховуючи моє визначення ніж вони). Принаймні, однак, це має ілюструвати складність цього терміна у квадратичному порядку.k


Як цікаво - я щойно закінчив кодування цього точного алгоритму в С ++ кілька хвилин тому. (Тож пробачте дотичну від чистої теорії до невеликої практичної дискусії. :))

Це коштує часу та простору - принаймні під мою реалізацію. Практично кажучи, коли ваші потреби в просторі зростають так швидко, вони стають набагато болючішими, ніж вимоги часу. Наприклад, на моєму ПК (з 4 ГБ оперативної пам’яті) я можу вирішувати екземпляри до 24 міст - більше того, і мені не вистачає пам’яті.O(2nn2)O(2nn)

Звичайно, я можу бути просто поганим програмістом, і ти можеш зробити це краще, ніж я на практиці. :)

Редагувати: Трохи більше конкретики щодо однієї деталі вашого запитання: Термін випливає з того, що вам доведеться, в гіршому випадку, обчислити часткове, оптимальне відстань від попередніх підмножин (є щонайбільше з них, зазначимо , що підсумовується по в аналізі ви пов'язані) з поточної. Це вимагає, знову ж таки, у гіршому випадку порівняння з підмножинами розміру на загальну суму .k(k1)nknO(k)k1O(k2)

Крім того, якщо моє пояснення було недостатньо зрозумілим, ось декілька приємних конспектів лекцій Вазірані ( PDF ). Прокрутіть униз до P. 188, щоб обговорити TSP, включаючи аналіз Холда-Карпа.


О, звичайно! Мені зараз дурно думати про це; Я оновлю свою відповідь. Я насправді чув цей точний коментар раніше, і просто передав його, не замислюючись над цим. І так - запис у файл / читання з файлу дозволить вам ефективно перейти довільно високу кількість міст. ... це також біль, про яку не варто хвилюватися, якщо ви не намагаєтеся вирішити випадки TSP з реальною метою. Шахта була вирішена не з практичної мети. ;)
Даніель Апон

2
Час на реалізацію алгоритму Бьорклунда :)
Суреш Венкат

@Suresh: Гарна ідея!
Даніель Апон

@Daniel Apon Не могли б ви уточнити, для чого нам потрібні порівняння при розрахунку "часткової, оптимальної відстані"?
Олександр Бондаренко

@Oleksandr: Звичайно, я додам це до своєї відповіді.
Даніель Апон

0

Головна примітка

Важливо зазначити, що ми обчислюємо та зберігаємо не
"відстань оптимального шляху для combination of k cities",
а
"відстань оптимального шляху для combination of k cities AND для end-point city from this combination".
Зрозуміти це допоможе значення двох перших множників у наступній формулі.

Перша фаза

Кількість операцій на першій фазі становить:

k>=2(n1k1)choose city combinationof size = k1(k1)choose city to be the lastfrom k1 citiesin chosen combination((n1)(k1))choose citythat is not in chosen combinationto add to path

Пропущений супріск у сумі означає for all k>=2 that is valid for binomial coefficient. Отже, останній недійсний термін суми буде для Це означає, що наша сума не враховує останніх варіантів міста для підключення до першого міста. Існує міст для підключення до першого міста. Тож нарешті ми додамо цей термін до суми.k=n1

(n1n2)(n2)1
n1

Дозвольте формулі перетворення у форму, яку ви надаєте, яка також знаходиться на сторінці Вікіпедії Хелд-Карпа .

k>=2(n1k1)(k1)((n1)(k1))=k>=2(n1)!(k1)!(nk)!(k1)(nk)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n1k)k(k1)
Маніпулювання двочленними коефіцієнтами призводить до: Отже, кількість операцій у першому фаза -
k>=2(n1k)k(k1)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n3)!(k2)!(n3(k2))!(n1)(n2)=(n1)(n2)k>=2(n3k2)=(n1)(n2)2n3
(n1)(n2)2n3+(n1)

Друга фаза

Друга фаза - це відновлення оптимального шляху за позначками, які ми пройшли в першій фазі одночасно з обчислювальними відстанями.

Для кожного оптимального шляху "для combination of k cities І для end-point city from this combination" ми зберегли місто, що перебуває за останнім часом.

Для зворотного відстеження оптимального шляху нам потрібно попросити деяку структуру даних, щоб повернути місто, що перебуває за останнім "" для combination of k cities AND для end-point city from this combination". Тож ця структура даних повинна бути чимось на зразок
Map<combination of k cities, Map<last city, second-to-last city>>. Як показник combination of k citiesми можемо використовувати, наприклад, binary_string[city id]=1 if city id is in combination. Тому нам потрібно переглянути всі елементи, combination of k citiesщоб визначити комбінацію та індексувати нашу структуру даних. Це дає нам кількість операцій для другої фази:

k>=2n1k=(n)(n1)21

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.