Adendo abaixo, esclarecendo os termos :k(k−1)
Portanto, se você examinar os termos da expressão, poderá visualizar (como analogia) o termo é uma enumeração de todas as cadeias binárias que contêm 1 que possuem 1 na primeira posição. Em outras palavras, deixamos que cada posição na cadeia binária represente a escolha de se uma determinada cidades no problema está no subconjunto exato que estamos considerando no momento. Portanto, para 5 cidades, 10101 corresponde ao subconjunto {1,3,5}.(n−1k)kn
Assim, para calcular todos os subconjuntos de {1, ..., }, simplesmente contamos através de cada subconjunto binário (ou seja, contamos com cadeias binárias) de tamanho = 2 (ou seja, cadeias binárias de tamanho que contêm dois 1s), então size = 3, size = 4, ... size = n. (Observe que o subconjunto size = 1 deve conter apenas a primeira cidade e, portanto, é irrelevante calcular sua distância parcial, pois a distância de 1 -> todas as outras cidades do subconjunto -> 1 é exatamente 0.)nn
Em cada subconjunto com cidades, temos que considerar até caminhos parciais ótimos para candidatos. Especificamente, o caminho ideal ideal total poderia atravessar o subconjunto especificado e terminar em qualquer uma das cidades , excluindo a primeira cidade. Em seguida, para cada subcaminho candidato, calculamos o passeio ideal até esse ponto como o mínimo de qualquer dos subcaminhos size = anteriores, mais a distância da cidade terminal desse subcaminho até o cidade terminal para o atual subcaminho candidato. Isso fornece as comparações que devemos fazer. A discrepância entre o meu termo e okk−1k−1k−1(k−1)(k−2)(k−1)(k−2)k(k−1)O termo na análise vinculada é uma diferença notacional (eu somaria em um intervalo diferente, dada minha definição de que eles). No mínimo, porém, deve ilustrar a complexidade de ordem quadrática desse termo.k
Que interessante - eu acabei de codificar esse algoritmo exato em C ++ há alguns minutos atrás. (Então, perdoe a tangente da teoria pura em uma pequena discussão prática. :))
Custa tempo e espaço - pelo menos na minha implementação. Na prática, porém, quando seus requisitos de espaço crescem tão rápido, eles se tornam muito mais dolorosos do que os requisitos de tempo. Por exemplo, no meu PC (com 4 GB de RAM), posso resolver instâncias com até 24 cidades - mais do que isso, e fico sem memória.O(2nn2)O(2nn)
É claro que eu poderia ser um péssimo programador e você poderá fazer melhor do que eu na prática. :)
Edit: Um pouco mais de detalhes sobre um detalhe da sua pergunta: O termo vem do fato de que, no pior caso, você deve calcular a distância parcial ideal dos subconjuntos anteriores (há no máximo deles; observe que é somado sobre na análise que você vinculou) à análise atual. Isso requer, novamente no pior caso, comparações com subconjuntos de tamanho para um total de .k(k−1)nknO(k)k−1O(k2)
Além disso, se minha explicação não foi clara o suficiente, aqui estão algumas notas de aula agradáveis de Vazirani ( PDF ). Role até a página 188 para uma discussão sobre TSP, incluindo uma análise de Held-Karp.
Nota principal
É importante observar que computamos e não armazenamos
"distância do caminho ideal para
combination of k cities
",mas
"distância do caminho ideal para
combination of k cities
AND paraend-point city from this combination
".Compreender isso ajudará no significado dos dois primeiros multiplicadores na fórmula a seguir.
Primeira fase
O número de operações na primeira fase é:∑k>=2(n−1k−1)choose city combinationof size = k−1⋅(k−1)choose city to be the lastfrom k−1 citiesin chosen combination⋅((n−1)−(k−1))choose citythat is not in chosen combinationto add to path
Sobrescrito ausente na soma significak=n−1
(n−1n−2)⋅(n−2)⋅1 n−1
for all k>=2 that is valid for binomial coefficient
. Portanto, o último termo válido não nulo da soma será para Isso significa que nossa soma não captura as últimas opções da cidade para se conectar à primeira cidade. Existem cidades para se conectar à primeira cidade. Então, finalmente, adicionaremos esse termo à soma.Deixe transformar a fórmula para formar o que você fornece, que também está na página da Held-Karp Wikipedia .
Segunda fase
A segunda fase é restaurar o caminho ideal por marcas que fizemos na primeira fase simultaneamente com as distâncias de computação.
Para cada caminho ideal "para
combination of k cities
E paraend-point city from this combination
", salvamos a penúltima cidade.Para voltar ao caminho ideal, precisamos solicitar alguma estrutura de dados para retornar a penúltima cidade "para
∑k>=2n−1k=(n)(n−1)2−1
combination of k cities
AND paraend-point city from this combination
". Portanto, essa estrutura de dados deve ser algo parecidoMap<combination of k cities, Map<last city, second-to-last city>>
. Como índice decombination of k cities
podemos usar, por exemplobinary_string[city id]=1 if city id is in combination
,. Portanto, precisamos examinar todos os elementoscombination of k cities
para identificar combinações e indexar nossa estrutura de dados. Isso nos fornece o número de operações para a segunda fase:fonte