Enumeração Implícita de Balas Eduardo Rodrigues Viana Jorge von Atzingen dos Reis
Programação Inteira Binária Forma padrão de um problema de programação linear binária: min z= nj=1 cjxj s. a. nj=1 aijxj <=bi i=1,...,m xj {0,1) j=1,...,n
Enumeração Implícita Um nó corresponde a uma possível solução binária para x; Dois nós interligados possuem a mudança no valor de uma variável; Cada variável pode ter um de três estado: fixado em 1, fixado em 0 ou livre.
Enumeração Implícita Passo adiante (Forward step): fixar uma variável em 1; Passo atrás (Backtrack step): fixar uma variável em 0;
Passos de uma Enumeração Básica Fixar uma variável livre no valor 1; Resolver o subproblema com as demais variáveis livres; Fixar a mesma variável no valor 0 e repetir o processo para o subproblema com xj= 0;
Árvore de Busca – Search Tree Foward Backtrack Variáveis Livres Variáveis Livres
Critérios da Enumeração Implícita Função Objetivo e Restrições: T = {j: xj é livre, z+cj< zj, aij<0 para cada i que yi= bi- jEJ aijxj< 0} Se T é vazio um passo atrás é executado
Critérios da Enumeração Implícita Teste de inviabilidade: Se T não é vazio identificamos i tal que yi<0 e yi-jEJ min(0,aij)< 0 Se todas as variáveis pertencentes a T forem iguais a 1 a i-ésima restrição é inviável
Critérios da Enumeração Implícita Teste de Ramificação de Balas: Para cada variável xj criamos o conjunto Mj Mj = {i: yi- aij< 0} vj = iEMj (yi-aij) Ou vj = 0 se Mj é vazio Se todos os Mj forem vazios é feito um passo atrás, selecionamos as variáveis xj que maximizam vj
Balas Zero-One Additive Algorithm Passo Inicial: Passo 1: Verifique se b>=0. Se for a solução ótima é X=0. Caso Contrário deixe todas as variáveis livres Z recebe um valor suficientemente grande
Balas Zero-One Additive Algorithm Passos Iterativos: Passo 2: Calcule yi= bi- jEJ aijxj Y= min yi, i=1,...,m Z= jEJ cjxj Se Y>=0 e z<Z, faça Z=z e X=x, x é a nova solução corrente vá para o passo 6. Caso Contrário vá ao passo 3
Balas Zero-One Additive Algorithm Passo 3: Crie o subconjunto T T = {j: xj é livre, z+cj< zj, aij<0 para cada i que yi< 0} Se T é vazio vá para o passo 6. Caso Contrário vá para o passo 4.
Balas Zero-One Additive Algorithm Passo 4: Teste de inviabilidade: avalia se existe um índice i o qual yi<0 e yi- jETmin(0,aij) <0 Se sim vá ao passo 6. Senão vá ao passo 5
Balas Zero-One Additive Algorithm Passo 5: Teste de ramificação de Balas: Para cada variável livre xj crie um conjunto Mj Mj= {i: yi-aij<0} Se todos Mj forem vazios vá ao passo 6. Caso Contrário, calcule vj = iEMj (yi-aij) Se Mj for vazio, vj=0 adicione a variável xj que maximiza vj à solução e retorne ao passo 2
Balas Zero-One Additive Algorithm Passo 6: Backtracking Modifique o vetor u mudando o sinal do elemento mais positivo. Todos os elementos à direita recebem o valor zero. Volte ao passo 2. Se não existir elementos possitivos em u a enumeração implícita está completa. A solução ótima é a corrente. Se Z for infinito, não existe solução viável.
Implementação Computacional Fechem o PowerPoint, abram o C++ Builder e carreguem o arquivo Algorithm_balas.bpr