TSP için Held-Karp algoritmasının zaman karmaşıklığı


9

Michael Held ve Richard M. Karp tarafından " Sıralama Sorunlarına Dinamik Programlama Yaklaşımı " konusuna baktığımda , şu soruyu buldum: TSP için algoritmalarının karmaşıklığı neden (s. 199), yani faktörünü nereden alıyorlar ? Doğru anladıysam , her bir şehir alt kümesi için toplama sayısı anlamına gelir. O zaman neden her ekleme işlemi bana bilinmeyen ile birleştirilmiştir operasyonlar? Bir şekilde minimum almakla bağlantılı olduğunu düşünüyorum, ancak minimum hesaplamak bu kadar çok işlem gerektirmiyor gibi görünüyor.(k=2n1k(k1)(n1k))+(n1)kk1k

Aşağıdaki gibi elde tutulan ve Karp ve bağımsız bir şekilde, Bellman koşuyla dinamik programlama algoritması: her çifti için geçmekte bir yol anlamına , tüm elemanları ve son bulan bilgi işlem(S,ci)c1Sci

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

burada , c_j ve c_i şehirleri arasındaki mesafe anlamına gelir . Sonra k kağıttan formülde S boyutu anlamına gelir .d(cj,ci)cjcikS

Yanıtlar:


5

Aşağıdakine ek, k(k1) terimlerini açıklar:

Dolayısıyla, ifadedeki terimleri incelerseniz, (benzetme olarak) terimini, ilk konumda 1 olan 1'leri içeren tüm ikili dizelerin numaralandırması olarak hayal edebilirsiniz . Başka bir deyişle, ikili dizgideki her bir konumun, sorundaki şehirden birinin o sırada düşündüğümüz tam alt kümede olup olmadığının seçimini temsil etmesine izin veriyoruz. Yani, 5 şehir için 10101 {1,3,5} alt kümesine karşılık gelir.(n1k)kn

Bu nedenle, {1, ..., } ' nin tüm alt kümelerini hesaplamak için , size = 2 boyutundaki her bir ikili alt kümeyi (yani, ikili dizeleri saymak) sayarız (yani , iki 1 içeren iki boyutlu . boyut = 3, sonra boyut = 4, ... sonra boyut = n. (Size = 1 altkümesinin yalnızca ilk şehri içermesi gerektiğini ve bu nedenle kısmi mesafesini hesaplamanın önemsiz olduğunu unutmayın, çünkü 1 -> alt kümedeki diğer tüm şehirler -> 1 tam olarak 0'dır.)nn

şehirleri olan her alt kümede , aday-optimal, kısmi yollar düşünmeliyiz . Özellikle, optimal, toplam yol verilen alt küme boyunca akla gelebilir ve ilk şehir hariç şehirlerinden herhangi birine ulaşabilir . Daha sonra, bu tür her aday alt yol için, o noktaya kadar en uygun turu, önceki = alt yollarından herhangi birinin minimum değeri artı o alt yol için terminal şehirden uzaklığı hesaplıyoruz . geçerli aday alt yolu için terminal şehir. Bu, yapmamız gereken bu tür karşılaştırmaları verir. Benim terimim ile arasındaki tutarsızlıkkk1k1k1(k1)(k2)(k1)(k2)k(k1)bağlantılı analizdeki terim notasyonel bir farktır ( tanımımdan onlardan farklı bir aralıkta toplanırım). Bununla birlikte, en azından, bu terimin ikinci dereceden düzen karmaşıklığını göstermelidir.k


Ne kadar ilginç - birkaç dakika önce bu tam algoritmayı C ++ ile kodlamayı bitirdim. (Bu yüzden, teğeti saf teoriden biraz pratik tartışmaya bağışlayın. :))

zaman ve alan maliyeti - en azından benim uygulama altında. Ancak pratik olarak, alan gereksinimleriniz bu kadar hızlı büyüdüğünde, zaman gereksinimlerinden çok daha acı verici hale gelirler. Örneğin, bilgisayarımda (4 GB RAM ile) 24 şehre kadar olan örnekleri çözebilirim - bundan daha fazlası ve hafızam bitti.O(2nn2)O(2nn)

Tabii ki, ben sadece kötü bir programcı olabilirim ve pratikte benden daha iyisini yapabilirsin. :)

Düzenleme: Sorunuzun bir detayı hakkında biraz daha ayrıntılı bilgi: terimi, en kötü durumda, önceki alt kümelerden kısmi, optimal mesafeyi hesaplamanız gerektiğinden gelir (en fazla Bunlardan ; bağlantı verdiğiniz analizde ile toplandığını unutmayın ). Bu, yine en kötü durumda, toplam için boyutundaki alt kümelerle karşılaştırmasını gerektirir .k(k1)nknO(k)k1O(k2)

Ayrıca, açıklamam yeterince açık değilse, Vazirani'nin bazı güzel ders notları ( PDF ). Held-Karp'ın bir analizi de dahil olmak üzere TSP tartışması için P.188'e gidin.


Oo elbette! Şimdi bunu düşünerek aptal hissediyorum; Cevabımı güncelleyeceğim. Aslında o tam yorumu daha önce duymuştum ve sadece düşünmeden aktarmıştım. Ve evet - bir dosyaya yazmak / bir dosyadan okumak, birçok şehirde keyfi olarak yüksek gitmenizi sağlar. ... TSP örneklerini gerçek bir amaç için çözmeye çalışmadığınız sürece endişelenmeye değmez bir acıdır. Benimki kesinlikle pratik bir amaç için değildi. ;)
Daniel Apon

2
Bjorklund algoritmasını uygulama zamanı :)
Suresh Venkat

@Suresh: İyi fikir!
Daniel Apon

@Daniel Apon "Kısmi, en uygun mesafeyi" hesaplarken neden karşılaştırmaya ihtiyacımız olduğunu kesin olarak söyleyebilir misiniz?
Oleksandr Bondarenko

@Oleksandr: Tabii, cevabımın üstüne ekleyeceğim.
Daniel Apon

0

Ana not


"İçin en uygun yolun mesafesini combination of k cities"
değil,
" combination of k cities VE için en uygun yolun mesafesini " hesapladığımızı ve sakladığımızı not etmek önemlidir end-point city from this combination.
Bunu anlamak, aşağıdaki formülde ilk iki çarpanın anlamına yardımcı olacaktır.

İlk etap

İlk aşamadaki işlem sayısı:

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

Toplamda üst simge eksik for all k>=2 that is valid for binomial coefficient. Dolayısıyla, son geçerli boş olmayan toplam terimi Bu, toplamımızın son seçimleri yakalamadığı anlamına gelir ilk şehre bağlanmak için şehir. Orada ilk şehre bağlamak için şehirler. Sonunda bu terimi toplayacağız.k=n1

(n1n2)(n2)1
n1

Formülü, sağladığınız forma dönüştürerek Held-Karp Wikipedia sayfasında da olsun .

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)
Binom katsayılarını değiştirmek şunlara yol açar: Yani ilk işlem sayısı faz
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)

İkinci aşama

İkinci aşama, hesaplama aşamalarıyla eşzamanlı olarak ilk aşamada yaptığımız işaretlerle en uygun yolu geri yüklemektir.

Her combination of k cities AND için end-point city from this combination" AND " için en uygun yol için ikinci-son şehri kurtardık.

Optimal yolu geri izlemek için bazı veri yapılarından ikinci ve son şehri "için combination of k cities VE için end-point city from this combination" döndürmesini istememiz gerekir . Yani bu veri yapısı böyle bir şey olmalı
Map<combination of k cities, Map<last city, second-to-last city>>. combination of k citiesÖrneğin, endeks olarak kullanabiliriz binary_string[city id]=1 if city id is in combination. Bu nedenle combination of k citieskombinasyonu tanımlamak ve veri yapımızı endekslemek için tüm öğelerine bakmamız gerekir . Bu bize ikinci aşama için işlem sayısını verir:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.