Anexo III –
ANEXO III
IMPLEMENTAÇÃO DO SISTEMA COMPUTACIONAL
O sistema computacional utilizado neste trabalho de tese é formado por três componentes: um simulador a eventos discretos, um conjunto de rotinas, que proporcionam entre facilidades: acesso a banco de dados, resolução do problema de atribuição e implementação do controlador fuzzy, e um “ front-end ”, isto é, uma
interface gráfica onde o usuário define as características do sistema a ser simulado, e de onde também obtém os resultados da simulação, integrando ainda os outros dois componentes.
O código fonte de todos os componentes mencionados, devido às respectivas extensões, não foram impressos mas estão disponíveis no CD-ROM encartado no Anexo IV a este volume. Esse código foi desenvolvido em Delphi®
, podendo ser compilado somente nas versão 5 ou superior.
III.1 Simulador a Eventos Discretos
O simulador a eventos discretos foi construído de acordo com o paradigma da programação orientada a objetos. Ele é composto pelas seguintes classes:
• cTipos – Contém todos os tipo de dados definidos pelo usuário;
• cRelogio – classe que implementa o relógio da simulação. Possui as
seguintes propriedades:
⇒ HoraAtual – tempo atual de simulação;
⇒ HoraAnterior – tempo anterior da simulação antes do avanço do
relógio;
⇒ UltimoAvanco – intervalo de tempo correspondente ao último avanço
de tempo da simulação;
⇒ Anos – número de anos transcorridos na simulação; ⇒ Meses – número de meses transcorridos na simulação; ⇒ Dias – número de dias transcorridos na simulação;
⇒ Minutos – número de minutos transcorridos na simulação; ⇒ Segundos – número de segundos transcorridos na simulação; ⇒ DiadaSemana – número correspondente ao dia da semana;
⇒ Quinzena – indica a que quinzena pertence o tempo atual da
simulação.
• cBase – classe base da simulação da qual as classes cEntidade, cAtividade e
cFilas descendem. Suas propriedades são:
⇒ Nome – nome do objeto;
⇒ Relogio – ponteiro para o relógio da simulação.
• cEntidade – classe que implementa o objeto Entidade na simulação. Possui
as seguintes propriedades:
⇒ Local – local onde a entidade se encontra atualmente (pode ser uma
Fila ou Atividade);
⇒ NumeroEntidade – numero que o objeto entidade possui ao ser
instanciado;
⇒ AtividadeAtual – atividade da qual a entidade está participando; ⇒ TempoFila – tempo total que a entidade permaneceu em filas;
⇒ TempoAtividade – tempo total que a entidade participou de
atividades;
⇒ EntraFila – instante em que a entidade entrou numa fila; ⇒ SaiFila – instante em que a entidade deixou uma fila;
⇒ Utilizacao – quociente entre o tempo de atividade e a soma do tempo
de atividade com a o tempo de fila;
⇒ UtilizacaoTotal – o mesmo que o anterior, considerando-se porém os
tempos de todas as corridas;
⇒ GetIndAtributo – função que retorna a posição de um atributo dentre
do vetor de atributos da entidade;
⇒ GetValAtributo – função que retorna o valor de um determinado
atributo;
⇒ GetNomeAtributo – função que retorna o nome do atributo da
⇒ DefValatributo – procedimento que estabelece o valor de um atributo
identificado por um nome;
⇒ DefineAtributo – cria uma entrada com um nome no vetor de
atributos da entidade;
⇒ RemoveAtributo – remove a n-ésima entrada do vetor de atributos da
entidade;
⇒ NumAtributos – função que retorna o número de atributos que a
entidade possui;
⇒ Reinicializa – procedimento que zera os tempos de permanência em
atividades e de filas;
⇒ Finaliza – procedimento que acumula os tempos globais de
permanência em atividades e filas ao fim de uma corrida.
• cAtividade – essa classe realiza a implementação do objeto Atividade. Suas
principais propriedades são mostradas abaixo:
⇒ Duracoes – vetor com os tempos de duração dessa atividade;
⇒ NumeroAtividade – número da atividade. Valor designado quando a
atividade é criada;
⇒ DuracaoMaxima – máxima duração da atividade; ⇒ DuracaoMinima – mínima duração da atividade;
⇒ DuracaoTipica – valor utilizado para fins de estimativas de duração
de atividade até que esta seja executada pela primeira vez;
⇒ Media – duração média das atividades de uma corrida;
⇒ DesvioPadrao – desvio padrão dos tempos de atividade de uma
corrida;
⇒ MediaGlobal – duração média das atividades de todas as corridas; ⇒ DesvioPadraoGlobal – desvio padrão dos tempos de atividades de
todas as corridas;
⇒ NumVezesRealizada – número de vezes que a atividade foi realizada
numa corrida;
⇒ TotalVezesRealizada – número de vezes em que a atividade foi
realizada em todas as corridas;
⇒ TempoAtividade – tempo previsto para a duração da atividade; ⇒ Inicio – instante de tempo em que se inicia a atividade;
⇒ Termino – instante de tempo em que a atividade é finalizada
⇒ FimAtividade – processa a atualização das estatísticas referentes a
duração das atividades ao fim de uma corrida;
⇒ Reinicializa – procedimento que zera os tempos de atividade e o
número de vezes que a atividade foi realizada;
⇒ Finaliza – procedimento que acumula os tempos globais de atividade
e o número total de vezes que a atividade foi realizada ao fim de uma corrida.
• cFila – classe responsável pela implementação do objeto Fila. Tem como
propriedades os seguintes elementos:
⇒ Entidade – entidade associada a esta fila;
⇒ MudouTamFila – notificação de evento referente a mudança do
tamanho da fila;
⇒ MudouTempoFila – notificação de evento referente a mudança do
tempo de fila;
⇒ Tempos – vetor com os tempos de permanência na fila;
⇒ Entidades – lista com todos os objetos do tipo entidade que estão na
fila;
⇒ Frequencias – vetor com as freqüências da fila;
⇒ TamFinal – número de entidades na fila ao término de uma corrida; ⇒ Tamanho – número atual de entidades na fila;
⇒ Freq – número de entradas na fila;
⇒ TamanhoMax – número máximo de elementos na fila em
determinado instante;
⇒ TamanhoMin – número mínimo de elementos na fila em determinado
instante;
⇒ TamanhoMed – número médio de elementos na fila;
⇒ DesvPadraoTempos – desvio padrão dos tempos de permanência nas
fila;
⇒ Primeira – função que retorna a primeira entidade da fila;
⇒ Retira – procedimento que retira uma entidade da fila de acordo com
a posição informada;
⇒ RetiraEnesima – retira a n-ésima entidade da fila;
⇒ Coloca – procedimento, para colocação na fila, de uma entidade em
certa posição;
⇒ Esvazia – procedimento que retira todos os elementos da fila;
⇒ Finaliza – atualiza o tamanho da fila e retira entidades remanescentes
ao término de uma corrida;
⇒ Ultima – função que retorna a última entidade da fila;
⇒ GetByPosition – função que retorna a n-ésima entidade da fila;
⇒ GetByAtribute – função que retorna uma entidade em função do
valor de um atributo.
• cFonte – classe que implementa o objeto Fonte. Suas propriedades são: ⇒ Contador – fornece o número de entidades retiradas dessa fonte; ⇒ Entidade – entidade associada a esta fonte;
⇒ Tira – procedimento que retira (cria) uma entidade da fonte;
⇒ ZeraContador – procedimento que zera a contagem de entidades
retiradas da fonte.
• cEvento – essa classe implementa o objeto Evento, associado ao inicio e
término de uma atividade. Possui as seguintes propriedades:
⇒ Numero –número do evento B; ⇒ Nome – nome do evento B;
⇒ Término – instante de término do evento B; ⇒ Entidade – entidade que participa deste evento; ⇒ Atividade – atividade a que se refere o evento.
Essas classes não são manipuladas diretamente, mas gerenciadas pelo executivo da simulação, implementado pela classe cSimul cujas propriedades são apresentadas em seguida.
⇒ Init – este procedimento inicializa as listas de objetos entidades,
atividades, filas, fontes e demais variáveis de interesse para a simulação;
⇒ DefineAtividade – este procedimento define uma atividade da
simulação e sua duração típica;
⇒ Atividade – esta função retorna o objeto atividade correspondente ao
nome informado;
⇒ ProgramaAtividade – programa a duração de uma determinada
atividade;
⇒ Destroi – procedimento que destrói um objeto entidade retirando-o da
simulação;
⇒ DefineEntidade – procedimento que define uma entidade na
simulação;
⇒ Entidade – função que retorna uma entidade correspondente ao nome
informado;
⇒ DefineAtributo – cria uma entrada, de acordo com o nome
informado, no vetor de atributos da entidade;
⇒ AvaliaAtributo – retorna o valor do atributo de uma entidade,
identificado por um nome;
⇒ DefValAtributo – define um valor para o atributo correspondente ao
nome fornecido;
⇒ DefineFila – procedimento que define uma fila para a simulação; ⇒ Fila – função que retorna uma fila de acordo com o nome fornecido; ⇒ EncheFila – procedimento que enche uma fila com certo número de
entidades;
⇒ ColocanaFila – Coloca uma entidade em certa fila, de acordo com a
posição indicada;
⇒ TiradaFila – Retira uma entidade da fila indicada de acordo com a
posição desejada;
⇒ PreparaB – procedimento de programação de evento associado ao
inicio de uma atividade, fornecendo o número do evento B e a entidade participante;
⇒ DefineFonte – procedimento que define uma fonte de uma
determinada entidade na simulação;
⇒ TiradaFonte – função que extrai uma entidade da fonte informada; ⇒ Fonte – função que dado um nome de fonte retorna o objeto
correspondente;
⇒ ExecutaSimulacao – procedimento que verifica se as condições de
inicio da simulação são atendidas e controla o sua execução e finalização;
⇒ Fim – rotina de finalização da simulação, retirando da memória os
objetos instanciados;
⇒ EnqEventosB – função lógica que retorna verdadeiro caso exista
algum evento associado ao fim de uma determinada atividade e falso em caso contrário.
Estas são as características básicas do simulador. Entretanto, como este simulador serviu ao propósito de representar o comportamento de um trecho ferroviário, algumas funcionalidades adicionais foram agregadas para que se alcançasse este objetivo. Dessa forma foram incluídos as seguintes rotinas:
⇒ Zera_Trechos_Manutencao – esse procedimento torna todos os
trechos da simulação disponíveis para manutenção;
⇒ Trecho_Disp_Manutencao – função lógica que retorna verdadeiro
caso exista algum trecho que não tenha sofrido manutenção e falso caso contrário;
⇒ Zera_Trechos_Falha – procedimento que torna disponível, para
eventos de falha, todos os trechos da simulação;
⇒ Trecho_Disp_Falha – função que retorna verdadeiro quando existem
trechos que ainda não participaram de eventos de falha;
⇒ TempoPrevisto – tempo previsto para o deslocamento entre dois
⇒ DetalhaHoras – fornecidos dois instantes de tempo distintos, esta
função retorna a quantidade de horas normais, extra do tipo I e II, por período do dia, decorridas em cada quinzena do período correspondente aos instantes informados;
⇒ DefineMaquinista – estabelece o número de maquinista em certo
local de trabalho (sede ou destacamento);
⇒ NoturnaMenorDiurna – função lógica que retorna verdadeiro caso
determinada jornada causará um total de horas noturnas maiores que diurnas em uma quinzena;
Complementando a parte referente aos componentes do simulador, existem ainda as unidades denominadas EventosB e EventosC onde são declaradas respectivamente as rotinas referentes aos inícios e términos de atividades, de acordo com a modelagem do sistema cujo comportamento se deseja simular.
É importante ressaltar que somente as rotinas cujos cabeçalhos forem declarados na seção de interface dessas unidades serão acessíveis aos de mais componentes do sistema computacional.
Finalizando, a classe cDistribuicoes fornece as rotinas para amostragem aleatória simples e amostragem descritiva, baseada no trabalho desenvolvido por Glaydson Vasconcelos de Souza para o Simul.
III.2 Unidades de Apoio à Simulação
Nesta categoria estão agrupadas as unidades complementares a simulação e que fornecem as funcionalidades de banco de dados, máquina de inferência fuzzy, geração de combinações e resolução do problema de atribuição. São a seguir comentadas.
• cAssignment – unidade que implementa a resolução do problema de
designação quadrática para uma matriz de ordem 150, de acordo com o algoritmo de Jonker e Volgenant.. Sua rotina básica é:
⇒ Designa – a partir de uma lista de trens e de maquinistas apresentados
designa os maquinistas aos trens;
• cCombinacoes – unidade que gera as combinações das regras fuzzy ativadas.
Tem como funcionalidade os seguintes elementos:
⇒ GetNext – gera a próxima seqüência de combinações;
⇒ Inicializa – verifica os elementos informados e calcula o número total
de combinações;
⇒ CombinacoesRestantes – informa o número de combinações ainda
não geradas;
⇒ MaisCombinacoes – função lógica que indica se ainda existem
combinações não geradas;
⇒ TotalCombinacoes – função que indica o número total de
combinações;
⇒ Combinacoes – função que retorna o vetor atual de combinações.
• cFuzzy – classe que implementa a Máquina de Inferência Fuzzy. Suas
propriedades são:
⇒ InicLimitesTermos – função que estabelece a posição inicial e final
de cada termo lingüistico em um vetor de posição de termos;
⇒ IncluiVariavel – procedimento que realiza a inclusão de uma variável
fuzzy na máquina de inferência;
⇒ Infere – função que retorna a saída (nítida) do controlador fuzzy para
um conjunto de valores de entrada;
⇒ AdicionaRegra – procedimento que adiciona uma regra do tipo “Se
então” na base de regras;
⇒ GetPosCol – função que retorna a posição de um termo lingüístico
conhecido o seu nome e a variável a que pertence;
⇒ PertinenciaByInd – função que retorna o grau de pertinência de uma
variável fuzzy;
⇒ VarEntrada – lista com todas as variáveis de entrada do controlador
⇒ AbreArquivo – procedimento que abre um arquivo texto, denominado
“RegrasFora.txt”, onde serão listadas regras que o controlador fuzzy tentou utilizar, mas que não pertencem a base de regras;
⇒ FechaArquivo – procedimento que fecha o arquivo “RegrasFora.txt”,
após o término da simulação.
As classes cVarLing e cResultadoGlobal, a seguir comentadas, estão encapsuladas na classe cFuzzy.
• cVarLing – classe que implementa uma variável fuzzy (ou Variável
Lingüística). Possui as seguintes propriedades:
⇒ DefineTermo – procedimento que define um termo lingüístico
(conjunto fuzzy) estabelecendo seu nome, forma e conjunto de valores;
⇒ SetPertinencia – calcula o grau de pertinência de uma variável fuzzy
a partir de um valor de entrada;
⇒ InicializaTermos – procedimento que coloca a pertinência em zero e
o estado da variável em não ativado;
⇒ NumTermos – propriedade indicativa do número de termos
lingüísticos que a variável fuzzy possui;
⇒ GetIndTermos – função que retorna índice de ordem do termo
lingüístico dentro da variável fuzzy;
⇒ GetTermo – função que retorna o objeto Termo Lingüístico associado
a um nome de referência;
⇒ GetTermoByPosicao - função que retorna o objeto Termo Lingüístico
de acordo com sua posição na lista de termos da variável lingüística;
⇒ NomeTermo – função que retorna a posição de um termo, conhecido
seu nome de referência;
⇒ Nome – Nome da Variável Lingüística;
⇒ PertinenciaByPos – função que retorna o grau de pertinência de um
termo de acordo com sua posição na lista de termos lingüísticos;
⇒ GetArea – função que retorna a área geométrica de um Termo
Lingüístico;
⇒ GetCG – função que retorna o Centro de Gravidade de um Termo
Lingüístico;
⇒ SetArea – procedimento que calcula a área de um termo lingüístico.
• cResultadoGlobal – classe que realiza o cálculo do valor de saída do
controlador fuzzy. Suas propriedades são:
⇒ ZeraResultado – procedimento que exclui os Termos Lingüisticos das
variáveis fuzzy referentes ao resultado anterior;
⇒ IncluiResultadoParcial – inclui os Termos Lingüísticos que foram
ativados para uma determinada entrada;
⇒ GetResultado – função que fornece o resultado final ou de saída do
controlador fuzzy.
• RotinasDB – esta unidade implementa todas as facilidades de Banco de
Dados da simulação, utilizando tabelas no formato Paradox®
7.0. Possui os seguintes métodos:
⇒ CriaTabelaTrens – cria, em tempo de execução, uma tabela que
registrará os instantes de partida e de chegada de cada trem, em cada pátio definido na simulação;
⇒ GravaRegistroTrem – grava, na Tabela de Trens, informações de
movimentação de um trem;
⇒ CriaTabelaApresent – cria, em tempo de execução, uma tabela que
registrará os instantes de inicio e término de apresentação (prontidão) dos maquinistas;
⇒ GravaRegistroApresent – grava, na Tabela de Apresentações,
informações de apresentação de um maquinista;
⇒ CriaTabelaFolgas – cria, em tempo de execução, uma tabela que
registrará os instantes de inicio e término de folgas (descanso semanal remunerado) dos maquinistas;
⇒ GravaRegistroFolgas – grava, na Tabela de Folgas, informações
referentes à folga de um maquinista;
⇒ CriaTabelaDescansos – cria, em tempo de execução, uma tabela que
registrará os instantes de inicio e término de descanso (intervalo mínimo de repouso de 10 horas entre dois serviços consecutivos) dos maquinistas;
⇒ GravaRegistroDescanso – grava, na Tabela de Descansos,
informações referentes ao descanso de um maquinista;
⇒ CriaTabelaHoras – cria, em tempo de execução, uma tabela que
registrará as horas trabalhadas por cada maquinista em função do período do dia (noturno ou diurno), do tipo de hora (normal, extra dos tipos I e II) e da quinzena do mês (primeira ou segunda);
⇒ GravaRegistroHoras – grava, na Tabela de Horas, informações
referentes às horas trabalhadas por um maquinista;
⇒ CriaTabelaServicos – cria, em tempo de execução, uma tabela que
registrará informações dos serviços realizados por cada maquinista, ou seja, o trem que ele conduziu e os instantes de apresentação e de inicio e término de condução do trem;
⇒ GravaRegistroServicos – grava, na Tabela de Serviços, informações
referentes aos serviços efetuados por um maquinista;
⇒ CriaTabelaManutVia – cria, em tempo de execução, uma tabela que
gravará os instantes de inicio e término dos eventos de manutenção da via permanente;
⇒ GravaRegistroManutVia – grava, na Tabela de Manutenção da Via,
informações referentes a um evento de manutenção da via;
⇒ CriaTabelaFalhaVia – cria, em tempo de execução, uma tabela que
gravará os instantes de inicio e término dos eventos de falha na via permanente;
⇒ GravaRegistroFalhaVia – grava, na Tabela de Falhas da Via,
informações referentes a um evento de falha na via;
⇒ CriaTabelaFalhaTrem – cria, em tempo de execução, uma tabela que
⇒ GravaRegistroFalhaTrem – grava, na Tabela de Falhas de Trem,
informações referentes a um evento de falha num trem;
⇒ PesqHorasMaq – função que realiza uma pesquisa na Tabela de
Horas, retornando as horas trabalhadas por um maquinista. III.3 Interface Gráfica com o Usuário
As classes até agora vistas formam o “back-end ” da aplicação e são as que efetivamente
realizam todo o processamento dos dados. As classes a seguir formam o “ front-end ”, ou
seja, fornecem uma interface gráfica de interação com o usuário onde ele fornecerá os elementos de entrada e obterá as saídas correspondentes.
• Principal – esta unidade é a unidade central do “ front-end ”. Nela são
definidos todos os elementos da simulação, cujos conteúdos são transmitidos às classes de “back-end ”. Possui os seguintes métodos:
⇒ DefineModelo – procedimento responsável pela caracterização ou
definição do modelo da simulação. Ele é composto das seguintes etapas:
Init – realiza a inicialização das variáveis, e objetos da simulação; DefineEntidade – define cada uma das entidades da simulação; DefineAtvidade – define cada uma das atividades da simulação; DefineFila – define cada uma das filas da simulação;
DefineFonte – define cada uma das fontes da simulação;
EncheFila – coloca determinados elementos em fila para que as
condições de inicio de uma atividade possam ser atendidas, e desta forma ser iniciada a simulação.
⇒ ChamaBEventos – procedimento que percorre uma lista de eventos
associados ao término de uma atividade, determinando aqueles que serão executados;
⇒ AtravesCEventos – procedimento que percorre todas as atividades
verificando aquelas cujas condições de início são satisfeitas e executando-as;
⇒ InicializaControlador – procedimento para inicialização do
Controlador Fuzzy ou Máquina de Inferência Fuzzy;
⇒ InializaMaquinistas – procedimento utilizado na alocação dinâmica
para o estabelecimento do número de maquinista em cada posto de trabalho (sede e distrito(s)).
Além disso, existem constantes, que o usuário deve definir, indicando as rotas (seqüências de atividades e filas) dos trens de acordo com sua tração e sentido.
• frmGraficoCirc – esta unidade é a responsável pela elaboração do gráfico de
circulação de trens, de cada período correspondente a um dia da simulação, sendo também assinalados os eventos de falha e manutenção da via. O usuário tem ainda a opção de salvar o gráfico em um arquivo ou de imprimi-lo. A unidade dispõe dos seguintes métodos:
⇒ DesenhaMalha – procedimento responsável pelo desenho dos pátios
definidos na simulação;
⇒ DesenhaTrens – este procedimento desenha os trens na malha;
⇒ CanvasTextOutAngle – escreve um determinado texto de acordo com
as coordenadas de tela e ângulo fornecidos;
⇒ DesenhaBlocoVia – este procedimento desenha um bloco da via onde
ocorreu uma falha ou manutenção da via;
⇒ QueryTrens – realiza uma pesquisa na Tabela de Trens, selecionando
os trens que circularam em determinado dia;
⇒ QueryManVia – realiza uma pesquisa na Tabela de Manutenção da
Via, selecionando os eventos de manutenção que ocorreram em determinado dia;
⇒ QueryFalhaVia – realiza uma pesquisa na Tabela de Falhas na Via,
selecionando os eventos de falha na via que ocorreram em determinado dia.
• ImageProcessingPrimitives – esta unidade é a responsável diretamente pela
• cformArquivos – esta unidade é a responsável pela exibição, navegação e