Tambahan di bawah ini, menjelaskan persyaratan :k(k−1)
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}.(n−1k)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 dankk−1k−1k−1(k−1)(k−2)(k−1)(k−2)k(k−1)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(k−1)nknO(k)k−1O(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.