• Nenhum resultado encontrado

Experimento 3: Instância inspirada em uma grade real

4.4 Experimentos Computacionais

4.4.3 Experimento 3: Instância inspirada em uma grade real

Este experimento foi realizado com o objetivo de analisar a aplicação do algoritmo de distribuição nebulosa em relação problemas similares a instâncias reais. Neste experimentos utilizou-se uma função de pertinência genérica parametrizada por um fator de imprecisão f .

A função de pertinência da demanda d considerada muito confiável e representada pelo número nebuloso (nd, nd, nd· f , nd· f ), de acordo com a equação 4.1, é

µGEN ´ERICA(t) =            Lt−nd+nd·f nd·f  se t ∈ [nd− nd· f, nd) 1 se t ∈ [nd, nd] Rnd+nd·f −t nd·f  se t ∈ (nd, nd+ nd· f ) 0 caso contrário

onde f é um número no intervalo [0, 1]. Se f = 0 significa que não existe imprecisão e o resultado do algoritmo nebuloso é equivalente ao resultado do algoritmo de distribuição clássico, se f = 1 significa que existe um grau máximo de imprecisão. A Fig. 4.12 mostra as funções de pertinência para uma demanda de 12 vagões com diferentes valores para f .

Fig. 4.12: Funções de pertinência para demanda de 12 vagões com diferentes valores de f Neste experimento foi gerado um problema baseado em uma grade de trens real, o problema tem 30 trens, 30 tipos de vagões e horizonte de tempo de 1 dia. O mesmo problema foi resolvido para diferentes valores de f o tempo de processamento e custo das soluções obtidas são mostrados na tabela 4.5.

A partir dos resultado pode-se observar que o algoritmo de distribuição clássico é um caso parti- cular do algoritmo nebuloso, para isto, é necessário utilizar a função de pertinência genérica com fator

Distribuição

Custo Tempo (milisegundos) 7472.8 13

Distribuição Nebuloso

f Custo Tempo (milisegundos) 0 7472.8 552

0.25 6436.6 542 0.5 3758.2 553 0.75 1369.5 633

1 0 654

Tab. 4.5: Resultados do algoritmo de distribuição(Cap. 3) e do algoritmo de distribuição nebuloso para o problema do experimento 3 com diferentes valores de f

f = 0. Além disto, o algoritmo nebuloso resolve o problema para situações onde existe imprecisão na demanda de transporte.

Analisando os resultados da tabela 4.5 pode-se verificar que caso a imprecisão seja muito grande o algoritmo optou por não movimentar vagões, para evitar gastos com movimentações desnecessárias. Considerando-se o tempo de processamento pode-se verificar que o algoritmo nebuloso é muito mais lento que o algoritmo clássico, porém o tempo foi em todos casos menor que 1 minuto.

4.5

Resumo

Neste capítulo foi apresentado um modelo e um algoritmo para distribuição de vagões vazios com imprecisão na demanda. A imprecisão foi modelada utilizando números nebulosos. O resultado do algoritmo é a determinação da quantidade e tipos de vagões que serão movimentados entre os pares origem-destino da ferrovia, considerando demandas imprecisas. O objetivo foi obter uma solução estrategicamente mais sofisticada, com menor custo de transporte e maior robustez.

Capítulo 5

Algoritmo de Alocação de Vagões

5.1

Introdução

Esse capítulo apresenta o algoritmo de alocação de vagões vazios. O algoritmo aloca vagões aos trens da grade, de forma que, para que os vagões sejam transportados de sua localização de origem até os pátios das demandas. O algoritmo considera: a) restrições de capacidade dos trens; b) custo de movimentação de vagões; c) solicitações de movimentação de vagões (geradas pelo algoritmo de distribuição). Desta forma, o algoritmo produz soluções realistas e otimizadas. Nos testes experimen- tais (Cap. 6), verificou-se que o tempo de processamento do algoritmo foi satisfatório para resolver o problema em tempo real. Além disto, as soluções geradas pelo algoritmo tiveram boa qualidade em relação à eficiência de atendimento a demanda. Ao final do capítulo um exemplo da utilização deste algoritmo é apresentado.

5.2

Descrição do Algoritmo

Nesta seção o algoritmo de alocação de vagões vazios é descrito, para facilitar o entendimento do algoritmo serão feitas algumas definições.

O algoritmo de alocação de vagões vazios é uma heurística gulosa.

Heurísticas gulosas são técnicas de construção de algoritmos heurísticos que tentam obter uma boa solução (eventualmente ótima), considerando a cada iteração a melhor decisão utilizando um critério de otimização meramente local (Campello and Maculan, 1994).

O algoritmo é caracterizado como heurística gulosa, pois constrói a solução elemento a elemento o plano de alocação, alocação dos vagões à rota de custo mínimo (critério de otimização) até encontrar uma solução viável satisfatória (não existência de ofertas para atender as demandas).

Além disto, o algoritmo tenta melhorar a solução que está sendo construída, a cada passo, através de operações de troca(realocação de demandas) até que não seja mais possível a melhoria.

Uma das entradas do algoritmo de alocação de vagões são as solicitações de movimentação de vagões produzidas pelo plano de distribuição. As SMV’s são representadas por LSM V. O algoritmo

de alocação, busca atender toda SM V ∈ LSM V alocando os vagões da SM V aos trens da grade de

trens para que sejam levados de suas origens oSM V aos seus destinos finais dSM V.

Uma outra entrada do algoritmo de alocação é a grade de trens, denotada por G. Cada trem t ∈ G, tem os seguintes atributos:

• ct: capacidade do trem t em número de vagões

• Pt: lista de pátios que estão no percurso do trem t

A grade de trens é utilizada pelo algoritmo de alocação, pois contém a programação dos trens, suas rotas e capacidades. Os trens das grades são utilizados para transportar os vagões entre os pátios. O plano de alocação produzido pelo algoritmo respeita a restrição de capacidade do trem.

Um conceito que é muito utilizado pelo algoritmo é a rota. Fig. 5.1 mostra a representação gráfica de uma rota. Rota é um caminho ocupado por um ou mais trens.

Fig. 5.1: Representação gráfica da rota r1

Considere nT iA,B o número total de vagões alocados ao trem Ti do pátio A ao pátio B, sendo

A, B ∈ Pt.

A rota r1mostrada na Fig. 5.1 conecta a oferta de 30 vagões do tipo 1 no pátio TOM à demanda

de 15 vagões do tipo 1 em ZZX. Seja cr1 a capacidade disponível da rota r1. A capacidade disponível

de uma rota determina o número de vagões que a rota pode transportar, levando em consideração vagões que já estão sendo movimentados e a capacidade dos trens que compõe a rota. Para a rota r1

da Fig. 5.1 a capacidade disponível é dada por

cr1 = min   cT 1− nT 1T OM,ZRV  ,  cT 1− nT 1ZRV,ZAR  ,  cT 3− nT 3ZAR,ZAP  ,  cT 4− nT 4ZAP,ZZX  .

5.2 Descrição do Algoritmo 51

Além destas entradas, o algoritmo de alocação também utiliza o conjunto de todas as demandas D e o conjunto de todas as ofertas O para produzir o plano de alocação.

Após definidas as entradas, o funcionamento básico do algoritmo de alocação é resumido nas 2 etapas descritas abaixo:

• atendimento as SMV’s, ∀SM V ∈ LSM V : primeiramente, o algoritmo busca atender as SMV’s

geradas pelo algoritmo de distribuição. O algoritmo busca alocar os vagões da oferta oSM V aos

trens da grade de trens G para que sejam transportados até as demandas dSM V, respeitando as

capacidades dos trens.

• atendimento às demais demandas, ∀d ∈ F (lista de demandas não atendidas) : após a realização da primeira etapa, o algoritmo busca encontrar alguma oferta às demandas que ainda não foram atendidas na primeira etapa.

O algoritmo constrói o plano de alocação elemento a elemento, considerando como critério de otimização a rota com caminho mínimo para alocar os vagões entre as ofertas e demandas.

Na primeira etapa, o algoritmo busca encontrar para toda SM V uma rota r com capacidade disponível cr > 0 e o custo é mínimo (Shortest Path in Acyclic Networks, Ahuja et al. (2008)) para

transportar os vagões da oferta oSM V até a demanda dSM V. Caso esta rota seja encontrada, os vagões

da SM V são alocados aos trens que compõe a rota. Caso uma rota não seja encontrada, o algoritmo busca encontrar uma oferta que esteja disponível para atender dSM V. Caso não exista nenhuma oferta

disponível para atender a demanda dSM V, o algoritmo busca realocar alguma demanda que já foi

atendida para disponibilizar alguma oferta que atenda dSM V. Uma realocação é possível quando uma

oferta é disponibilizada para a demanda não atendida dSM V, e a demanda que estava alocada a oferta

disponibilizada encontra uma outra oferta para atendê-la.

Na segunda etapa, o algoritmo busca atender as demandas ainda não atendidas. Após a realização da primeira etapa, demandas podem permanecer não atendidas, pois alguma SMV criada pelo algo- ritmo de distribuição pode não ter sido atendida devido as restrições de capacidade dos trens impostas pelo algoritmo de alocação e a oferta da SMV oSM V continua disponível podendo atender alguma

demanda que não havia sido atendida na etapa de distribuição. Neste caso, o algoritmo busca uma oferta disponível oD para atender a demanda d. Caso exista uma oferta oD que atenda d, o algoritmo

verifica se existe uma rota com capacidade disponível conectando oD a d. Em caso afirmativo, os

vagões de oD são atribuídos a demanda d e alocados aos trens da rota. Caso contrário, o algoritmo

busca realocar alguma demanda atendida dApara disponibilizar alguma oferta para atender d. Para

que isto ocorra, deve existir uma oferta alternativa para atender a demanda dA. Neste caso, dA é

atendido pela oferta alternativa encontrada e a oferta que havia sido previamente alocada a dAé agora

alocada a demanda d.

Os resultados do algoritmo são as alocações vagão-trem. Estas alocações definem onde serão realizadas as atividades de anexação (pátio onde o vagão se encontra) e desanexação (pátio destino do vagão, ou pátio onde o vagão será deixado para ser anexado a outro trem até chegar no seu destino final) que serão realizadas nos trens. O plano de alocação de vagões deve ser passados aos pátios o mais rápido possível, para que as manobras dos vagões que serão anexados sejam realizadas antes da chegada do trem, evitando atrasos.

Entrada: solicitações de movimentação de vagões (LSM V), grade de trens (G),

demandas (D) e ofertas (O) Saída: vagões alocados aos trens início

1

Ordenar(LSM V); 2

para cada SM V ∈ LSM V faça 3

rota ← EncontrarRota(oSM V,dSM V); 4

serota ! = ∅ então

5

totalDisponivel ← min(crota,nSM V); 6

AtualizarPlanoAlocacao(rota, totalDisponivel);

7 AtualizarOfertasEDemandas(totalDisponivel); 8 se nSM V > 0 então 9 ofertaDisponivel ← EncontrarOferta(dSM V); 10 seofertaDisponivel ! = ∅ então 11 rota ← EncontrarRota(ofertaDisponivel, dSM V); 12 serota ! = ∅ então 13

totalDisponivel ← min (crota, fdSM V);

14 AtualizarPlanoAlocacao(rota, totalDisponivel); 15 AtualizarOfertasEDemandas(totalDisponivel); 16 se nSM V > 0 então 17 totalRealocado ← RealocarDemandaAtendida(dSM V); 18 setotalRealocado > 0 então 19

AtualizarPlanoAlocacao(rota, totalRealocado);

20 AtualizarOfertasEDemandas(totalRealocado); 21 enquanto F ! = ∅ faça 22 Ordenar(F ); 23

para cada d ∈ F faça

24 ofertaDisponivel ← EncontrarOferta(d); 25 seofertaDisponivel ! = ∅ então 26 rota ← EncontrarRota(ofertaDisponivel, d); 27 serota ! = ∅ então 28

totalDisponivel ← min (crota, fd); 29

AtualizarPlanoAlocacao(rota, totalDisponivel);

30 AtualizarOfertasEDemandas(totalDisponivel); 31 senão 32 totalRealocado ← RealocarDemandaAtendida(dSM V); 33 setotalRealocado > 0 então 34

AtualizarPlanoAlocacao(rota, totalRealocado);

35 AtualizarOfertasEDemandas(totalRealocado); 36 else RemoverDemanda(F , d) 37 fim 38

5.2 Descrição do Algoritmo 53

O pseudocódigo do algoritmo de alocação (5.2) mostra que no início de cada uma das 2 principais etapas do algoritmo existe uma etapa de ordenação. Esta ordenação prioriza as SMV’s ou demandas que tem menos rotas para serem atendidas e tem o prazo final mais próximo. Caso uma demanda tenha apenas uma rota conectando-a a oferta, esta demanda tem prioridade e é alocada antes de outras demandas que tem mais de uma rota até as ofertas. As demandas que tem apenas uma rota não tem outras opções para serem atendidas, e portanto, devem ser alocadas a rota existente. Caso as demandas tenham a mesma quantidade de rotas, são priorizadas as demandas que estão com prazo mais próximo.

Os métodos utilizados no pseudocódigo do algoritmo são descritos abaixo:

• Ordenar: ordena a lista de SMV’s(ou demandas) pela número de rotas existentes entre a oferta oSM V e a demanda dSM V. Ao final da ordenação, as demandas que tiverem uma única

rota disponível estarão no início da lista LSM V, ou seja, terão seus vagões alocados antes das

demanda que tem mais de uma rota disponível. O outro critério existe para o caso das demandas terem a mesma quantidade de rotas disponíveis, neste caso as demandas que que estão com o prazo final mais próximos serão atendidas primeiro, este critério é muito importante, pois as demandas que estão com o prazo para acabar, tem menos chances de serem canceladas e menos chances de receberem vagões que possam vir a ser disponibilizados por outras demandas canceladas;

• EncontrarRota(Oferta o, Demanda d): retorna a rota r de menor custo dentre as rotas existentes entre a oferta o e a demanda d;

• AtualizarPlanoAlocacao(Rota r, Inteiro q): atualiza o plano de alocação con- siderando os q vagões que foram alocados aos trens da rota r;

• AtualizarOfertasEDemandas(Inteiro q): atualiza o número de vagões da demanda que foram atendidos, o número de vagões disponíveis na oferta;

• EncontrarOferta(Demanda d): considerando todas as ofertas o onde do > 0 e o ∈ O,

retorna a oferta o que tem a rota r entre o e d com cr> 0;

• RealocarDemandaAtendida(d): busca realocar uma das demandas previamente atendi- das, o método retorna a quantidade de vagões que foi realocada. Este método faz busca para encontrar todas as ofertas que podem atender a demanda d, caso nenhuma destas ofertas esteja disponível procura para as demandas que são atendidas por estas ofertas uma oferta alternativa que esteja disponível e possa atendê-la. Caso exista esta condição, a demanda é alocada a oferta alternativa, disponibilizando os vagões da oferta que estava ocupada para a demanda d.

• RemoverDemanda(Lista F , Demanda d): retira a demanda d da lista de demandas ainda não atendidas F .

A partir do pseudocódigo do algoritmo pode-se notar que basicamente o algoritmo cria o plane- jamento de alocação buscando atender primeiro todas as SM V0s geradas a partir do plano de dis- tribuição mantendo um compromisso com este plano. Posteriormente, busca atender as demandas ainda não atendidas pelo plano de distribuição, neste caso estas demandas não foram atendidas de- vido a capacidade de algum trem que chegou ao seu limite. Em ambos casos, a alocação atende

primeiro as demandas com menos rotas, conectando-as as ofertas, até as demandas com mais rotas. Ou seja, as demandas que tem apenas uma rota são sempre atendidas antes das demandas com mais rotas, pois para estas demandas não existe outra alternativa para alocação.

A seguir apresenta-se um exemplo da utilização do algoritmo de alocação de vagões.

5.3

Exemplo

Os dados do exemplo considerado nesta seção são mostrados na Fig. 5.3.

Fig. 5.3: Exemplo

O exemplo da Fig. 5.3 foi resolvido pelo algoritmo de distribuição de vagões e as solicitações de movimentação de vagões geradas a partir dos resultados mostrados na Tab. 5.1.

Solicitações de Movimentação de Vagões Oferta Demanda Tipo Vagão Quantidade 10(TOM) 15(ZRV) 1 5 10(ZAR) 15(ZRV) 1 10 10(ZZX) 10(ZAP) 1 4 10(ZPT) 10(ZAP) 1 6 10(TOM) 9(ZRV) 1 5 10(ZPT) 9(ZRV) 1 4

5.3 Exemplo 55

Os detalhes da execução do algoritmo alocação de vagões para o exemplo da Fig. 5.3 são os seguintes.

Primeiramente a lista de SMV (LSM V) é ordenada por número de rotas e prazo da demanda(Tab.

5.2).

Lista de SMV ordenadada

Oferta Demanda Tipo Vagão Quantidade Número Rotas Prazo(dia)

10(ZAR) 15(ZRV) 1 10 2 16 10(TOM) 15(ZRV) 1 5 2 16 10(ZPT) 10(ZAP) 1 6 2 18 10(ZZX) 10(ZAP) 1 4 2 18 10(ZPT) 9(ZRV) 1 4 3 17 10(TOM) 9(ZRV) 1 5 3 17

Tab. 5.2: Lista de SMV ordenada por número de rotas e prazo das demandas

Posteriormente, o procedimento heurístico se inicia da SMV com maior prioridade para a de menor prioridade. A primeira SMV a ser atendida é 10(ZAR)−15(ZRV ) : 10. O algoritmo encontra a rota que conecta a oferta 10(ZAR) até a demanda 15(ZRV ) com custo de movimentação mínimo. O próximo passo é calcular a quantidade de vagões que serão alocados a rota encontrada. Neste caso, o mínimo entre a capacidade da rota cr e a quantidade de vagões da SM V nSM V é calculado. Para

o exemplo, obtem-se utilizado min{cr, nSM V} = min{5, 10} = 5 esta é a quantidade de vagões é

alocada aos trens que compõe a rota. Neste caso, a rota é composta apenas pelo trem T 2 que atinge a sua capacidade após a alocação.

A SMV não foi completamente atendida, pois foram alocados apenas 5 vagões (limite do T 2 da rota) e nSM V = 10. Neste caso, busca-se uma oferta alternativa para a demanda 15(ZRV ). A oferta

10(T OM ) é encontrada, a rota composta apenas pelo trem T 1 é encontrada, e os vagões que faltavam para atender a demanda da SMV (min{cr, nSM V} = min{5, 10} = 5) são alocados ao trem.

O algoritmo vai para a próxima SMV (10(T OM ) − 15(ZRV ) : 5). Neste caso a rota composta apenas pelo trem T 1 é encontrada e os 5 vagões (min{cr, nSM V} = min{15, 5} = 5) da SMV são

alocados.

A próxima SMV é 10(ZP T ) − 10(ZAP ) : 6. A rota encontrada é composta pelo trem T 4. O número de vagões alocados é min{cr, nSM V} = min{20, 6} = 6. A SMV é totalmente atendida. Na

sequência, a SMV (10(ZZX) − 10(ZAP ) : 4) é atendida alocando-se 4 vagões (min{cr, nSM V} =

min{20, 4} = 4) ao trem T 5.

Na sequência, a SMV (10(ZP T ) − 9(ZRV ) : 4), aloca 4 vagões ao trem T 3.

A última SMV a ser atendida é 10(T OM ) − 9(ZRV ) : 5. Neste caso, existe uma rota com capacidade disponível, mas a oferta (10(T OM )) foi completamente utilizada. O algoritmo vai para o próximo passo e busca uma oferta disponível para atender a demanda da SMV 9(ZRV ). Nen- huma outra oferta é encontrada, pois não existe rota com capacidade disponível conectando a oferta 10(ZAR) (ainda com 5 vagões disponíveis) a demanda 9(ZRV ) e a oferta 10(ZP T ) foi completa- mente utilizada.

O algoritmo neste caso tenta realocar alguma das demandas atendidas pelas ofertas 10(T OM ), 10(ZP T ). Estas ofertas são consideradas por serem do mesmo tipo de vagão da demanda 9(ZRV ) e

terem rota com capacidade disponível conectando-as. A oferta 10(T OM ) é totalmente utilizada pela demanda de 15(ZRV ). Esta demanda não tem nenhuma outra das ofertas disponível que a atenda e não pode ser realocada.

Neste caso, resta apenas tentar disponibilizar a oferta 10(ZP T ). Esta oferta está sendo total- mente utilizada para atender a demanda 10(ZAP ). Neste caso, existe a oferta 10(ZZX) disponível para atendê-la. O algoritmo aloca os vagões da oferta 10(ZZX) para a demanda 10(ZAP ), disponi- bilizando os 5 vagões necessários para atender a SMV 10(T OM ) − 9(ZRV ) : 5. Desta forma, o algoritmo atende todas as SMV’s e/ou demandas obtendo um plano de alocação ótimo para o pro- blema da Fig. 5.3.

A descrição de como o algoritmo produz o plano de alocação para o exemplo da Fig. 5.3 mostra como o algoritmo funciona. O plano de alocação construído utilizou como critério de otimização o custo de movimentação. Este critério é utilizado sempre que o algoritmo busca uma rota entre as ofer- tas e demandas. A rota retornada na busca é a com capacidade disponível e custo de movimentação mínimo.

No Cap. 6 são feitos experimentos para avaliar a qualidade das soluções geradas por este algo- ritmo. A qualidade das soluções geradas foi analisada em relação a 3 critérios: a) quantidade total de demanda atendida; b) custo do planejamento; e c) tempo de processamento.

5.4

Resumo

Este capítulo apresentou um algoritmo heurístico para alocação de vagões. Este algoritmo con- sidera o plano de distribuição de vagões, a grade de trens e as capacidades dos trens da grade de trens construindo soluções de baixo custo considerando o custo de movimentação dos vagões.

No próximo capítulo são mostrados os experimentos computacionais realizados para avaliar a qualidade das soluções do geradas pelo algoritmo de distribuição e alocação de vagões. Os experi- mentos mostram a viabilidade de aplicar estes algoritmos para resolver problemas em tempo real.

Capítulo 6

Experimentos Computacionais

6.1

Introdução

Este capítulo apresenta e discute os resultados obtidos pelo modelo e algoritmo de distribuição e alocação de vagões propostos nos capítulos 3 e 5. Os resultados obtidos são comparados com o modelo multicomodidade clássico existente na literatura. As instâncias utilizadas neste experimento foram geradas a partir de uma grade de trens obtida com dados de uma ferrovia brasileira. Para analisar os resultados do algoritmo foram geradas 147 instâncias a partir de variações dos principais parâmetros do problema, respectivamente: número de trens por dia, horizonte de planejamento e número de tipos de vagões. Ao final deste capítulo é feito um resumo dos resultados.

Documentos relacionados