Ramificação e limite para disposição linear mínima

7

Estou tentando resolver esse problema de ramificação e limite, mas não consegui encontrar nenhuma função de custo aproximado que seja melhor que o custo.

Digamos G é um gráfico de n nós {1,2,3,,n}. Para uma permutaçãof dos nós de G, o peso de cada aresta (x,y) será |f(x)f(y)|. O peso total deGserá a soma dos pesos de suas arestas. Você pode pensar emf como uma remarcação dos nós de G, Onde f(x) é o novo rótulo do nó x.

Estou tentando encontrar uma permutação f que resulta em um peso total mínimo de G.

Agora, tentando resolver isso, tudo o que pude encontrar é encontrar o custo aproximado que é a soma dos pesos de cada borda concluída até agora (para cada nó da árvore de retorno) e prosseguir a partir do nó de custo mínimo. Gostaria de saber se alguém pode me ajudar com uma melhor fórmula de aproximação.

Bibek Bhattarai
fonte
Formulação alternativa: para organizar os vértices de forma que, na matriz adjacente, a maioria dos 1s esteja perto da diagonal.
Karolis Juodelė

Respostas:

5

Uma das melhores soluções é provavelmente baseada em um relaxamento de programação linear ou programação . Para o último, a ramificação e o retorno serão implícitos, e você não precisará gerenciá-lo.

Eu já vi isso resolvido de duas maneiras usando essa técnica. Também podemos melhorar um pouco o seu algoritmo de delimitação.

O método do livro didático

Usando variáveis ​​binárias xEuj representando f(Eu)=j, você pode definir variáveis ​​contínuas f(Eu)=j=1 1njxEuj

Adicionar restrições EuxEuj=1 1 e jxEuj=1 1 representando que uma posição recebe um e apenas um nó.

Para cada borda, o custo ce tem duas restrições: cef(Eu)-f(j) e cef(j)-f(Eu)e você deseja minimizar ece

Você pode dar esse problema a um solucionador de programação inteiro, que ficará feliz em fazer o retorno para você e muito mais - ou você pode resolver o relaxamento da programação linear a cada vez (apenas se quiser aprender, o solucionador o otimiza internamente).

Outro relaxamento

Em vez de usar as posições como variáveis ​​binárias, você pode usar f(Eu)<f(j) ie nó Eu vai antes do nó j. Isso é mais adaptado se você deseja fazer a ramificação por conta própria e não especificar essas variáveis ​​explicitamente.

Com essa abordagem, às vezes você pode ter um problema mais rápido para resolver em cada nó - aqui ele pode ser resolvido como um problema mais simples de fluxo de custo mínimo, como mostra este documento . Eu não recomendo, a menos que você esteja disposto a investigar muito tempo e pesquisar seu problema.

Outras técnicas

Para ramificação e limite, qualquer limite inferior na sua função de custo será suficiente. Para pequenos problemas, sua abordagem delimitadora é perfeitamente adequada.

Você poderia torná-lo mais rígido: para cada aresta com um nó não colocado, escolha a melhor etiquetagem livre possível para estimar seu custo. Várias arestas podem usar o mesmo posicionamento para nós diferentes, mas isso será melhor do que estimar o custo como 0.

Há muitas variações possíveis nesse esquema: escolha a melhor etiqueta livre para cada nó não rotulado (independentemente de sobreposições) ou considere sobreposições apenas dentro de pequenos grupos de nós.

Gabriel Gouvine
fonte