Você está na página 1de 14

Implementação de um algoritmo Hill-Climbing para um problema

de Roteamento de Veículos com Frotas Heterogêneas

Gabriel de Campos Mazzei


Engenharia de Produção – Universidade Tecnológica Federal do Paraná
Gustavo Faro Gibertoni
Engenharia de Produção – Universidade Tecnológica Federal do Paraná
Henrique D’avila Soares
Engenharia de Produção – Universidade Tecnológica Federal do Paraná
Miguel Martin de Moraes
Engenharia de Produção – Universidade Tecnológica Federal do Paraná

Resumo: Este trabalho teve como objetivo apresentar um algoritmo onde se busca uma
vizinhança para a resolução do problema de Roteamento de Veículos com Frotas Heterogêneas
(HFVRP - Vehicle Routing Problem with Heterogeneous Fleet) com as restrições de dos veículos,
onde teve como obstáculos a alocação dos veículos nas rotas a fim de minimizar o valor de
makespan (menor utilização dos recursos). Portanto, foi proposto uma heurística para a geração
de soluções iniciais aleatórias e uma estrutura para a geração de vizinhanças, que são possíveis
soluções candidatas para a otimização. Foram analisadas 40 instâncias através de um algoritmo
criado em linguagem de programação Python, aplicando junto o método de execução do Hill-
Climbing. O algoritmo realizou o procedimento em todas as instâncias em mais de 12 horas, onde
optou por colocar um limite de 1000 iterações ou um tempo de 30 minutos para gerar as soluções
dentro dos valores aceitáveis de benchmarking, concluindo que o algoritmo é eficiente, porém
podem existir modelos com soluções melhores.
Palavras-chave: Hill-Climbing, Python.

Implementation of a Hill-Climbing Algorithm for a Heterogeneous


Fleet Vehicle Routing Problem

Abstract: This study aimed to present an algorithm that seeks a neighborhood for solving the
Heterogeneous Fleet Vehicle Routing Problem (HFVRP) with vehicle constraints. The main
obstacle was the allocation of vehicles to routes in order to minimize the makespan value
(minimize resource utilization). Therefore, a heuristic was proposed for generating random initial
solutions and a structure for generating neighborhoods, which are possible candidate solutions for
optimization. Forty instances were analyzed using a Python programming language algorithm,
incorporating the Hill-Climbing execution method. The algorithm executed the procedure for all
instances in over 12 hours, with a limit of 100 iterations or a maximum time of 30 minutes to
generate solutions within acceptable benchmarking values. The study concluded that the
algorithm is efficient, although there may be models with better solutions.

Keywords: Hill-Climbing, Python.

1 de 14
1. Introdução
A programação e o planejamento da produção se tornaram algo imprescindível nos dias
atuais, para se manter em competitividade no mercado, devido a grande demanda
mundial, levando as empresas a atualizar seus métodos. Com isso, softwares e
algoritmos se tornaram grandes aliados nesse cenário, pois esses algoritmos buscam
encontrar a solução mais próxima da solução ótima possível para o problema de
planejamento em questão.
A otimização do Problema de Roteamento de Veículos com Frotas Heterogêneas é um
desafio frequente e relevante na indústria de produção. Para encontrar a solução ótima
para esse problema, é empregado o método Hill Climbing.
Bennet (2004), o método hill-climbing é quando se começa por uma solução aleatória e, a
cada passo, é feita uma mutação aleatória que é aceita somente se a nova solução for
melhor que a anterior. Com este modelo, a solução encontrada será sempre o mais
próximo da solução ótima possível.
A otimização de algoritmos é um desafio constante no campo da programação, e o
algoritmo Hill Climbing (ou "escalada de colina") tem sido amplamente utilizado para
resolver problemas de otimização. Sua simplicidade e eficiência tornam-no uma escolha
popular em diversas áreas, incluindo a programação em Python.
"A escalada de colina é um dos métodos heurísticos mais antigos e mais conhecidos"
(Baig & Akhtar, 2018, p. 210). Sua estratégia é simples e intuitiva: busca-se uma solução
ótima localmente melhor em cada iteração, semelhante à subida de uma colina em busca
do ponto mais alto.
No entanto, é importante considerar a limitação do Hill Climbing em relação aos máximos
locais. “O algoritmo Hill Climbing pode ficar preso em máximos locais e, portanto, não é
garantido que a solução globalmente ótima seja alcançada” (Russell & Norvig, 2016, p.
126). Para mitigar esse problema, diferentes abordagens podem ser adotadas, como a
combinação do Hill Climbing com algoritmos genéticos ou o uso de heurísticas
adaptativas
Portanto, este artigo teve como objetivo apresentar um algoritmo baseado em heurísticas
e no método de Hill Climbing, em uma linguagem de programação python, capaz de
encontrar uma solução boa para o problema de Roteamento de Veículos com Frotas
Heterogêneas.
O artigo segue a seguinte estrutura: Referencial teórico, onde busca o embasamento para
o trabalho; proposta do algoritmo, que contém uma descrição dos elementos do algoritmo
conforme foi implementado; resultados obtidos, em que explica a forma como o algoritmo
foi executado e os resultados apresentados; e, por fim, as conclusões do problema.

2 de 14
2. Referencial Teórico
2.1 Definições sobre a Pesquisa Operacional, Heurísticas e Metaheurísitcas

A Pesquisa Operacional é uma ciência com o objetivo de resolução de problemas


aplicando conceitos e métodos buscando a melhor solução para o caso que estiver em
questão. Em casos (mais encontrados na realidade) nos quais existem grandes números
de variáveis e restrições, os métodos para se encontrar soluções ótimas podem encontrar
desafios e nem haver estrutura e memória computacional que comporte a busca por essa
solução. Devido à essas dificuldades, esforços voltados para o desenvolvimento e
aperfeiçoamento de estratégias aproximativas para resolução dos problemas são
justificados – o que são as chamadas heurísticas e meta-heurísticas – aplicadas segundo
a citação (BELFIORI, et al , 2006):

Lenstra e Rinnooy Kan (1981) analisaram a complexidade de problemas de


roteirização de veículos, e concluíram que praticamente todos os problemas
de roteirização de veículos são NP-hard (entre eles o problema do caixeiro
viajante e o problema clássico de roteirização de veículos), pois não são
resolvidos em tempo polinomial. [...]

Em heurísticas, não é garantida uma solução ótima para determinado problema, porém
soluções boas que, através de uma determinada sequência de passos, podem ser
aplicadas a um número de variáveis e valores de determinado problema, tirando
vantagens de algumas de suas particularidades. Autores como Nicholson (1971) definem
heurísticas como procedimentos para resolver problemas com um enfoque racional no
qual a estrutura do problema possa ser interpretada e explorada para se encontrar uma
solução razoável. Outros autores como Reeves (2003) definem heurísticas como técnicas
que buscam soluções boas com custos operacionais razoáveis, que podem se aproximar
de soluções ótimas (porém, não é factível dizer o quanto essa solução se aproxima desse
valor “ótimo”) (BELFIORI, et al , 2006).
Em meta-heurísticas são aplicadas técnicas amplas que independem do problema sendo
tratado, coordenando a solução de heurísticas por buscas de soluções. Diferente das
heurísticas, as meta-heurísticas são métodos não determinísticos visto que cada vez que
são executadas, o valor de saída será diferente (mesmo que o valor de entrada seja o
mesmo) – uma característica que ajuda na busca por um ótimo global. Segundo
Fernandes (2019), meta-heurísticas são procedimentos com o objetivo de achar uma
solução aplicando em cada passo uma heurística subordinada:

De acordo com Souza (2011), as Meta-Heurísticas são procedimentos


destinados a encontrar uma boa solução, eventualmente a ótima,
consistindo na aplicação, em cada passo, de uma heurística subordinada, a
qual tem que ser modelada para cada problema específico. Nesse sentido,
as meta-heurísticas diferem da heurística convencional pois são providas
de mecanismos para tentar escapar de ótimos locais ainda distantes dos
ótimos globais.
2.2 Problema de Roteamento de Veículos com Frotas Heterogêneas (“Vehicle
Routing Problem with Heterogeneous Fleet (HFVRP)”

3 de 14
Conforme citado anteriormente, Lenstra e Rinnooy Kan (1981) analisaram a complexidade
de problemas de roteirização de veículos, e concluíram que os problemas de roteirização
de veículos são da classe NP-Hard. BELFIORI, et al , (2006) define o problema HFVRP
como um variação do clássico problema de roteirização de veículos, da seguinte forma:

O Problema de Roteirização de Veículos com Frota Heterogênea


(Heterogeneous Fleet Vehicle Routing Problem – HFVRP) é uma variação
do Problema clássico de Roteirização de Veículos, onde ao invés de
homogênea, a frota de veículos é heterogênea. Contrário ao Problema
clássico de Roteirização de Veículos, o objetivo do HFVRP é minimizar a
soma dos custos fixos (...)

Em seu trabalho, os autores utilizaram de heurísticas e meta-heurísticas para apresentar


métodos de resolução do Problema de Roteamento de Veículos com Frotas
Heterogêneas e suas extensões (Frota Heterogênea Fixa, Com Restrição de Tabela de
Tempos, etc.). Descartou-se o uso de métodos exatos devido à complexidade do
problema, visto à complexidade do HFVRP e suas extensões: “Como o problema é NP-
completo, todas as estratégias de solução utilizam métodos heurísticos e métodos
emergentes (metaheurísticas) ao invés de exatos. Diversos trabalhos utilizam heurísticas
construtivas e de melhoria, com o objetivo de encontrar uma solução de boa qualidade em
um tempo computacional razoável (BELFIORI, et al, 2006, p.10)”
2.3 Hill Climbing (Subida do Morro)

As meta-heurísticas se dividem em duas categorias de acordo com o princípio utilizado


para explorar o espaço de soluções: a busca local e a busca populacional (FERNANDES,
2019, p.21).
No processo da busca local, a exploração do espaço de soluções é feita
através de movimentos, os quais são aplicados a cada passo sobre a
solução corrente, gerando outra solução promissora em sua vizinhança.

A meta-heurística Hill Climbing é um método simples de busca local iterativo (Iterated


Local Search), que busca soluções decidindo o próximo passo analisando as soluções
existentes na vizinhança atual. Esse processo é realizado até que um ótimo local seja
encontrado, e a estrutura de vizinhança pare de gerar soluções melhores.
Roth (2012) afirma que as soluções obtidas pelo Hill Climbing tem o intuito de se
enquadrarem em soluções ótimas. Seus valores têm grande influência pelo seu ponto de
partida (ou seja, um algoritmo com um ponto de partida promissor irá gerar resultados
igualmente promissores).Todavia, não há como se determinar um erro relativo com essa
aplicação, visto que o ótimo global possui um valor desconhecido.
Pensando no algoritmo como uma função, é possível analisar um gráfico similar ao
seguinte:

Figura 01 - Ilustração do Hill Climbing em Gráfico

4 de 14
Fonte: Hill Climbing in Artificial Inteligence, by Priya Pedamkar

Observando a análise do Hill Climbing em forma de gráfico, é importante destacar que o


algoritmo não exige conhecimento da derivada ou gradiente da função.
Para problemas de Roteamento de Frotas, MÁXIMO (2021) apresenta uma hibridização
de uma versão adaptativa do Iterated Local Search com o Path-ReLinking, visando
permitir que sejam exploradas novas regiões do espaço de busca além da vizinhança. A
aplicação de Hill Climbing nesse método proporcionou desempenho superior à aplicação
de outros métodos heurísticos - menores lacunas médias em 93% das instâncias
testadas, instigando a importância da criação de soluções iniciais adequadas para
exploração da vizinhança - como também instigando métodos para expandir o espaço de
busca quando necessário.

5 de 14
3. Proposta do Algoritmo
A proposta de solução para o problema apresentado é utilizar o algoritmo Hill Climbing
para otimizar a roteirização de veículos com restrições de capacidade. Neste caso, o
algoritmo é aplicado iterativamente para melhorar a solução inicial gerada aleatoriamente,
buscando minimizar a distância percorrida pelos veículos e os custos associados,
enquanto respeita as restrições de capacidade dos veículos. A solução otimizada é então
armazenada em um arquivo de saída e um relatório é gerado para documentar o
processo. O código começa definindo uma função chamada "gerar_solucao" a qual
recebe vários parâmetros, incluindo uma matriz de distâncias, seções de veículos, ordem
dos veículos, quantidade de pontos, quantidade de veículos e uma seção de dados. A
função aloca pontos aleatoriamente nos veículos, levando em consideração a capacidade
disponível em cada veículo. Primeiro, é inicializada uma variável para contar o número de
pontos alocados nos veículos. Em seguida, é criada uma lista para armazenar a
capacidade disponível em cada veículo, preenchida com as informações de índice do
veículo, capacidade máxima e capacidade atual. A solução aleatória começa vazia e o
código seleciona o primeiro veículo da ordem de veículos, adicionando-o à solução. Em
seguida, um loop itera sobre a quantidade de pontos para alocar cada ponto nos veículos.
Dentro desse loop, é calculada uma probabilidade de alocação para cada ponto, levando
em consideração a distância e a demanda do ponto. Um número aleatório é gerado e
comparado com as probabilidades para determinar o ponto a ser alocado. Se o ponto
pode ser alocado no veículo atual, ele é adicionado à solução, a capacidade disponível é
atualizada e o número de pontos alocados é incrementado. Caso contrário, o código
passa para o próximo veículo. Esse processo é repetido até que todos os pontos tenham
sido alocados. A função retorna a solução aleatória e a lista atualizada de capacidade
disponível em cada veículo.
3.1 Método para geração de soluções iniciais aleatória
As imagens a seguir irão ilustrar, de forma breve, o conceito do método aplicado. Em
suma, primeiramente é determinada uma ordem aleatória para os veículos que serão
usados no problema de roteirização. Essa ordem irá embaralhar a sequência dos
veículos. Em seguida, é gerada uma solução inicial aleatória, na qual os pontos a serem
visitados são atribuídos aos veículos com base em sua demanda e na distância até eles.
Isso posto, a solução aleatória começa com o primeiro veículo da ordem aleatória, e, em
seguida, pontos são atribuídos aos veículos com base na razão entre a demanda e a
distância necessária para alcançar cada um deles. A alocação dos pontos é realizada de
acordo com a capacidade disponível em cada veículo, garantindo que a demanda não
exceda a capacidade de carga. Uma vez excedida, ou seja, a capacidade alocada
exceder a capacidade disponível, o código passa para o próximo veículo, sempre partindo
do depósito.

Figura 2 - Exemplo do método utilizado para iniciais aleatórias

Fonte: Autoria própria 2023

6 de 14
Figura 3 - Exemplo do método utilizado para iniciais aleatórias

Fonte: Autoria própria 2023

Para fins de exemplo, foram utilizados três veículos e nove pontos, sendo que, ao chegar
no ponto nove, o próximo seria o ponto cinco, contudo, como sua demanda excedia a
capacidade total, foi passado para o próximo veículo, partindo do ponto inicial, ou seja, o
depósito.
3.2 Estrutura para geração de vizinhança
No caso específico desse algoritmo, a vizinhança é gerada por meio da troca de posições
entre pontos consecutivos na solução atual. O objetivo por trás dessa estratégia é
explorar diferentes configurações dos pontos nas rotas, a fim de encontrar soluções que
possuam menor custo ou valor objetivo. Essa abordagem se baseia na ideia de que
pequenas alterações nas posições dos pontos podem levar a melhorias significativas na
solução global. O processo de geração dos vizinhos ocorre dentro de um loop principal,
que busca incessantemente por soluções melhores. Para isso, a solução atual é
analisada e desmembrada em duas listas: uma lista contendo todos os pontos presentes
nas rotas e outra lista que registra o número de pontos em cada rota.
Em seguida, dois loops aninhados são utilizados para percorrer os pontos na lista e
realizar a troca de posições entre pontos consecutivos. No entanto, é importante ressaltar
que as trocas só são permitidas entre pontos que não sejam adjacentes, a fim de evitar a
geração de soluções simétricas ou equivalentes.
Após cada troca de posição, uma nova solução é reconstruída a partir das listas de
pontos e do registro de número de pontos em cada rota. Essa nova solução é então
avaliada para verificar sua viabilidade e calcular seu valor objetivo utilizando métricas
específicas do problema em questão.
Se a nova solução for considerada viável e seu valor objetivo for menor do que o da
solução atual, ela é aceita como a nova solução corrente. Esse processo de geração de
vizinhos e avaliação se repete até que não sejam encontradas mais melhorias
significativas na vizinhança. A imagem abaixo ilustra um exemplo de solução advinda do
código.

7 de 14
Figura 4 - Exemplo da geração de vizinhos

Fonte: Autoria própria 2023

8 de 14
4. Resultados e Discussões
O algoritmo proposto é um problema de roteamento de veículos, e foi testado em 40
instâncias propostas. O algoritmo foi executado por 1000 iterações ou até que passasse
30 minutos. As soluções obtidas foram comparadas com um benchmark estabelecido,
permitindo a análise da discrepância (gap) entre as soluções geradas pelo algoritmo e as
soluções de referência.
Para os problemas de menor complexidade, o desempenho do algoritmo foi satisfatório,
produzindo resultados de qualidade. No entanto, à medida que a complexidade dos
problemas foi aumentando, observou-se um aumento no tempo de processamento
necessário para resolver os problemas, como observado na Tabela 2, a partir de 75
iterações o algoritmo começou a ficar pesado. Apesar dessa limitação, os resultados
obtidos foram considerados satisfatórios.

Tabela 1 - Interações da Instância 02

Fonte: Autoria própria 2023

Gráfico 1 - Plotagem de solução da instância 02

Fonte: Autoria própria 2023

9 de 14
Tabela 2 - Iterações e tempo por instância

Fonte: Autoria própria (2023)

10 de 14
Tabela 3 - Soluções obtidas comparadas com o benchmark com os gaps calculados

Fonte: Autoria própria (2023)

11 de 14
Gráfico 2 - GAPs encontrados entre as soluções encontradas pelo professor e as encontradas pelo
algoritmo.

Fonte: Autoria própria (2023)

Gráfico 3 - Comparativo de interações e tempo(s) para obter soluções.

Fonte: Autoria própria (2023)

Gráfico 4 - Comparativo do benchmark com as soluções encontradas.

Fonte: Autoria própria (2023)

12 de 14
Gráfico 5 - Comparativo com o mínimo aceitável, solução encontrada e benchmark.

Fonte: Autoria própria (2023)

5. Conclusões
O problema de roteamento de veículos com frotas heterogêneas é um dos diversos
problemas que um engenheiro de Produção pode encontrar em sua rotina em uma
indústria. Não é complexo o entendimento do problema, mas sua implementação é,
necessitando de alternativas sofisticadas para realiza-lo. A importância desse modelo se
dá por conta de ser ter a necessidade de cada veículo percorrer o menor caminho, com a
maior capacidade, menor custo e no menor tempo.
Portanto, este artigo teve como objetivo apresentar um algoritmo baseado em heurísticas
combinado com o método de Hill Climbing, capaz de encontrar uma boa solução para
este tipo de problema, facilitando o trabalho de quem precisa lidar com ele. O algoritmo foi
implementado em linguagem de programação Python.

Para a geração da vizinhança, é realizada a troca de posições entre pontos consecutivos


da solução atual, o qual busca melhorar a solução realizando a troca de duas posições
em um circuito, gerando uma nova solução, mas essa solução nem sempre é melhor que
a solução Global. Essa estratégia é usada para explorar diferentes configurações dos
pontos nas rotas, a fim de encontrar soluções que possuem menor custo total.

O modelo proposto foi capaz de encontrar soluções boas e dentro do Benchmark, mas
quanto maior as instâncias e suas complexidades o tempo de processamento do
algoritmo foi aumentando. Podendo então existir outros métodos capazes de encontrar
soluções ainda melhores.

13 de 14
Referências

BELFIORE, et al. Problema de Roteirização de Veículos com Frota Heterogênea:


Revisão da Literatura. XXXVIII Simpósio Brasileiro de Pesquisa Operacional, Goiânia -
GO, 2006. Disponível em
<chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/http://din.uem.br/sbpo/sbpo2006/
pdf/arq0205.pdf>
LUZIA, Leandro Ferro; RODRIGUES, Mauricio Chui. Estudos sobre as Metaheurísticas.
USP - SP. Disponível em
<chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://www.ime.usp.br/~gold/
cursos/2009/mac5758/0112/LeandroMauricio.pdf>
FERNANDES, Letícia Fernanda de Lima. Resolução do Problema Integrado de
Carregamento e Roteamento de Veículos com Frota Heterogênea Janela de Tempo
por meio da Meta-heurística VNS-VND. Ouro Preto - MG, 2019. Disponível em
<chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://monografias.ufop.br/
bitstream/35400000/2594/1/MONOGRAFIA_Resolu
%c3%a7%c3%a3oProblemaIntegrado.pdf>
ROTH, Luís Carlos de Barros. Controle e Gerenciamento Econômico de um Sistema
de Energia Elétrica Residencial pelo Método Heurístico Hill Climbing. Rio de Janeiro
- RJ, 2012. Disponível em
<chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://pantheon.ufrj.br/bitstream/
11422/8901/1/monopoli10004372.pdf>
PEDAMKAR, Priya. Hill Climbing in Artificial Intelligence. Disponível em
<https://www.educba.com/hill-climbing-in-artificial-intelligence/>. Acesso em 22 de Junho
de 2023
MÁXIMO, Vinícius Rosa. Diversity Control Mechanisms in Iterated Local Search to
Solve Vehicle Routing Problems. São Paulo - SP, 2021.Disponível em
<https://repositorio.unifesp.br/bitstream/handle/11600/61918/Tese_Doutorado_FinalFicha
Catalografica.pdf?sequence=3&isAllowed=y>
Baig, MA, & Akhtar, Z. (2018). Algoritmo de Otimização de Escalada: Uma Revisão.
Journal of Artificial Intelligence and Soft Computing Research, 8(3), 209-229.
Russell, SJ e Norvig, P. (2016). Inteligência Artificial: Uma Abordagem Moderna. p.126
BENNETT, A. P. When a genetic algorithm outperforms hill-climbing. Theoretical
Computer Science, 320, p. 135-153, 2004.

14 de 14

Você também pode gostar