Construída a solução inicial, é necessário implementar heurísticas de melhoria que permitam aperfeiçoar uma dada combinação de pontos, condutores e veículos. Estas heurísticas irão pesquisar a vizinhança de uma solução que lhes é fornecida. No modelo descritivo do problema em questão, existem vários tipos de movimentos possíveis, sendo que se implementaram os mais simples. Mais uma vez, pelo facto de se tratar de um problema
multiobjectivo, não seria prático desenvolver algo muito complexo, até porque mais tarde pode ser interessante adicionar novos objetivos ao planeamento, o que levaria a empresa a alterar grande parte do algoritmo.
A pesquisa local permite então alterar iterativamente a solução, de uma forma descendente, em direção a um mínimo local ou, por ventura, a um mínimo global (pode haver mais do que um). Pelo facto de ser humanamente impossível explorar todas as soluções possíveis, é necessário selecionar estruturas de vizinhança, analisando vários vizinhos e selecionando os melhores. Esta é uma forma de delimitar o espaço de soluções.
A implementação deu origem a duas fases para a pesquisa local, uma dirigida ao problema de Job Scheduling (Fase 1) e a outra orientada para o problema de Assignment de condutores e veículos (Fase 2). Em cada fase são exploradas vizinhanças construídas a partir da aplicação de dois movimentos, sendo que apenas se abandona uma fase no caso de já não ser possível encontrar melhorias. A Tabela 4 resume a influência de cada movimento nas diferentes dimensões da solução, servindo de justificação para a decisão de os implementar.
Tabela 4 - Efeitos dos movimentos implementados na solução
Efeito Swap Rotas Insert Rotas Swap Par Exchange Par
Altera Custo
Altera Diferenças de Horas Altera Diferenças de Quilómetros Altera Penalizações de Zona Altera Penalizações de Quilómetros Altera Ocupação Média
Modifica número de rotas de um Ponto Modifica número de Pontos
Modifica número e tipo de veículos ou condutores utilizados na semana
De seguida, serão descritas as vizinhanças analisadas e as heurísticas de melhoria implementadas.
6.5.1 Fase 1 – Route Scheduling Search
6.5.1.1 Insert Rotas
No sentido de se introduzir variações no número de rotas de cada ponto é necessário retirar uma rota de um ponto e inseri-la noutro. É precisamente desta forma que se constrói a vizinhança analisada nesta fase da pesquisa local.
Esta vizinhança permite a eliminação de pontos, representando um enorme ganho em termos de custos fixos, visto que cada ponto necessita de um par condutor/veículo. Permite também grandes variações nos restantes objetivos.
A aceitação de um vizinho é realizada sempre que se encontra uma melhoria. Fisicamente, cada movimento é concretizado de acordo com o exemplo da
Figura 15 - Exemplo do movimento Insert Rota
6.5.1.2 Swap Rotas
Não raras vezes, não é possível efetuar as inserções referidas com a estrutura de vizinhança descrita anteriormente. Daí que se tenha definido uma outra vizinhança que permite libertar algum espaço nos pontos, possibilitando trocas de rotas entre dois pontos. Esta perturbação pode não significar grandes diferenças em termos de horas e quilómetros a efetuar em cada ponto, no entanto possibilita ajustes nas penalizações de zona, nos quilómetros realizados em excesso e na média de ocupação dos veículos.
A Figura 16 representa um movimento Swap entre a “Rota 1” do “Ponto 1” e a “Rota 4” do “Ponto 2”.
Figura 16 - Exemplo de movimento Swap Rotas
6.5.2 Fase 2 – Crew Assignment Search
6.5.2.1 Swap Par Condutor/Veículo
A avaliação da função objetivo é influenciada pelos pares condutor/veículo que se alocam a cada ponto. Deste modo, é perfeitamente vantajoso explorar vizinhanças que permitam alterar os recursos utilizados para efetuar um determinado ponto.
A estrutura de vizinhança “Swap Condutor/Veículo” possibilita trocar os pares condutor/veículo de dois pontos, colocando os condutores a conduzir mais rotas dentro da sua zona, aumentando a ocupação dos veículos e diminuindo os custos das viagens ao alocar os veículos de menor consumo a pontos onde se efetuam mais quilómetros. Os quilómetros em excesso podem também diminuir com um movimento deste tipo. Pode apontar-se aqui uma desvantagem por não ser possível a troca das duas entidades em separado. No entanto, optou- se por não se implementar esse movimento visto que apenas seriam encontradas melhorias nas penalizações de zona.
A Figura 17 exemplifica um movimento Swap Condutor/Veículo.
Insert
Figura 17 - Exemplo de movimento Swap Condutor/Veículo
6.5.2.2 Exchange Condutores e Veículos
Imagine-se que até um determinado momento do processo de otimização o algoritmo encontrou soluções em que não foi necessário utilizar todos recursos disponíveis. Neste caso é possível haver condutores e veículos não utilizados que ofereçam melhores soluções. Nesta fase da pesquisa local é possível introduzir condutores e veículos na solução que ainda não estão a ser utilizados, o que se pode revelar vantajoso visto que até aqui ainda não se tinha utilizado qualquer critério para definir o conjunto de condutores e veículos que devem ser incluídos na solução. Este movimento confere ao algoritmo a capacidade de responder a um maior número de questões “What if”, permitindo, por exemplo, adicionar veículos de outros tipos e chegar à conclusão de que não são necessários veículos tão dispendiosos para realizar um determinado plano.
É também possível encontrar casos em que, num determinado dia seja vantajoso proceder a uma troca de condutores ou veículos que já se encontrem a ser utilizados noutros dias da semana.