M15

Lidando com as Limitações de Poder Algorítmico

Branch and Bound

Backtracking

A ideia principal é construir soluções um componente por vez e avaliar tais candidatos parcialmente construídos como segue. Se uma solução parcialmente construída pode ser desenvolvida ainda mais sem violar as restrições do problema, isso é feito tomando a primeira opção legítima restante para o próximo componente. Se não houver uma opção legítima para o próximo componente, nenhuma alternativa para qualquer componente restante precisa ser considerada. Nesse caso, o algoritmo retrocede para substituir o último componente da solução parcialmente construída por sua próxima opção.

É conveniente implementar esse tipo de processamento construindo uma árvore de escolhas feitas, chamada de árvore de espaço de estados. Sua raiz representa um estado inicial antes do início da busca por uma solução. Os nós do primeiro nível na árvore representam as escolhas feitas para o primeiro componente de uma solução, os nós do segundo nível representam as escolhas para o segundo componente e assim por diante. Um nó em uma árvore de espaço de estado é considerado promissor se corresponder a uma solução parcialmente construída que ainda pode levar a uma solução completa; caso contrário, é chamado de não promissor. As folhas representam becos sem saída não promissores ou soluções completas encontradas pelo algoritmo. Na maioria dos casos, uma árvore de espaço de estados para um algoritmo de retrocesso é construída na forma de pesquisa em profundidade. Se o nó atual for promissor, seu filho será gerado adicionando-se a primeira opção legítima restante para o próximo componente de uma solução e o processamento será movido para esse filho. Se o nó atual revelar-se não promissor, o algoritmo volta ao pai do nó para considerar a próxima opção possível para seu último componente; se não houver essa opção, ele retrocede mais um nível na árvore e assim por diante. Finalmente, se o algoritmo chega a uma solução completa para o problema, ele para (se apenas uma solução for necessária) ou continua procurando por outras soluções possíveis.
Mais sobre o texto original

n-Queens Problem

Circuito Hamiltoniano

Soma de Subconjunto

O problema é colocar n rainhas em um tabuleiro de xadrez n × n de modo que duas rainhas não se ataquem por estarem na mesma linha, na mesma coluna ou na mesma diagonal.

Começamos com o tabuleiro vazio e, em seguida, colocamos a rainha 1 na primeira posição possível de sua linha, que está na coluna 1 da linha 1. Em seguida, colocamos a rainha 2, após tentar sem sucesso as colunas 1 e 2, na primeira posição aceitável para ele , que é o quadrado (2, 3), o quadrado na linha 2 e coluna 3. Isso prova ser um beco sem saída porque não há posição aceitável para a rainha 3. Então, o algoritmo retrocede e coloca a rainha 2 na próxima posição possível em (2, 4). Então a rainha 3 é colocada em (3, 2), o que prova ser outro beco sem saída. O algoritmo então retrocede todo o caminho até a rainha 1 e o move para (1, 2). A rainha 2 então vai para (2, 4), a rainha 3 para (3, 1) e a rainha 4 para (4, 3), o que é uma solução para o problema.

Sem perda de generalidade, podemos assumir que, se existe um circuito hamiltoniano, ele começa no vértice a. Conseqüentemente, tornamos o vértice a a raiz da árvore do espaço de estados. O primeiro componente de nossa solução futura, se existir, é um primeiro vértice intermediário de um circuito hamiltoniano a ser construído. Usando a ordem do alfabeto para quebrar o laço triplo entre os vértices adjacentes a a, selecionamos o vértice b. De b, o algoritmo avança para c, depois para d, depois para e e finalmente para f, o que prova ser um beco sem saída. Portanto, o algoritmo retrocede de f para e, depois para d e, em seguida, para c, o que fornece a primeira alternativa a ser seguida pelo algoritmo. Ir de c para e eventualmente se mostra inútil, e o algoritmo tem que retroceder de e para ce depois para b. A partir daí, ele vai para os vértices f, e, c e d, a partir dos quais pode legitimamente retornar a a, resultando no circuito hamiltoniano a, b, f, e, c, d, a. Se quiséssemos encontrar outro circuito hamiltoniano, poderíamos continuar esse processo retrocedendo a partir da folha da solução encontrada.
Mais sobre o texto origina

Encontre um subconjunto de um determinado conjunto A = {a1,. . . , an} de n inteiros positivos cuja soma é igual a um determinado inteiro positivo d. Por exemplo, para A = {1, 2, 5, 6, 8} e d = 9, existem duas soluções: {1, 2, 6} e {1, 8}. Claro, algumas instâncias desse problema podem não ter soluções.

A árvore de espaço de estado pode ser construída como uma árvore binária. A raiz da árvore representa o ponto de partida, sem decisões sobre os elementos fornecidos ainda. Seus filhos esquerdo e direito representam, respectivamente, inclusão e exclusão de a1 no conjunto que está sendo buscado. Da mesma forma, ir para a esquerda de um nó do primeiro nível corresponde à inclusão de a2, enquanto ir para a direita corresponde à sua exclusão, e assim por diante. Assim, um caminho da raiz para um nó no nível i da árvore indica qual dos primeiros i números foram incluídos nos subconjuntos representados por aquele nó. Registramos o valor de s, a soma desses números, no nó. Se s for igual ad, temos uma solução para o problema. Podemos relatar esse resultado e parar ou, se todas as soluções precisarem ser encontradas, continuar retrocedendo até o pai do nó.

Comparado ao backtracking, branch-and-bound requer dois itens adicionais:

uma maneira de fornecer, para cada nó de uma árvore de espaço de estado, um limite no melhor valor da função objetivo1 em qualquer solução que possa ser obtida adicionando outros componentes à solução parcialmente construída representada pelo nó

o valor da melhor solução vista até agora

Se esta informação estiver disponível, podemos comparar o valor limite de um nó com o valor da melhor solução vista até agora. Se o valor limite não for melhor do que o valor da melhor solução vista até agora - ou seja, não menor para um problema de minimização e não maior para um problema de maximização - o nó não é promissor e pode ser encerrado (algumas pessoas dizem que o ramo é " podado ”). Na verdade, nenhuma solução obtida a partir dele pode produzir uma solução melhor do que a que já está disponível. Essa é a ideia principal da técnica branch-and-bound.

Assignment Problem

Knapsack Problem

Travelling Salesman Problem

Trata-se de atribuir n trabalhos a n pessoas, de tal forma que o custo disso seja o menor possível

Trata-se do seguinte problema: dados n itens de peso w, valores de 1 até n, e uma mochila de capacidade w, qual é o subconjunto mais valioso de itens que cabem na mochila

Trata-se de achar um limite para o seguinte: para cada cidade, achar a soma das distâncias dessas para as duas cidades mais próximas, então calcular a soma desses n números e dividir por 2. O limite será o resto dessa divisão