• Nenhum resultado encontrado

Nos último 50 anos, os métodos exatos para o PRV têm envolvido desde os esquemas básicos de branch-and-bound até técnicas de engenharia altamente sofisticadas baseadas em programação matemática (Toth e Vigo, 2002). Neste trabalho é feita uma breve apresentação de alguns métodos exatos propostos para a resolução do PRV. Para uma revisão mais detalhada é sugerida a leitura de

Cordeau et al, 2002; Tarantilis, Ioannou e Prastacos, 2005; Iori et al, 2007; Archetti et al, 2007; Laporte, 2009) afirmarem que os métodos exatos são indicados apenas para apenas poucas centenas de clientes, pois tendem a tornar-se ineficientes à medida que a quantidade de clientes aumenta.

Mesmo com os problemas de desempenho, na literatura sobre o PRV, é possível encontrar diversos trabalhos que utilizam esses métodos. Laporte e Nobert (1980), Laporte (1992a) apresentam um survey com diversos métodos exatos para resolução do PRV baseados principalmente em algoritmos de branch-and-bound, relaxações diversas, programação dinâmica e algoritmos para formulações de fluxo de veículos. Christofides e Elion (1969) apresentam um dos primeiros algoritmos de branch-and-bound para o PRV, onde o problema é formulado como PCV e tem seus limites inferiores calculados a partir de árvores de expansão mínima. Christofides, Mingozzi e Toth (1981) apresentam um algoritmo de branch-and-bound utilizando relaxações do tipo k-degree center tree e q-rotas, Fisher (1994) apresenta outro

algoritmo de branch-and-bound utilizando relaxação do tipo k-trees e Hadjicostantinou et al (1995) também apresentam um algoritmo de branch-and-bound utilizando relaxação do tipo particionamento de conjuntos.

O trabalho de Ralph et al (2001) apresenta um algoritmo de branch-and-cut construído a partir de uma metodologia de separação baseada em decomposição para as restrições de capacidade. Toth e Vigo (2002) descrevem detalhadamente o PRV capacitado no caso simétrico e assimétrico. No caso assimétrico, o problema é modelado através de formulações de fluxo de veículos com limites inferiores calculados a partir de modelos de designação, arborescências e fluxo de custo mínimo, e no caso simétrico, é apresentada uma formulação de fluxo de veículos com duplo índice e relaxações baseadas em árvore de expansão mínima, b-matching e no problema de partição de conjuntos. Lysgaard et al (2004) apresentam um algoritmo de branch-and-cut para o PRVC onde, segundo os autores, conseguem resolver, de forma ótima, três instâncias de problemas. Martinhon, Lucena e Maculan (2004) apresentam um algoritmo de relax-and-cut para resolver o PRV formulado como uma relaxação da k-tree, estendendo o trabalho de Fisher (Fisher, 1994). Archetti et al (2007) apresentam um modelo de Programação Inteira Mista para determinar a quantidade a ser entregue e a melhor rota para realizar essa entrega utilizando uma técnica de branch-and-cut para resolver o problema de forma ótima.

Segundo Toth e Vigo (2002) e Taha (2007), o primeiro algoritmo de branch and bound foi apresentado em 1960 por A. Land e G. Doig para os problemas de programação inteira e programação inteira mista e são, basicamente, procedimentos de enumeração. Seu funcionamento se dá pela seguinte forma: supondo que exista uma função objetivo que se deseje minimizar e um limite superior para esta função esteja disponível, o primeiro passo é dividir o conjunto de todas as soluções viáveis em diversos subconjuntos e para cada um deles obter um limite inferior. Os subconjuntos cujos limites ultrapassam o limite superior são excluídos. Dos subconjuntos restantes, um deles é escolhido e novamente dividido em diversos subconjuntos. Este procedimento continua até que seja encontrada uma solução viável tal que o valor correspondente da função objetivo não seja maior que o limite inferior para qualquer subconjunto (Simas, 2007).

A seguir, é apresentada uma série de aplicações de algoritmos exatos. O algoritmo Christofides e Elion (1969) usa relaxação baseada em árvores de expansão mínima para calcular os limites inferiores nos nodos e antes do corte, verifica se qualquer uma das 3 condições é verdadeira: (1) a carga total do veículo excede a capacidade, (2) a distância total do veículo excede o limite ou (3) a capacidade restante dos veículos não é capaz de atender às cidades ainda não visitadas. Christofides, Mingozzi e Toth (1981) apresentam um algoritmo de branch-and-bound baseado nas técnicas de árvore de expansão mínima e q-rotas associados ao uso de relaxação lagrangeana para gerar os limites inferiores. Para calcular os limites inferiores baseados em árvore de expansão mínima, os autores modelam o PRV através de sua generalização, o m-PCV, sugerindo que uma solução para o m-PCV seria um limite inferior para o PRV. Os autores denominam de “k-degree center tree” (k-DCT) uma solução para o m-PCV. Lysgaard et al (2004) apresentam uma técnica de branch-and-cut totalmente baseada na chamada formulação de dois índices para o PRVC Simétrico. O modelo consiste em xij

representando o número de vezes que um veículo passa entre os vértices i e j. Vc ∈ V denota um conjunto de clientes. Dado um conjunto S Vc, seja q(S) denotado por , δ(S) denotado pelo conjunto de arestas em G com exatamente um fim nos vértices de S. E(S) denotado por um conjunto de arestas em G com todos os fins em vértices de S, e r(S) denotado pelo número de vértices requeridos para servir os clientes em S onde r(S) é a solução ótima do PMB com capacidade Q e o tamanho dos itens dados pela demanda dos clientes em S. Por fim, dado um F E arbitrário e x(F) irão denotar . O modelo de programação inteira é dado

A equação (3.1) representa a função objetivo. A equação (3.2) garante que cada cliente seja visitado exatamente uma vez. A inequação (3.3) impõe que a restrição de capacidade do veículo e as rotas estejam conectadas. As inequações (3.4) e (3.5) são as condições de integralidade.

O algoritmo de branch-and-cut apresentado funciona, através de uma fase de separação, onde os nodos são dispostos em forma de árvore e uma segunda parte que consiste na ramificação.

Caso a primeira parte não obtenha uma solução inteira, realiza-se a ramificação, a qual consiste em selecionar vários conjuntos de candidatos S Vc

para cada x*(δ(S)), através de uma heurística gulosa e ordenando-os em ordem crescente, conforme a equação (3.6), gerando uma lista de conjuntos S1, S2, ...

ordenados. Depois disso, para cada conjunto Si, analisados individualmente, calcula-se os dois limites inferiores, , dos quais deveriam ser obtidos os dois nós descendentes caso for utilizado Si para ramificação. Se cada nó descendente puder ser descoberto, Si é escolhido imediatamente. Caso contrário, aplica-se a seguinte regra: seja = min{ , } e = max{ , }. Opta-se Si a Sj se >

. Nos casos de laços, opta-se Si a Sj se > .

(3.6)

Na seleção dos nós, o nodo com o menor limite inferior é sempre processado na sequência e a sistemática de cortes utilizada nesse algoritmo consiste em armazenar somente os cortes que poderão gerar, futuramente, uma possibilidade de reconstrução da programação linear.

Com esse algoritmo, os autores puderam provar a otimalidade de três problemas pela primeira vez, além de um comparativo com diversos outros autores (Lysgaard, 2004). Para maiores informações, sugere-se a leitura do trabalho original.