Kompleksitas waktu dari algoritma Held-Karp untuk TSP


9

Ketika saya melihat melalui " Pendekatan Pemrograman Dinamis untuk Masalah Sequencing " oleh Michael Held dan Richard M. Karp, saya datang dengan pertanyaan berikut: mengapa kompleksitas algoritma mereka untuk TSP adalah (hlm. 199), maksud saya kemana mereka mengambil faktor ? Jika saya mengerti benar berarti jumlah penambahan untuk setiap himpunan bagian kota. Lalu mengapa setiap operasi Selain itu digabungkan dengan tidak saya operasi? Saya kira itu terhubung entah bagaimana untuk mengambil minimum, tetapi komputasi minimum tampaknya tidak memerlukan banyak operasi.(k=2n1k(k1)(n1k))+(n1)kk1k

Algoritma pemrograman dinamis oleh Held dan Karp dan secara independen Bellman berjalan sebagai berikut: untuk setiap pasangan , artinya jalur yang melewati , semua elemen dan berakhir di menghitung(S,ci)c1Sci

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

dimana berarti jarak antara kota dan . Kemudian pada formula dari kertas berarti ukuran .d(cj,ci)cjcikS

Jawaban:


5

Tambahan di bawah ini, menjelaskan persyaratan :k(k1)

Jadi, jika Anda memeriksa istilah dalam ekspresi, Anda dapat membayangkan (sebagai analogi) istilah adalah enumerasi dari semua string biner yang mengandung 1 yang memiliki 1 di posisi pertama. Dengan kata lain, kita membiarkan setiap posisi dalam string biner mewakili pilihan apakah salah satu dari kota dalam masalah berada dalam subset persis yang kita pertimbangkan pada saat itu. Jadi, untuk 5 kota, 10101 sesuai dengan subset {1,3,5}.(n1k)kn

Jadi, untuk menghitung semua subset dari {1, ..., }, kita cukup menghitung melalui setiap subset biner (yaitu menghitung melalui string biner) dengan ukuran = 2 (yaitu string biner dengan ukuran yang berisi dua 1), kemudian size = 3, lalu size = 4, ... lalu size = n. (Perhatikan bahwa ukuran = 1 himpunan bagian harus berisi hanya kota pertama, dan dengan demikian tidak relevan untuk menghitung jarak parsialnya, karena jarak dari 1 -> semua kota lain di himpunan bagian -> 1 persis 0.)nn

Pada setiap himpunan bagian dengan kota , kita harus mempertimbangkan hingga jalur parsial kandidat. Secara khusus, jalur optimal dan total dapat melintasi seluruh subset yang diberikan dan berakhir di salah satu kota , tidak termasuk kota pertama. Kemudian, untuk setiap kandidat sub-jalur, kami menghitung tur optimal hingga titik tersebut sebagai minimum dari yang sebelumnya, ukuran = sub-jalur ditambah jarak dari kota terminal untuk sub-jalur tersebut ke kota terminal untuk sub-jalur kandidat saat ini. Ini memberi perbandingan yang harus kita buat. Perbedaan antara istilah dankk1k1k1(k1)(k2)(k1)(k2)k(k1)Istilah dalam analisis yang dikaitkan adalah perbedaan notasi (saya akan menjumlahkan pada rentang yang berbeda, mengingat definisi saya tentang daripada yang mereka lakukan). Paling tidak, bagaimanapun, itu harus menggambarkan kompleksitas urutan kuadrat dari istilah itu.k


Betapa menarik - Saya baru saja menyelesaikan pengkodean algoritma yang tepat ini dalam C ++ beberapa menit yang lalu. (Jadi maafkan garis singgung dari teori murni ke dalam sedikit diskusi praktis. :))

Biayanya waktu dan ruang - setidaknya di bawah implementasi saya. Namun secara praktis, ketika kebutuhan ruang Anda tumbuh secepat itu, mereka menjadi jauh lebih menyakitkan daripada persyaratan waktu. Sebagai contoh, pada PC saya (dengan 4 GB RAM), saya dapat memecahkan contoh dengan hingga 24 kota - lebih dari itu, dan saya kehabisan memori.O(2nn2)O(2nn)

Tentu saja, saya bisa saja menjadi programmer yang buruk, dan Anda mungkin bisa melakukan lebih baik daripada saya dalam praktik. :)

Sunting: Sedikit lebih spesifik pada satu detail dari pertanyaan Anda: Istilah berasal dari fakta bahwa Anda harus, dalam kasus terburuk, menghitung jarak parsial, optimal dari subset sebelumnya (paling banyak ada dari mereka; catatan bahwa dijumlahkan lebih dalam analisis Anda terhubung) dengan yang sekarang. Ini membutuhkan, sekali lagi dalam kasus terburuk, perbandingan dengan himpunan bagian ukuran untuk total .k(k1)nknO(k)k1O(k2)

Juga, jika penjelasan saya tidak cukup jelas, berikut adalah beberapa catatan kuliah yang bagus dari Vazirani ( PDF ). Gulir ke bawah ke P. 188 untuk diskusi tentang TSP, termasuk analisis Held-Karp.


Oh tentu! Saya merasa konyol memikirkan hal itu sekarang; Saya akan memperbarui jawaban saya. Saya benar-benar mendengar komentar yang tepat sebelumnya, dan hanya meneruskannya tanpa memikirkannya. Dan yeah - menulis ke file / membaca dari file akan membuat Anda pergi secara efektif pergi tinggi pada jumlah kota. ... itu juga rasa sakit yang tidak perlu dikhawatirkan kecuali jika Anda mencoba untuk memecahkan kasus TSP untuk tujuan nyata. Punyaku jelas bukan untuk tujuan praktis. ;)
Daniel Apon

2
Saatnya mengimplementasikan algoritma Bjorklund :)
Suresh Venkat

@ Suresh: Ide bagus!
Daniel Apon

@Daniel Apon Bisakah Anda menjelaskan mengapa kita membutuhkan perbandingan saat menghitung "jarak parsial dan optimal"?
Oleksandr Bondarenko

@Olexandr: Tentu, saya akan menambahkannya ke atas jawaban saya.
Daniel Apon

0

Catatan utama

Penting untuk dicatat bahwa kami menghitung dan menyimpan bukan
"jarak jalur optimal untuk combination of k cities"
tetapi
"jarak jalur optimal untuk combination of k cities DAN untuk end-point city from this combination".
Memahami hal itu akan membantu makna dua pengganda pertama dalam rumus berikut.

Fase pertama

Jumlah operasi pada fase pertama adalah:

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

Superskrip yang hilang berarti jumlah for all k>=2 that is valid for binomial coefficient. Jadi jangka waktu penjumlahan bukan nol yang berlaku yang terakhir adalah untuk Ini berarti bahwa jumlah kami tidak menangkap pilihan terakhir kota untuk terhubung ke kota pertama. Ada kota yang terhubung ke kota pertama. Jadi akhirnya kita akan menambahkan istilah ini ke penjumlahan.k=n1

(n1n2)(n2)1
n1

Biarkan mengubah rumus menjadi bentuk yang Anda berikan yang juga ada di halaman Wikipedia Held-Karp .

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)
Memanipulasi koefisien binomial mengarah ke: Jadi jumlah operasi di pertama fase adalah
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)

Fase kedua

Fase kedua adalah memulihkan jalur optimal dengan tanda yang telah kami buat di fase pertama bersamaan dengan jarak komputasi.

Untuk setiap jalur optimal "untuk combination of k cities DAN untuk end-point city from this combination" kami telah menyimpan kota kedua hingga terakhir.

Untuk menelusuri jalur optimal kita perlu meminta beberapa struktur data untuk mengembalikan kota kedua-ke-terakhir "untuk combination of k cities DAN untuk end-point city from this combination". Jadi struktur data ini harus seperti
Map<combination of k cities, Map<last city, second-to-last city>>. Sebagai indeks combination of k citieskita dapat menggunakan, misalnya binary_string[city id]=1 if city id is in combination,. Jadi kita perlu melihat semua elemen combination of k citiesuntuk mengidentifikasi kombinasi dan mengindeks struktur data kita. Ini memberi kita jumlah operasi untuk fase kedua:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.