Skip to article frontmatterSkip to article content

Branch-and-Bound

A special thanks to the TA Filipe Vilas Boas for scribing this page

4.5 Branch-and-Bound

O objetivo desta técnica de projeto de algoritmos é ser capaz de melhorar (não assintoticamente) um algoritmo de backtracking em relação a tempo e para problemas de otimização. Por ser de otimização, as soluções para uma instância podem ser classificadas em: factíveis sse ela não viola nenhuma das restrições do problema; e ótimas sse são factíveis e também de melhor qualidade em relação à função objetivo. Em linhas gerais, a ideia será a de explorar a árvore do espaço de busca de maneira a podar o máximo de nós. Para isso, um algoritmo de branch-and-bound precisa manter a seguinte informação:

Observe que o potencial de um nó não representa necessariamente que existirá uma solução a partir daquele nó que tem o custo do potencial – apenas significa que não tem como obter melhor solução do que aquilo a partir dali. Outra observação é que a noção do que é melhor ou pior depende de ser um problema de maximização ou minimização: para minimização o potencial é um limite inferior, para maximização o potencial é um limite superior.

Com isso, um algoritmo de branch-and-bound pode podar um nó de um espaço de busca sempre que:

  1. O nó representar uma solução não factível;
  2. O nó representa um ponto onde nenhuma escolha pode ser feita, isto é, a solução candidata está completa;
  3. O potencial de um nó não é melhor do que a melhor solução observada até então.

Para que essa estratégia tenha vantagens em relação ao bactracking, precisamos então sempre manter os nós ativos da árvore de busca a todo momento para então sempre escolher expandir o nó de melhor potencial (best first). Nós ativos são aqueles nós folha que ainda não foram podados.

BRANCH-AND-BOUND(b)1.seja SNIL uma soluc¸a˜oˊtima inicialmente nula2.seja N{} o conjunto de noˊs ativos (soluc¸o˜es parciais)3.enquanto N4.seja SN a soluc¸a˜o com o melhor potencial b(S)5.para cada item viaˊvel i a partir de S6.SS  {i}  novo noˊ7.se S na˜o puder ser expandida (soluc¸a˜o completa)8.se S=NIL ou b(S) for melhor do que b(S)9.  SS10. ⁣remova de N todo noˊ Stal que b(S)eˊ pior do que b(S*)11.sena˜o11.NN{S}13.return S\begin{array}{ll} \textbf{BRANCH-AND-BOUND}(b) \\ 1.\quad \text{seja } S^* \gets NIL \text{ uma solução ótima inicialmente nula} \\ 2.\quad \text{seja } N \gets \{\emptyset\} \text{ o conjunto de nós ativos (soluções parciais)} \\ 3.\quad \text{enquanto } N \neq \emptyset \\ 4.\quad \quad \text{seja } S \in N \text{ a solução com o melhor potencial } b(S) \\ 5.\quad \quad \text{para cada item viável } i \text{ a partir de } S\\ 6.\quad \quad \quad S' \gets S \; ∪ \{ i \} \; \langle \langle \text{novo nó}\rangle \rangle \\ 7.\quad \quad \quad \text{se } S'\text{ não puder ser expandida (solução completa)}\\ 8.\quad \quad \quad \quad \text{se } S^* = NIL \text{ ou } b(S') \text{ for melhor do que } b(S^*) \\ 9.\quad \quad \quad \quad \quad \; S^* \gets S'\\ 10.\quad \quad \quad \quad \quad \! \text{remova de } N \text{ todo nó } S'' \text{tal que } b(S'') \text{é pior do que b(S*)} \\ 11.\quad \quad \quad \text{senão} \\ 11.\quad \quad \quad \quad N \gets N ∪ \{S'\} \\ 13.\quad \text{return } S^* \\ \end{array}

4.5.1 Problema da mochila

Limite superior para o custo de soluções parciais: o potencial máximo de ganho a partir da escolha de alguns itens. Considerando vv' e ww' como sendo o que se tem de custo e benefício em um dado momento: ub=v+(Ww)(vi+1/wi+1)ub = v' + (W − w')(v_{i+1}/w_{i+1}), isto é, o benefício que já temos mais o máximo de custo benefício para cada unidade de peso restante da mochila.

MOCHILA-BRANCH-AND-BOUND(S,v,w,i) assumir w,v,W como entradas do problema1.  se soluc¸a˜o atual eˊ inviaˊvel, retorne a soluc¸a˜o indicando pior potencial possıˊvel 2.  se todos os itens foram considerados, retorne a soluc¸a˜3.  gere duas soluc¸o˜es parciais: (1) adiciona item i aˋ soluc¸a˜o; (2) na˜o adiciona i aˋ soluc¸a˜4.  determine os custos e benefıˊcios parciais (v/w) e os limites superiores (ub) de cada soluc¸a˜o gerada5.  seja (A) o noˊ (soluc¸a˜o gerada) com maior potencial6.  seja (B) o noˊ (soluc¸a˜o gerada) com menor potencial7.  chame recursivo MOCHILA-BRANCH-AND-BOUND com o noˊ (A)8.  se o limite superior de (B) for ≤ aˋ soluc¸a˜o de (A)9.  retorne soluc¸a˜o de (A) como melhor10. ⁣sena˜o11. ⁣chame recursivo MOCHILA-BRANCH-AND-BOUND com o noˊ (B)11. ⁣retorne melhor entre as soluc¸o˜es de (A) e (B)\begin{array}{ll} \textbf{MOCHILA-BRANCH-AND-BOUND}(S, v', w', i) \langle \langle \text{ assumir } w, v, W \text{ como entradas do problema}\rangle \rangle \\ 1.\; \quad \text{se solução atual é inviável, retorne a solução indicando pior potencial possível }\\ 2.\; \quad \text{se todos os itens foram considerados, retorne a solução } \\ 3.\; \quad \text{gere duas soluções parciais: (1) adiciona item } i \text{ à solução; (2) não adiciona } i \text{ à solução } \\ 4.\; \quad \text{determine os custos e benefícios parciais } (v'/w') \text{ e os limites superiores } (ub) \text{ de cada solução gerada} \\ 5.\; \quad \text{seja (A) o nó (solução gerada) com maior potencial}\\ 6.\; \quad \text{seja (B) o nó (solução gerada) com menor potencial}\\ 7.\; \quad \text{chame recursivo MOCHILA-BRANCH-AND-BOUND com o nó (A)}\\ 8.\; \quad \text{se o limite superior de (B) for ≤ à solução de (A)} \\ 9.\; \quad \quad \text{retorne solução de (A) como melhor}\\ 10.\! \quad \text{senão} \\ 11.\! \quad \quad \text{chame recursivo MOCHILA-BRANCH-AND-BOUND com o nó (B)} \\ 11.\! \quad \quad \text{retorne melhor entre as soluções de (A) e (B)} \\ \end{array}

4.5.2 Problema da alocação

O problema da alocação recebe como entrada um conjunto de trabalhadores w1,w2,,wnw_1, w_2, · · · , w_n, um conjunto de tarefas t1,t2,,tnt_1, t_2, · · · , t_n e um custo cijc_{ij} para cada alocação witjw_i \to t_j . Uma tarefa só pode ser atribuída a um único trabalhador e vice versa. O objetivo é encontrar o conjunto de nn alocações que minimize a soma dos custos. Vamos representar uma instância do problema como uma matriz n×nn × n onde linhas representam os trabalhadores e colunas representam as tarefas. Por exemplo:

[9278643758187694]\begin{bmatrix}{} 9 & 2 & 7 & 8 \\ 6 & 4 & 3 & 7 \\ 5 & 8 & 1 & 8 \\ 7 & 6 & 9 & 4 \\ \end{bmatrix}

Veja que agora o objetivo é encontrar, para cada linha, uma coluna não escolhida por nenhuma outra linha.