Documente Academic
Documente Profesional
Documente Cultură
Abstract
The crew scheduling problem aims to generate workloads from a set of pre-established trips and to schedule a particular crew
to fulfill these trips. Solving the problem consists of the generation of scales with the lowest operational cost possible, taking
into account the different constraints of the problem. Finding the best scale by decreasing the amount of overtime, downtime,
and crew required to meet a planning horizon in an acceptable computational time is a difficult task. The present work had
the objective of proposing a Hybrid Method for Optimization of the Scale of Crews in Urban Bus, using Programming with
Restrictions and Genetic Algorithms. The tests were performed with real operational data from a public transport company in
the city of Montes Claros (MG). The proposed method obtained positive results, generating less costly time scales than those
used by the company.
Keywords: Computational Optimization in Public Transport. Crew Programming Problem. Hybrid Methods.
Resumo
O Problema da Programação de Tripulações objetiva gerar escalas de trabalho a partir de um conjunto de viagens pré-
estabelecidas e escalonar uma determinada tripulação para cumprir estas viagens. Solucionar o problema consiste na geração
de escalas com o menor custo operacional possível, atendendo as diversas restrições do problema. Encontrar a melhor escala,
diminuindo a quantidade de horas extras, tempo ocioso e tripulação necessária para cumprir um horizonte de planejamento
em um tempo computacional aceitável é uma tarefa de difícil solução. O presente trabalho teve por objetivo propor um
Método Híbrido para Otimização da Escala de Tripulações em Ônibus Urbano, utilizando Programação com Restrições e
Algoritmos Genéticos. Os testes foram realizados com dados operacionais reais de uma empresa de transporte público da
cidade de Montes Claros (MG). O método proposto obteve resultados positivos, gerando escalas de jornada menos custosas
do que as utilizadas pela empresa.
1. Introdução
O transporte público por ônibus urbano possui diversas Reestruturar uma rede de transporte de passageiros
restrições operacionais conflitantes, sendo uma tarefa considerando todas as variáveis é um problema complexo
difícil encontrar uma solução viável que satisfaça todas as justamente devido à quantidade de variáveis, dificultando
variáveis do cenário. Para analisar um sistema de a compreensão da realidade do sistema. Com a aplicação
transporte de passageiros é importante levar em do método proposto é possível analisar o comportamento
consideração os requisitos de atendimento aos horários destas variáveis, definindo parâmetros específicos e
programados, realização das paradas programadas nos acompanhando o seu comportamento de acordo com o
pontos e atendimento da demanda de passageiros da objetivo pretendido em um ambiente simulado, prevendo
melhor forma, respeitando as restrições de comportamentos e situações que poderiam ocorrer no
disponibilidade da tripulação (motorista e cobrador) e cenário real.
frota. Embora a excelência das redes de infra-estrutura Planejar um sistema de transporte público urbano exige
urbana para fluidez do transporte público seja um fator complexos processos de análise e coordenação tanto do
essencial, aplicar ferramentas de otimização poder público quanto de empresas prestadoras do serviço.
computacional pode possibilitar melhorias do uso dos da Esta metodologia pode ser dividida em fases, conforme
estrutura existente. proposto por CUNHA (2014) e apresentada na Figura 1:
Figura 1 - Interações entre os subsistemas de transporte de passageiros CUNHA (2014).
Uma das fases do processo de planejamento do lugar. Objetiva encontrar um conjunto com uma
transporte público trata do Problema da Programação de sequência de jornadas diárias com menor custo e atenda
Tripulações (PPT). Prates e Silva (2014) afirmam que as necessidades da tabela de horários em um horizonte de
nesta etapa busca-se obter sequências de jornadas diárias, planejamento (CUNHA, 2014). Estas sequências são
compreendendo os dias úteis, sábados e domingos, atribuídas a identificadores genéricos que posteriormente
respeitando às restrições legais e trabalhistas dos são relacionados com funcionários dentro da empresa.
colaboradores. Neste trabalho pretendeu-se desenvolver Cada viagem a ser cumprida por uma tripulação é
um Sistema de Informação para atacar o PPT através da composta por horário de início e final, linha, carro e dia
elaboração de um método de otimização híbrido, de rodagem. Todas estas viagens agrupadas constituem
utilizando Programação com Restrições (PR) e um bloco de viagens do ônibus ou jornadas. Assim pode-
algoritmos genéticos, testado com dados operacionais se prever os horários de partida e chegada do veículo da
reais de uma empresa de transporte público da cidade de garagem bem como o fluxo de tripulação necessário para
Montes Claros (MG). a sua atividade diária.
Para cada veículo é feito um agrupamento de tarefas
2. Problema da Programação de denominadas sequências de viagens consecutivas, as
quais devem ser realizadas por um único condutor visto
Tripulações que não há tempo para troca da tripulação entre elas. O
Programar tripulações consiste no processo de construir conjunto das tarefas que são realizadas por uma
escalas e jornadas de trabalho, satisfazendo necessidades determinada tripulação durante o período de operação
e restrições impostas por empresas e usuários do sistema. diário é denominado jornada. Estas precisam seguir as
CUNHA (2014) afirma que em várias organizações as restrições definidas pela empresa e leis trabalhistas que
pessoas envolvidas no desenvolvimento de rodízios regem os recursos humanos alocados. Dentro do fluxo
precisam de ferramentas de suporte para prover os diário existem as jornadas simples e as jornadas dupla
funcionários corretos nos horários certos. Normalmente pegada. Esta última se diferencia por ser realizada
utiliza-se planilhas, bancos de dados, possíveis quando ocorre com um intervalo entre duas horas ou mais
ferramentas de rodízios, modelos matemáticos e entre uma jornada e outra. Este tipo de jornada é
algoritmos apropriados. Um dos sistemas de necessário para equilíbrio do sistema, aumentando o
planejamento de jornadas é o modelo de escala fixa, onde fluxo de veículos que são utilizados em horários de pico,
tripulações realizam a mesma jornada de trabalho todos normalmente no início da manhã e final da tarde. Neste
os dias. Com este modelo algumas jornadas tendem a ser caso o intervalo entre os dois pedaços de jornada não é
mais atrativas para algumas tripulações. Este modelo é de contabilizado como hora trabalhada. Já nas jornadas
fácil construção porém além de ser custoso para as simples os intervalos entre as tarefas são menores do que
empresas e parcial para os colaboradores, é dispendioso os valores definidos na dupla pegada. As horas extras irão
pois não permite compensação de horas, além de gerar corresponder ao tempo trabalhado além do tempo normal
mau estar entre os funcionários, alguns trabalhando mais (normalmente sete horas e trinta minutos, CLT), mesmo
e outros menos. que sejam jornada simples ou dupla pegada.
O modelo de rodízio de tripulações busca sanar estas O ideal é que todas as tripulações não fiquem ociosas e
questões, distribuindo a carga de trabalho de forma mais trabalhem com um mínimo de horas extras possível. A
equitativa, equilibrando as horas ociosas, dias de folga e composição do custo de uma solução do PPT é obtida
horas extras entre todas as tripulações. Neste modelo através da combinação linear dos custos fixos e variáveis
costuma-se adotar também o padrão de folga variável (a das jornadas, onde os custos fixos decorrem da
cada seis dias consecutivos de trabalho uma folga), remuneração dos tripulantes e os variáveis são
diferentemente do sistema de folga fixa (folgas sempre representados pelas horas extras trabalhadas, tempo
nos mesmos dias), o qual gera sempre horas extras e ocioso e quantidade de duplas pegadas na solução. Para
ociosas para as mesmas tripulações. cada modelo há um limite de duplas pegadas a ser
atingido, visto que algumas tripulações folgam nos
domingos ou definições de restrições trabalhistas onde
2.1 Programação de Tripulações em Ônibus somente um percentual da tripulação pode realizar estas
Urbano jornadas. Desta forma, este tipo de jornada deve ser
Para o planejamento no transporte público urbano por limitado e o modelo adaptado de acordo com as regras
ônibus, as escalas são criadas com base nas tabelas de impostas. A expressão a seguir representa um modelo de
horários. Diferentemente do setor aéreo, as escalas são função objetivo de uma solução para o PPT (SILVA e
menores e também normalmente não se aplica o conceito SILVA, 2015):
de início e fim da jornada ser obrigatório no mesmo
3.4 Restrições de Domínio do SAT devendo ser respeitadas a cada alocação de tripulação a
uma jornada. A Função 1 sintetiza todas as restrições de
As restrições de domínio são utilizadas para definir se domínio e será utilizada em cada função objetivo do
uma tripulação candidata pode ou não ser alocada para simulador:
cumprir uma jornada da vez em um dia específico. São de
natureza chave do problema e não podem ser violadas,
Sujeito a:
𝑡𝑟𝑖𝑝 = 𝑗𝑜𝑟𝑛 (2.1)
𝑡𝑟𝑖𝑝 <> ø (2.2)
𝑡𝑟𝑖𝑝 > 𝑗𝑜𝑟𝑛 ∨ 𝑗𝑜𝑟𝑛 ≤ 𝑗𝑜𝑟𝑛 (2.3)
𝑡𝑟𝑖𝑝 𝐹𝑖𝑛 + 𝑚𝑖𝑛𝐸𝑛𝑡𝑟𝑒𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠 < 𝑗𝑜𝑟𝑛 (2.4)
𝑡𝑟𝑖𝑝 = 𝑓𝑎𝑙𝑠𝑒 (2.5)
𝑡𝑟𝑖𝑝 < 6 (2.6)
𝑡𝑟𝑖𝑝 > 𝑗𝑜𝑟𝑛 ∨ 𝑗𝑜𝑟𝑛 ≤ 𝑗𝑜𝑟𝑛 (2.7)
𝑗𝑜𝑟𝑛 ≤ 𝑡𝑟𝑖𝑝 − 𝑡𝐸𝑛𝑡𝑟𝑒𝑃𝑒𝑔𝑎𝑑𝑎𝑠 (2.8)
𝑗𝑜𝑟𝑛 ≥ 𝑡𝑟𝑖𝑝 + 𝑡𝐸𝑛𝑡𝑟𝑒𝑃𝑒𝑔𝑎𝑑𝑎𝑠 (2.9)
𝑡𝑟𝑖𝑝 > 𝑗𝑜𝑟𝑛 (2.10)
𝑞𝐷𝑢𝑝𝑙𝑎𝑃𝑒𝑔𝑎𝑑𝑎 ≤ 𝑙𝑖𝑚𝐷𝑢𝑝𝑙𝑎𝑃𝑒𝑔𝑎𝑑𝑎 (2.11)
𝑡𝑟𝑖𝑝 ≤ 𝑚𝑎𝑥𝐻𝑜𝑟𝑎𝐸𝑥𝑡𝑟𝑎 (2.12)
Em (1) é feita a alocação de uma tripulação a uma A restrição (2.5) confirma se a tripulação candidata não
jornada em um dia. A restrição (2.1) assegura que a está de folga naquele dia e a (2.6) se a tripulação ainda
tripulação candidata seja alocada no mesmo dia que a não trabalhou seis dias consecutivos para ganhar folga.
jornada da vez. Já a restrição (2.2) verifica se a tripulação Trata-se na restrição (2.7) de assegurar que o tempo
ainda possui espaço disponível para alocação. Na ocupado de alocação da tripulação candidata na jornada
restrição (2.3) certifica-se que o tempo disponível da da vez seja maior que o tempo médio de viagens da
tripulação candidata seja maior que o tempo médio das jornada ou que o tempo restante da jornada seja menor ou
viagens da jornada da vez ou que o tempo restante da igual ao tempo médio de viagens da mesma. Nas
jornada da vez seja menor que o tempo médio das duas condições (2.8) e (2.9), caso haja dupla pegada, garante-
viagens. A restrição (2.4) garante que a última jornada se que não há conflitos entre a última alocação da
alocada da tripulação candidata no dia anterior somado ao tripulação candidata mais tempo entre pegadas com o
tempo mínimo entre jornadas seja inferior ao horário início da jornada da vez.
inicial da jornada da vez. Trata-se na restrição (2.10) caso haja dupla pegada, de
assegurar que o tempo ocupado pela segunda alocação da
tripulação candidata na jornada da vez seja maior que o extrapolando a quantidade de duplas pegadas permitida
tempo médio de viagens da jornada ou que o tempo por dia. Na restrição (2.12)
12) certifica-se
certifica que a tripulação
restante da jornada seja menor ou igual ao tempo médio candidata não
ão extrapolou o limite de horas extras fixado.
de viagens da mesma. Tem-se se na restrição ((2.11) caso A Figura 2 representa o método utilizado para realizar
haja dupla pegada, a garantia de que não se está a alocação de uma tripulação à uma jornada.
3.5 Restrições de Desempenho do SAT das jornadas, tendo efeito diretamente nas metas de
minimização pretendidas. O Quadro 2 define cada
As restrições de desempenho foram adicionadas restrição e o seu impacto no método.
objetivando otimizar o resultado do processamento diário
No procedimento de alocação invertida, ao invés da Não foram encontrados métodos semelhantes a este na
jornada ser alocada em tempo sequencial crescente a literatura e mostrou-se
se funcional também para minimizar
alocação é feita em tempo sequencial decrescente em o tempo de processamento do SAT, visto que prioriza o
jornadas alternadas, diminuindo assim a quantidade de preenchimento das jornadas com o tempo sequencial
conflitos entre horários de uma mesma tripulação e completo das tripulações e posteriormente faz o
facilitando a ocorrência
corrência das duplas pegadas, co
conforme processamento das duplas pegadas apenas nos horários
ilustrado na Figura 3. fracionados pendentes para finalização de cada jornada.
Figura 3 – Exemplo de alocação invertida (elaborado pelo autor).
3.6 Alocação de uma Tripulação com Pegada jornadas que são caracterizadas com pegada simples,
Simples buscando utilizar ao máximo o tempo de trabalho de uma
tripulação no dia.
Para alocar uma tripulação com pegada simples, o
algoritmo faz primeiramente o escalonamento das
Sujeito a:
𝑡𝑟𝑖𝑝 =Ø (3.1)
𝑗𝑜𝑟𝑛 ≥ jDiaria (3.2)
𝑗𝑜𝑟𝑛 ≥ tolerancia (3.3)
Em (3) busca-se diminuir ao máximo o tempo ocioso 3.7 Alocação de uma Mesma Tripulação com
restante da tripulação candidata à alocação. (3.1) Pegada Dupla
certifica-se que a tripulação ainda não foi alocada para
nenhuma jornada. A restrição (3.2) garante que o tempo Caso não consiga fechar o tempo integral da jornada com
de alocação na jornada seja igual ao tempo integral alocações com pegada simples (Função 3), o SAT parte
disponível da tripulação candidata (pegada simples). Já para a alocação de uma mesma tripulação com pegada
em (3.3) permite-se que seja feita a alocação daquela dupla, lidando com o restante das jornadas ainda não
jornada como pegada simples embora o tempo integral alocadas, que são fracionadas, onde os tempos são
disponível da tripulação não seja utilizado mediante a menores que os períodos diários integrais das tripulações,
variação de tolerância. diminuindo ao máximo o tempo restante para alocação
em cada jornada.
Sujeito a:
𝑡𝑟𝑖𝑝 =Ø (4.1)
𝑡𝑟𝑖𝑝 =Ø (4.2)
𝑗𝑜𝑟𝑛𝐴 + 𝑗𝑜𝑟𝑛𝐵 ≤ jDiaria (4.3)
Em (4) ocorre a alocação de duas jornadas para uma 3.8 Alocação de Tripulações Distintas com
mesma tripulação, diminuindo ao máximo o tempo Pegada Dupla
restante para alocação em cada jornada. Em (4.1) e (4.2)
garante-se que a tripulação candidata ainda não foi Caso ainda não tenha sido possível finalizar a alocação da
escalada para pegadas simples ou duplas. (4.3) busca jornada, ocorre a alocação de uma tripulação distinta com
garantir que a soma dos tempos restantes das jornadas a pegada dupla, respeitando o limite de duplas pegadas
serem alocadas não seja superior ao limite diário de para o dia, maximizando a ocorrência de duplas pegadas
trabalho possível para a tripulação candidata. possível para o dia.
𝑀𝑎𝑥 𝑞𝐷𝑢𝑝𝑙𝑎(𝑎𝑙𝑜𝑐(𝑡𝑟𝑖𝑝𝐴, 𝑗𝑜𝑟𝑛, 𝑑𝑖𝑎), 𝑎𝑙𝑜𝑐(𝑡𝑟𝑖𝑝𝐵, 𝑗𝑜𝑟𝑛, 𝑑𝑖𝑎)) (5)
Sujeito a:
𝑡𝑟𝑖𝑝 <> Ø (5.1)
𝑡𝑟𝑖𝑝 =Ø (5.2)
𝑗𝑜𝑟𝑛 ≤ 𝑡𝑟𝑖𝑝 (5.3)
Em (5) busca-se maximizar a quantidade de duplas 3.9 Alocação completa para Um Dia
pegadas possível para o dia, dentro do limite permitido.
As restrições (5.1) e (5.2) garantem que a tripulação Por fim, ocorre o processamento completo de um dia de
candidata só foi escalada para uma pegada simples e jornadas, o qual consiste em alocar todas as jornadas
ainda possui espaço para uma pegada dupla. (5.3) busca daquele dia às tripulações candidatas, respeitando as
garantir que o tempo restante a ser alocado na jornada da restrições de domínio do problema, até que não sobre
vez não seja superior ao tempo disponível para alocação tempo restante nas jornadas para ser alocado, buscando
na tripulação candidata. utilizar o mínimo de tripulações possível.
Sujeito a:
∀ 𝑗 ∈ 𝐽: 𝑎𝑙𝑜𝑐(𝑡𝑟𝑖𝑝, 𝑗, 𝑑𝑖𝑎) (6.1)
∀ 𝑗 ∈ 𝐽: 𝑗 > 0 (6.2)
Onde:
𝑇 = conjunto de tripulações disponível para o dia.
𝑗 = uma jornada.
𝐽 = conjunto de todas as jornadas a serem cumpridas no dia.
Em (6) busca-se cumprir integralmente um dia de 3.10 Tempo de Execução para Um Dia
jornadas alocando o mínimo de tripulações necessário. Já
em (6.1) ocorre o procedimento de alocação de jornadas Após realizar a alocação completa para um dia de
para cada jornada do dia. Em (6.2) garante que todas as jornadas, é possível avaliar o tempo de execução gasto
jornadas do dia foram alocadas em sua totalidade, sem para gerar a escala do dia correspondente.
tempo restante pendente.
100
𝑡𝑝𝐷𝑖𝑎 = ∗ 𝑒𝑥𝑒𝑐𝑇𝑖𝑚𝑒(𝑇, 𝐽, 𝑑𝑖𝑎) (7)
𝑞𝑇𝑟𝑖𝑝
Sujeito a:
𝑞𝑇𝑟𝑖𝑝 ≥ 1 (7.1)
∀ 𝑗 ∈ 𝐽: 𝑎𝑙𝑜𝑐(𝑡𝑟𝑖𝑝, 𝑗, 𝑑𝑖𝑎) (7.2)
∀ 𝑗 ∈ 𝐽: 𝑗 > 0 (7.3)
Onde:
𝑡𝑝𝐷𝑖𝑎 = tempo de execução para alocar um dia de jornadas.
𝑇 = conjunto de tripulações disponível para o dia.
𝑞𝑇𝑟𝑖𝑝 = quantidade de tripulação utilizada para escalonar o dia.
𝑒𝑥𝑒𝑐𝑇𝑖𝑚𝑒 = tempo de processamento do algoritmo para geração da alocação completa
para o dia.
𝑗 = uma jornada.
𝐽 = conjunto de todas as jornadas a serem cumpridas no dia.
Em (7) avalia-se o tempo de execução necessário para 3.11 Tempo de Execução para Um Horizonte de
um dia de alocação de jornadas, avaliando o tempo gasto Planejamento
para gerar um dia de planejamento completo. (7.1) exige
que a quantidade de tripulações seja maior que zero. Em A partir do resultado da Função 7, é possível calcular
(7.2) realiza-se o procedimento de alocação de jornadas para cada dia do horizonte de planejamento o tempo de
para cada jornada do dia. (7.3) garante que todas as execução total do algoritmo, conforme a Função 8:
jornadas do dia foram alocadas em sua totalidade, sem
tempo restante pendente.
𝑡𝑝𝑇𝑜𝑡𝑎𝑙 = 𝑡𝑝𝐷𝑖𝑎
(8)
Sujeito a:
𝑞𝐷𝑖𝑎𝑠 ≥ 1 (8.1)
Onde:
𝑡𝑝𝑇𝑜𝑡𝑎𝑙 = tempo de execução para alocar todas as jornadas em todos os dias no horizonte
de planejamento.
𝑡𝑝𝐷𝑖𝑎 = tempo de execução para alocar um dia de jornadas.
Em (8) busca-se avaliar o tempo gasto para gerar um 3.12 Algoritmo da Primeira Etapa
horizonte de planejamento completo válido. (8.1) exige
que a quantidade de dias do horizonte de planejamento Conforme a modelagem elucidada, foi criado o
seja no mínimo 1. Simulador de Alocação de Tripulações (SAT), como
pode ser conferido no Algoritmo 1:
Algoritmo 1: processaDia(trip,jDia,dia)
Retorno: uma matriz válida preenchida com horários de alocação de tripulações para um dia de jornadas, respeitando
as restrições de domínio e com todas as Restrições de Desempenho ativadas.
INÍCIO
1 𝑎𝑙𝑜𝑐𝑎𝑐𝑜𝑒𝑠𝑆𝑖𝑚𝑝𝑙𝑒𝑠(𝑗𝐷𝑖𝑎, 𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎)
2 𝑡𝑟𝑜𝑐𝑎𝐴𝑙𝑜𝑐𝑎𝑐𝑜𝑒𝑠(𝑗𝐷𝑖𝑎, 𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎)
3 𝑎𝑙𝑜𝑐𝑎𝑐𝑜𝑒𝑠𝐷𝑢𝑝𝑙𝑎𝑠(𝑗𝐷𝑖𝑎, 𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎)
4 𝑆𝑒 𝑗𝑜𝑟𝑛𝑃𝑒𝑛𝑑𝑒𝑛𝑡𝑒(𝑗𝐷𝑖𝑎) ≥ 2) 𝑒 (𝑞𝐷𝑢𝑝𝑙𝑎(𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎) < 𝑙𝑖𝑚𝐷𝑢𝑝𝑙𝑎𝑃𝑒𝑔𝑎𝑑𝑎
5 𝑜𝑟𝑑𝑒𝑛𝑎𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠𝐶𝑜𝑑(𝑗𝐷𝑖𝑎)
6 𝑟𝑒𝑓𝑎𝑧𝐴𝑙𝑡𝑒𝑟𝑛𝑎𝑐𝑎𝑜(𝑗𝐷𝑖𝑎, 𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎)
7 𝑎𝑙𝑜𝑐𝑎𝑐𝑜𝑒𝑠𝑆𝑖𝑚𝑝𝑙𝑒𝑠(𝑗𝐷𝑖𝑎, 𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎);
8 𝑡𝑟𝑜𝑐𝑎𝐴𝑙𝑜𝑐𝑎𝑐𝑜𝑒𝑠(𝑗𝐷𝑖𝑎, 𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎)
9 𝑎𝑙𝑜𝑐𝑎𝑐𝑜𝑒𝑠𝐷𝑢𝑝𝑙𝑎𝑠(𝑗𝐷𝑖𝑎, 𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎)
11 𝑺𝒆 𝑗𝑜𝑟𝑛𝑃𝑒𝑛𝑑𝑒𝑛𝑡𝑒(𝑗𝐷𝑖𝑎) > 0
12 𝑓𝑖𝑛𝑎𝑙𝑖𝑧𝑎𝐷𝑖𝑎(𝑗𝐷𝑖𝑎, 𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎)
13 𝑺𝒆 𝑗𝑜𝑟𝑛𝑃𝑒𝑛𝑑𝑒𝑛𝑡𝑒(𝑗𝐷𝑖𝑎) > 0
14 𝑎𝑢𝑚𝑒𝑛𝑡𝑎𝑇𝑟𝑖𝑝(𝑞𝑇𝑟𝑖𝑝)
15 𝑟𝑒𝑖𝑛𝑖𝑐𝑖𝑎
16 𝑺𝒆𝒏ã𝒐
17 𝑹𝒆𝒕𝒐𝒓𝒏𝒂 𝑡𝑟𝑖𝑝
FIM
(elaborado pelo autor)
3.13 Segunda Etapa: Algoritmo Genético as tripulações são processadas no SAT a cada dia, visto
Aplicado ao SAT (Método Híbrido) que a posição em que cada tripulação é processada e
escalonada por dia resulta em diferentes soluções.
O método utilizado na primeira etapa desta pesquisa Explorar a quantidade total de combinações possíveis no
resulta em uma solução determinística, com um modelo com uma solução exata se mostrou
Simulador de Alocação de Tripulações que gera uma computacionalmente inviável. A Função 9 representa a
solução válida para um horizonte de planejamento, porém quantidade de combinações possíveis:
a qualidade da solução obtida depende da ordem em que
𝑞𝑇𝑟𝑖𝑝! (9)
De acordo com a quantidade de dias do horizonte de diversos problemas que são naturalmente representados
planejamento e a quantidade de tripulações, o espaço de por permutações. Sendo o Problema da Programação de
busca de combinações possível cresce exponencialmente. Tripulações um deles, o qual pode ser abordado como um
Para um horizonte de planejamento como a média problema de sequenciamento de tarefas relacionadas. Os
utilizada na literatura de 49 dias (7 semanas), dependendo objetivos desta etapa se aplicam a cada dia do horizonte
da quantidade de tripulações utilizada a quantidade de de planejamento completo, buscando otimizá-lo ainda
combinações possível é absurda. mais. São eles:
Sendo assim optou-se por complementar o método
acrescentando uma heurística de otimização estocástica, Minimizar o tempo ocioso e quantidade de
aplicando um Algoritmo Genético utilizando codificação tripulação necessários para cumprir o horizonte de
por permutação e combinado com o simulador planejamento.
desenvolvido. ZUBEN (2000) reforça que existem
Equilibrar a distribuição das horas extras, ociosas e correspondem a soluções válidas. Os indivíduos que não
dos dias trabalhados pelas tripulações. geram soluções válidas são automaticamente descartados.
100 100
𝑀𝑖𝑛 𝑔 = 𝑡𝑑𝑖𝑠𝑝 ∗ + 𝑡𝐸𝑥𝑡𝑟𝑎 ∗
𝑡𝑑𝑖𝑠𝑝𝑡𝑜𝑡 𝑡𝑒𝑥𝑡𝑟𝑎𝑡𝑜𝑡 (10)
Sujeito a:
g∈𝐺 (10.1)
Onde:
𝐺 = conjunto de soluções válidas para um dia de alocação.
𝑞𝑇𝑟𝑖𝑝 = quantidade de tripulação utilizada.
𝑡𝐷𝑖𝑠𝑝 = tempo disponível de cada tripulação.
𝑡𝐷𝑖𝑠𝑝𝑇𝑜𝑡 = tempo disponível total da tripulação.
𝑡𝐸𝑥𝑡𝑟𝑎 = horas extras realizadas por cada tripulação.
𝑡𝐸𝑥𝑡𝑟𝑎𝑇𝑜𝑡 = horas extras totais da tripulação.
O algoritmo genético também equilibra a quantidade 3.16 Algoritmo da Segunda Etapa: Método
de dias trabalhados e folgas entre a tripulação no final do Híbrido Completo
processamento do horizonte de planejamento através da
realização do rodízio das tripulações escalonadas. Conforme proposto nesta pesquisa, foi criado o método
híbrido completo, incorporando o algoritmo genético
proposto ao Algoritmo 1, como segue:
Algoritmo 2: otimizaEscala(trip,jDia,escala)
Retorno: a melhor matriz válida atingida para o dia, de acordo com a Função 10, preenchida com horários de
alocação de tripulações para um dia de jornadas, respeitando as restrições de domínio e com todas as Restrições de
Desempenho ativadas.
INÍCIO
1 𝑒𝑠𝑐𝑎𝑙𝑎𝑠 ← 𝑖𝑛𝑖𝑐𝑖𝑎𝑙𝑖𝑧𝑎𝐸𝑠𝑐𝑎𝑙𝑎(𝑑𝑎𝑡𝑎𝐼𝑛𝑖𝑐𝑖𝑜, 𝑞𝐷𝑖𝑎𝑠)
2 𝑡𝑟𝑖𝑝 ← 𝑖𝑛𝑖𝑐𝑖𝑎𝑙𝑖𝑧𝑎𝑇𝑟𝑖𝑝(𝑒𝑠𝑐𝑎𝑙𝑎)
3 𝑡𝑜𝑑𝑎𝑠𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠 ← 𝑐𝑎𝑟𝑟𝑒𝑔𝑎𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠()
4 𝑡𝑜𝑑𝑎𝑠𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠 ← 𝑒𝑠𝑡𝑟𝑢𝑡𝑢𝑟𝑎𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠(𝑡𝑜𝑑𝑎𝑠𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠)
5 𝑡𝑜𝑑𝑎𝑠𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠 ← 𝑎𝑙𝑜𝑐𝑎𝑐𝑎𝑜𝐴𝑙𝑡𝑒𝑟𝑛𝑎𝑑𝑎(𝑡𝑜𝑑𝑎𝑠𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠)
6 𝒑𝒂𝒓𝒂 𝒄𝒂𝒅𝒂 𝑑𝑖𝑎 𝒆𝒎 𝑒𝑠𝑐𝑎𝑙𝑎𝑠 𝒇𝒂ç𝒂
7 𝑡𝑟𝑖𝑝 ← 𝑒𝑠𝑐𝑎𝑙𝑎𝐷𝑜𝐷𝑖𝑎(𝑡𝑟𝑖𝑝, 𝑑𝑖𝑎)
8 𝑗𝑜𝑟𝑛 ← 𝑔𝑒𝑡𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠(𝑡𝑜𝑑𝑎𝑠𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠, 𝑑𝑖𝑎)
9 𝒑𝒂𝒓𝒂 𝒄𝒂𝒅𝒂 𝑔𝑒𝑟𝑎𝑐𝑎𝑜 𝒆𝒎 𝑔𝑒𝑟𝑎𝑐𝑜𝑒𝑠 𝒇𝒂ç𝒂
10 𝑝𝑜𝑝[ ] ← Ø
11 𝑺𝒆 𝑒𝑙𝑖𝑡𝑖𝑠𝑚𝑜 𝒆 𝑚𝑒𝑙ℎ𝑜𝑟 <> Ø
12 𝑝𝑜𝑝[ ] ← 𝑚𝑒𝑙ℎ𝑜𝑟
13 𝒆𝒏𝒒𝒖𝒂𝒏𝒕𝒐 𝑝𝑜𝑝𝑢𝑙𝑎𝑐𝑎𝑜 < 𝑡𝑎𝑚𝑃𝑜𝑝𝑢𝑙𝑎𝑐𝑎𝑜 𝒇𝒂ç𝒂
14 𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝 ← 𝑔𝑒𝑟𝑎𝐼𝑛𝑑𝑖𝑣𝑖𝑑𝐴𝑙𝑒𝑎𝑡(𝑡𝑟𝑖𝑝, 𝑞𝑇𝑟𝑖𝑝)
15 𝑗𝐷𝑖𝑎𝑇𝑒𝑚𝑝 ← 𝑗𝑜𝑟𝑛
16 𝑺𝒆 𝑝𝑟𝑜𝑐𝑒𝑠𝑠𝑎𝐷𝑖𝑎(𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝, 𝑗𝐷𝑖𝑎𝑇𝑒𝑚𝑝, 𝑑𝑖𝑎)
17 𝑖𝑛𝑑𝑖𝑣 ← Ø
18 𝑖𝑛𝑑𝑖𝑣[𝑓𝑖𝑡𝑛𝑒𝑠𝑠] ← 𝑎𝑣𝑎𝑙𝑖𝑎(𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝)
19 𝑖𝑛𝑑𝑖𝑣[𝑔𝑒𝑛𝑒𝑠] ← 𝑠𝑒𝑞(𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝)
20 𝑖𝑛𝑑𝑖𝑣[𝑡𝑟𝑖𝑝] ← 𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝
21 𝑖𝑛𝑑𝑖𝑣[𝑗𝐷𝑖𝑎] ← 𝑗𝐷𝑖𝑎𝑇𝑒𝑚𝑝
22 𝑝𝑜𝑝[ ] ← 𝑖𝑛𝑑𝑖𝑣
23 𝑝𝑎𝑖𝑠 ← 𝑠𝑒𝑙𝑒𝑐𝑎𝑜(𝑝𝑜𝑝)
24 𝑺𝒆 𝑟𝑎𝑛𝑑(0.1,100) ≤ 𝑡𝑥𝐶𝑟𝑢𝑧
25 𝑓𝑖𝑙ℎ𝑜 ← 𝑐𝑟𝑢𝑧𝑎𝑚𝑒𝑛𝑡𝑜(𝑝𝑎𝑖𝑠)
26 𝑺𝒆 𝑟𝑎𝑛𝑑(0.1,100) ≤ 𝑡𝑥𝑀𝑢𝑡
27 𝑓𝑖𝑙ℎ𝑜 ← 𝑚𝑢𝑡𝑎𝑐𝑎𝑜(𝑓𝑖𝑙ℎ𝑜, 𝑞𝑇𝑟𝑖𝑝)
28 𝑺𝒆 𝑓𝑖𝑙ℎ𝑜
29 𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝 ← 𝑓𝑖𝑙ℎ𝑜[𝑡𝑟𝑖𝑝]
30 𝑗𝐷𝑖𝑎𝑇𝑒𝑚𝑝 ← 𝑗𝑜𝑟𝑛
31 𝑺𝒆 𝑝𝑟𝑜𝑐𝑒𝑠𝑠𝑎𝐷𝑖𝑎(𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝, 𝑗𝐷𝑖𝑎𝑇𝑒𝑚𝑝, 𝑑𝑖𝑎)
32 𝑖𝑛𝑑𝑖𝑣 ← Ø
33 𝑖𝑛𝑑𝑖𝑣[𝑓𝑖𝑡𝑛𝑒𝑠𝑠] ← 𝑎𝑣𝑎𝑙𝑖𝑎(𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝)
34 𝑖𝑛𝑑𝑖𝑣[𝑔𝑒𝑛𝑒𝑠] ← 𝑠𝑒𝑞(𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝)
35 𝑖𝑛𝑑𝑖𝑣[𝑡𝑟𝑖𝑝] ← 𝑡𝑟𝑖𝑝𝑇𝑒𝑚𝑝
36 𝑖𝑛𝑑𝑖𝑣[𝑗𝐷𝑖𝑎] ← 𝑗𝐷𝑖𝑎𝑇𝑒𝑚𝑝
37 𝑝𝑜𝑝[ ] ← 𝑖𝑛𝑑𝑖𝑣
38 𝑚𝑒𝑙ℎ𝑜𝑟 ← 𝑏𝑒𝑠𝑡(𝑝𝑜𝑝)
39 𝑡𝑟𝑖𝑝 ← 𝑚𝑒𝑙ℎ𝑜𝑟[𝑡𝑟𝑖𝑝]
40 𝑗𝐷𝑖𝑎 ← 𝑚𝑒𝑙ℎ𝑜𝑟(𝑗𝐷𝑖𝑎)
41 𝑡𝑟𝑖𝑝 ← 𝑎𝑡𝑢𝑎𝑙𝑖𝑧𝑎𝑇𝑟𝑖𝑝(𝑡𝑟𝑖𝑝)
42 𝑗𝐷𝑖𝑎 ← 𝑜𝑟𝑑𝑒𝑛𝑎𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠𝐶𝑜𝑑(𝑗𝐷𝑖𝑎)
43 𝑎𝑡𝑢𝑎𝑙𝑖𝑧𝑎𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠(𝑡𝑜𝑑𝑎𝑠𝐽𝑜𝑟𝑛𝑎𝑑𝑎𝑠)
44 𝒓𝒆𝒕𝒐𝒓𝒏𝒂 𝑡𝑟𝑖𝑝
FIM
(elaborado pelo autor)
4.1 Desempenho do Simulador de Alocação de uma das restrições foi possível analisar o comportamento
Tripulações SAT (Algoritmo 1) dos resultados obtidos e comprovado que todas as
restrições ativadas são importantes para se obter o melhor
Os testes foram realizados baseando-se nas restrições de valor da função objetivo.
desempenho, descritas no Quadro 2, avaliando o Nota-se na Tabela 2 que a medida que cada restrição de
desempenho do Algoritmo 1 de acordo com a retirada de desempenho do Quadro 2 foi sendo desativada os
cada restrição, denotando a sua importância para a resultados obtidos variaram, piorando cada vez mais com
qualidade dos resultados obtidos. a retirada de cada restrição e melhorando
O horizonte de planejamento utilizado nos testes significativamente com todas as restrições ativadas, com
conforme os trabalhos relacionados na área foi de 49 dias. o melhor resultado na primeira linha.
Foi utilizada a Função Objetivo 8 (tempo de execução
para um horizonte de planejamento). Ao remover cada
Tabela 2 – Desempenho do Simulador de Alocação de Tripulações
Restrição Média de
F.O.
de Q. Horas Horas Dupla trip. não Tempo de
Q. escalas. (Função
desempenho trip. extras ociosas pegada utilizada process.
8)
desativada p/ dia
Nenhuma 161 650h04 973h06 847/931 6048/6762 38/161 24,69s 9,62
6 186 650h04 1154h26 847/1078 6048/7812 63/186 23,32s 12,54
3 202 263h05 6744h07 0/1176 6874/8484 62/202 35,31s 17,48
1 162 645h03 969h35 833/931 6048/6804 39/162 29,65s 18,30
5 175 0h 2983h02 945/1029 6405/7350 44/175 52,98s 30,27
7 162 567h35 1318h27 854/931 6104/6804 37/162 94,39s 58,26
4 171 813h10 2655h52 959/1029 6048/7182 44/171 164,30s 96,08
2 - - - - - - 1655,77s -
(elaborado pelo autor)
4.5 Desempenho do Método Híbrido Completo O Algoritmo 2 trabalhou variando a ordem de entrada
(Algoritmo 2) das tripulações para processamento em dia de alocação
do horizonte de planejamento no simulador, mantendo a
Nesta fase foram geradas variações no algoritmo solução de melhor da aptidão encontrada para o dia
analisando o seu comportamento, também em um (Função 10). Na Tabela 3 são exibidos resultados
horizonte de planejamento de 49 dias, com os parâmetros aplicando o método Híbrido Completo, sintetizado no
que geraram o melhor resultado do Simulador de Algoritmo 2.
Alocação de Tripulações (Tabela 2, primeira linha) ou
seja, sem a desativação de nenhuma restrição.
Figura 9 – Minimização e equilíbrio das horas extras da tripulação (elaborado pelo autor).
Enquanto que no Algoritmo 1 algumas tripulações 4.9 Horas Ociosas da Tripulação
tiveram uma alta quantidade de horas extras, no
Algoritmo 2 os resultados para cada tripulação tiveram A quantidade das horas ociosas por tripulação foi
pouca variação. minimizada no Algoritmo 2, conseqüência também da
minimização da quantidade de tripulações necessária para
cumprir o horizonte de planejamento, como pode ser
conferido na Figura 10:
Figura 10 – Minimização e equilíbrio das horas ociosas da tripulação (elaborado pelo autor).
Também pode-se notar na Figura 10 que no Algoritmo para esta pesquisa. O horizonte de planejamento foi de 30
2 equilibrou-se a quantidade de horas ociosas da dias de acordo com o relatório cedido pela empresa.
tripulação. Nestes testes foram utilizadas as configurações que
obtiveram o melhor desempenho do Simulador Alocação
4.10 Comparativo com um cenário real de Tripulações (Tabela 2, primeira linha) e do Método
Híbrido (Tabela 3, primeira linha). Foi considerada
Na Tabela 4 é possível avaliar os resultados obtidos também pelo menos uma folga no domingo dentro do
comparando com um cenário real de alocação utilizado horizonte de planejamento.
na empresa que cedeu os dados das jornadas (Tabela 1)
Referências
CUNHA, C. B. Aspectos práticos da aplicação de
modelos de roteirização de veículos a problemas reais.
Revista Transportes da ANPET – Associação Nacional
de Pesquisa e Ensino em Transportes, v. 8, p. 51-74,
nov. 2014.
MARTINS, L. C.; SILVA, G.P. Algoritmos genéticos
aplicados ao problema do rodízio de tripulações. 47º
Simpósio Brasileiro de Pesquisa Operacional, Porto de
Galinhas (PE), 2015.
MAURI, G.R. & LORENA, L.A.N. A new hybrid
heuristic for driver scheduling. International Journal
of Hybrid Intelligent Systems, v. 4, p. 39-47, 2007.
MAYRINK, V. T. M. & SILVA, G. P. Otimização da
escala mensal de tripulações do sistema de transporte
público. Panorama Nacional da Pesquisa em
Transportes, v. 1, p. 185-197, 2010.
PRATES, R. F. C., SILVA, G. P. Otimização da Escala
Mensal de Motoristas de Ônibus Urbano Utilizando a
Heurística Variable Neighborhood Search. Revista
Transportes, v. 22, nº1, (2014), p. 31–43.
SILVA, T. A.; SILVA, G. Resolvendo o problema de
programação de tripulações de ônibus urbano com a
metaheurística guided local search. Congresso
Nacional de Pesquisa em Transporte da ANPET,
Universidade Federal de Ouro Preto, 2015.
SOUZA, C. C., MOURA, A. V., & YUNES, T. H.
(2005). Hybrid Column Generation Approaches for
Urban Transit Crew Management. Transportation
Science, v. 39, p. 273‐288.
VIEIRA, A. B. Roteirização de Ônibus Urbano: escolha
de um método para as grandes cidades brasileiras.
Dissertação de Mestrado em Engenharia de
Transportes. Universidade de São Paulo, 1999.
ZUBEN, F. J. V. Computação evolutiva: Uma
abordagem pragmática. In: Anais da I Jornada de
Estudos em Computação de Piracicaba e Região (1a.
JECOMP), Piracicaba, SP, 2000, p. 25–45.