6 Implementação da aplicação
6.2 Implementação da heurística
6.2.6 Classe Controlador (ZCL_TM_CTR_CLARKE_WRIGHT)
A classe denominada de “controlador” permite gerir todo o processo relativo à execução do algoritmo. Assim, por cada geração de rotas para um determinado dia/fileira é criada uma instância da classe controlador.
Por exemplo, nos casos em que se pretende gerar as rotas para as três fileiras (papel, embalagens e vidro) num determinado dia, devem ser criadas as respetivas 3 instâncias desta classe.
Na tabela 6.6 apresenta-se uma representação UML da classe correspondente “controlador”, indicando-se os seus atributos e métodos.
ZCL_TM_CTR_CLARKE_WRIGHT - lista_savings TYPE ztm_lista_savings - lista_juncoes TYPE ztm_lista_juncoes - lista_ecopontos TYPE ztm_lista_ecopontos - lista_rotas_atuais TYPE ztm_lista_rotas_atuais - total_juncoes TYPE i
- capacidade_viat TYPE ztm_quantidades - ecoponto_sede TYPE REF TO zcl_tm_ecoponto
- total_rotas TYPE i
- lista_rotas_solucao - lista_rotas_inicial - dia_semana TYPE char1
- dia TYPE dats
- fileira TYPE char10
- distancia_maxima TYPE i - enchimento_minimo TYPE i
+ constructor
+ novo_ecoponto IMPORTING im_ecoponto TYPE REF to zcl_tm_ecoponto
+ obter_sede + criar_rotas_iniciais + incrementar_total_rotas + obter_savings + calcular_custo_saving
IMPORTING im_ecop_ant TYPE REF to zcl_tm_ecoponto + IMPORTING im_ecop_seg TYPE REF to zcl_tm_ecoponto + EXPORTING ex_custo TYPE ztm_custo
+ EXPORTING ex_tempo TYPE ztm_tempo
6. Implementação da aplicação
Faculdade de Ciências da Universidade de Lisboa 92
+ EXPORTING ex_ecop_seg_sede TYPE ztm_custo + EXPORTING ex_ecop_ant_seg TYPE ztm_custo + calcular_rotas
+
obter_rota
IMPORTING im_ecoponto TYPE REF to zcl_tm_ecoponto + IMPORTING im_rota_diferente TYPE REF to zcl_tm_rota + EXPORTING ex_arco TYPE REF to zcl_tm_arco
+ EXPORTING ex_rota TYPE REF to zcl_tm_rota + obter_total_rotas EXPORTING ex_n_total_rotas TYPE i
+ atualizar_lista_rotas_atuais IMPORTING im_juncao TYPE REF to zcl_tm_juncao_rotas + obter_lista_rota_atuais EXPORTING ex_lista_rotas_atuais TYPE ztm_lista_rotas_atuais + apagar_rota_lista_r_atuais IMPORTING im_rota TYPE REF to zcl_tm_rota
+ obter_lista_ecopontos EXPORTING ex_lista_ecopontos TYPE ztm_lista_ecopontos + obter_lista_juncoes EXPORTING ex_lista_juncoes TYPE ztm_lista_juncoes + obter_lista_savings EXPORTING ex_lista_savings TYPE ztm_lista_savings
+ Inicializar
+ obter_total_juncoes EXPORTING ex_total_juncoes TYPE i + alterar_capacidade_viatura IMPORTING im_capacidade TYPE i + obter_total_ecop RETURNING re_n_ecopontos TYPE i + obter_tempo RETURNING re_tempo TYPE ztm_tempo + definir_dia IMPORTING im_dia TYPE dats
+ definir_dia_semana IMPORTING im_dia_semana TYPE char1 + obter_dia RETURNING re_dia TYPE dats
+ obter_dia_semana RETURNING re_dia_semana TYPE char1 + definir_fileira RETURNING im_fileira TYPE char10 + obter_fileira RETURNING re_fileira TYPE char10 + obter_rotas_existentes
+ obter_custo RETURNING re_custo TYPE ztm_custo + obter_m3 RETURNING re_m3 TYPE ztm_m3 + obter_distancia_max RETURNING re_distancia_max TYPE i + definir_distancia_max IMPORTING im_distancia_max TYPE i + obter_ench_min RETURNING re_ench_min TYPE i + definir_ench_min IMPORTING im_ench_min TYPE i
6. Implementação da aplicação
Faculdade de Ciências da Universidade de Lisboa 93
Detalhe dos atributos:
lista_savings Guarda a informação referente à lista dos savings gerada pelo algoritmo.
lista_juncoes Disponibiliza a listas das junções efetuadas durante a execução do algoritmo.
lista_ecopontos Consiste na lista dos ecopontos em estudo.
lista_rotas_atuais Representa a lista das rotas num determinado momento da execução do algoritmo.
total_juncoes Indica o número total de junções já efetuadas.
capacidade_viat Corresponde à capacidade das viaturas.
ecoponto_sede Corresponde ao ecoponto sede.
total_rotas Identifica o número total de rotas geradas pelo algoritmo.
total_rotas_solução Listas das rotas de acordo com a solução final obtida.
lista_rotas_inicial Lista das rotas iniciais do algoritmo.
dia_semana Dia da semana correspondente ao dia em estudo.
dia Dia em estudo.
fileira Tipo de material (papel, embalagem ou cartão).
distancia_maxima Distância máxima permitida entre dois ecopontos para que o respetivo saving seja considerado no algoritmo. (ver capítulo 8.2)
enchimento_minimo Percentagem de enchimento a partir da qual a validação que restringe os savings com base nas distâncias deixa de ser considerado. (ver capítulo 8.2)
Detalhe dos métodos:
constructor Este método inicializa os vários atributos no momento em que a classe é instanciada.
novo_ecoponto Adiciona um ecoponto na lista de ecopontos.
obter_sede Obtém o ecoponto sede.
criar_rotas_iniciais Cria as rotas iniciais do algoritmo. Cada uma destas rotas consiste na ligação entre cada ecoponto e o ecoponto sede. Esta informação é assignada aos atributos “lista_rotas_atuais”, “lista_rotas_inicial”.
incrementar_total_rotas Incrementa uma unidade ao atributo “total_rotas”. Este método é chamado quando se cria uma nova rota.
obter_savings Obtém a lista dos savings atribuindo esta informação ao atributo “Lista_savings”.
calcular_custo_saving Retorna a informação do tempo de deslocação e distância de um determinado saving (entre dois ecopontos).
calcular_rotas O sistema cria iterativamente as rotas até obter a solução final, que corresponde à geração das rotas através do algoritmo Clarke and Wright respeitando a restrição das capacidades das viaturas.
6. Implementação da aplicação
Faculdade de Ciências da Universidade de Lisboa 94 obter_rota Obtém a rota (no caso de existir) que contenha um arco que ligue o
ecoponto (parâmetro de importação do método) e a sede.
obter_total_rotas Devolve o número de rotas existentes.
atualizar_lista_rotas_atuais Após as junções de duas rotas este método permite atualizar a lista das rotas existentes.
obter_lista_rota_atuais Devolve a lista das rotas existentes em determinado momento da execução do algoritmo.
apagar_rota_lista_r_atuais Apaga uma rota da lista das rotas atuais. Este método é utilizado quando se efetua uma junção de rotas, visto que as rotas concatenadas devem desaparecer por darem lugar a uma nova rota.
obter_lista_ecopontos Devolve a lista dos ecopontos em estudo.
obter_lista_juncoes Devolve a lista das junções de rotas efetuadas.
obter_lista_savings Devolve a lista dos savings.
Inicializar Apaga a informação definida nos atributos desta classe.
obter_total_juncoes Obtém o número de junções efetuadas até ao momento.
alterar_capacidade_viatura Permite definir um novo limite de capacidade das viaturas.
obter_total_ecops Devolve o número de ecopontos incluídos nas rotas obtidas.
obter_tempo Devolve a duração total (em minutos) das rotas obtidas.
definir_dia Define-se um valor para o atributo “dia”.
definir_dia_semana Define-se um valor para o atributo “dia_semana”.
obter_dia Obter a informação definida no atributo “dia”.
obter_dia_semana Obter a informação definida no atributo “dia_semana”.
definir_fileira Permite definir a fileira em estudo através do atributo “fileira”.
obter_fileira Obter a informação contida no atributo “fileira”.
obter_rotas_existentes Obter as rotas já aprovadas ou realizadas para excluir do estudo os ecopontos já recolhidos ou já incluídos numa rota a efetuar.
obter_custo Obter a estimativa referente ao custo/distância total da solução obtida.
obter_m3 Obter a estimativa do volume em m3 dos resíduos recolhidos.
obter_distancia_max Obter o valor definido no atributo “distancia_maxima”.
definir_distancia_max Definir o valor definido no atributo “distancia_maxima”.
obter_ench_min Obter o valor definido no atributo “enchimento_minimo”.
definir_ench_min Definir o valor definido no atributo “enchimento_minimo”.
Devido à complexidade do método “calcular_rotas” opta-se por detalhar a forma como este se encontra implementado.
6. Implementação da aplicação
Faculdade de Ciências da Universidade de Lisboa 95
6.2.6.1 Método “calcular_rotas”
O método “calcular_rotas” agrega um conjunto de outros métodos e tem como objetivo a geração das rotas de recolha dos resíduos.
Este processo contempla os seguintes passos:
1. Para cada registo existente na lista de savings identificam-se os ecopontos que estão associados a um arco em que a sua outra extremidade corresponde ao ecoponto sede.
Como foi referido, apenas os ecopontos nesta situação são considerados relevantes para efeitos de junção de rotas.
A lista de savings encontra-se ordenada de forma crescente, enumerando em primeiro lugar os registos que conduzem a um maior ganho de eficiência.
2. Encontrado um registo relevante para efeitos de junção de rotas, o sistema valida se o total estimado de resíduos a recolher na rota a concatenar não excede a capacidade da viatura.
3. Se a condição anterior for verificada o sistema efetua a junção das duas rotas.
6. Implementação da aplicação
Faculdade de Ciências da Universidade de Lisboa 96
Figura 6.17: Fluxograma explicativo do processo associado com a junção de duas rotas Para cada registo da tabela
“Lista_savings” obter os respetivos dois ecopontos
Existem rotas contendo arcos que liguem cada um dos ecopontos ao ecoponto sede?
Início
Não
Sim
A junção das duas rotas está dentro do limite da
capacidade da viatura?
Sim Efetua a junção das rotas
Não
6. Implementação da aplicação
Faculdade de Ciências da Universidade de Lisboa 97