Bunu Seyahat Eden Satıcı Sorunu ile karşılaştıran diğer herkes muhtemelen sorunuzu dikkatlice okumamıştır. TSP'de amaç, tüm köşeleri ziyaret eden en kısa döngüyü bulmaktır (bir Hamilton döngüsü) - bu, her düğümün "zorunluluk" olarak etiketlenmesine karşılık gelir .
Sizin durumunuzda, yalnızca bir düzine 'zorunluluk' olarak etiketlenmiş ve bu 12 verilmiş! oldukça küçüktür (479001600), sadece 'zorunlu geçiş' düğümlerinin tüm permütasyonlarını deneyebilir ve bu sırayla 'zorunlu geçiş' düğümlerini ziyaret eden 'başlangıçtan' sona 'en kısa yola bakabilirsiniz - basitçe bu listedeki her iki ardışık düğüm arasındaki en kısa yolların birleştirilmesi.
Başka bir deyişle, önce her bir köşe çifti arasındaki en kısa mesafeyi bulun (Dijkstra'nın algoritmasını veya diğerlerini kullanabilirsiniz, ancak bu küçük sayılarla (100 düğüm), kodlaması en basit Floyd-Warshall algoritması bile zamanında çalışacaktır). Sonra, bunu bir tabloya koyduğunuzda, 'zorunlu geçiş' düğümlerinizin tüm permütasyonlarını ve geri kalanını deneyin.
Bunun gibi bir şey:
//Precomputation: Find all pairs shortest paths, e.g. using Floyd-Warshall
n = number of nodes
for i=1 to n: for j=1 to n: d[i][j]=INF
for k=1 to n:
for i=1 to n:
for j=1 to n:
d[i][j] = min(d[i][j], d[i][k] + d[k][j])
//That *really* gives the shortest distance between every pair of nodes! :-)
//Now try all permutations
shortest = INF
for each permutation a[1],a[2],...a[k] of the 'mustpass' nodes:
shortest = min(shortest, d['start'][a[1]]+d[a[1]][a[2]]+...+d[a[k]]['end'])
print shortest
(Tabii ki bu gerçek kod değil ve gerçek yolu istiyorsanız, hangi permütasyonun en kısa mesafeyi verdiğini ve ayrıca tüm çiftlerin en kısa yollarının ne olduğunu takip etmeniz gerekir, ancak fikri anladınız.
Herhangi bir makul dilde en fazla birkaç saniye içinde çalışacaktır :)
[Düğümleriniz ve k 'zorunluluk' düğümleriniz varsa, çalışma süresi Floyd-Warshall bölümü için O (n 3 ) ve O (k! N ) tüm permütasyonlar bölümü için ve gerçekten kısıtlayıcı kısıtlamalarınız yoksa 100 ^ 3 + (12!) (100) pratik olarak fıstıktır.]