Você está na página 1de 20

UNIVERSIDADE FEDERAL DE SO JOO DEL REI CURSO DE CINCIA DA COMPUTAO Fernando Lima Renan Eduardo

Trabalho Prtico 1: Algoritmo de simulao orientado a eventos de um controlador de elevador

1-20

SO JOO DEL REI MG 2010

SUMRIO

Introduo ........................................................................................ Proposta de trabalho ....................................................................... Soluo apresentada ....................................................................... Formatos de entrada/sada ............................................................. O Algoritmo ...................................................................................... Listagem de rotina e anlise de suas complexidades ................. Anlise estatstica dos resultados ................................................. Concluso ........................................................................................

4 6 8 9 10 15 19 20

2-20

INTRODUO
Com o propsito de criar um projeto de resoluo e testes sobre o funcionamento de um elevador foi proposta a criao de um simulador, j que, esta uma forma simples de representar um problema real. Para melhor solucionar o problema foram escolhidas duas listas como estruturas de dados, a primeira (uma lista simplesmente encadeada) foi utilizada para registrar os eventos, a qual possui dados como, por exemplo, tempo espera, origem, destino e situaes de cada usurio no decorrer da simulao. E a segunda lista (duplamente encadeada) representando o simulador orientado aos eventos, de forma a armazenar os dados referentes carga e andar atuais e, tambm, s caractersticas de marcao, de modo a facilitar a manipulao do trfego do elevador. Este trabalho teve como objetivo de aplicar os conhecimentos bsicos sobre a linguagem C e sobre as estruturas de dados estudados.

3-20

PROPOSTA DE TRABALHO
Voc foi contratado pela Acima e Avante Elevadores para projetar a prxima gerao de elevadores da empresa. De forma a reduzir os custos de desenvolvimento, voc optou por implementar um simulador orientado a eventos do controlador de elevador. O ambiente de funcionamento de um elevador consiste do nmero de andares do prdio e da sua capacidade. Durante a operao do elevador, h basicamente dois eventos a serem considerados: 1. O elevador chamado em algum andar. 2. O passageiro pressiona o andar para o qual ele deseja ir. Sempre que o elevador atende um chamado, a entrada do passageiro sujeita a haver espao no elevador. O elevador pode postergar o atendimento do chamado se estiver cheio. Para fins de simplificao num primeiro momento, voc no considera os tempos de acelerao e desacelerao do elevador. Mais ainda, voc considera que todos os tempos so expressos em uma unidade de tempo Jepslon. Assim, para percorrer a distncia de um andar a outro, necessrio 1 Jepslon. Para 1 ou mais passageiros entrarem ou sarem do elevador tambm necessrio 1 Jepslon. Em termos da estratgia de escalonamento, voc pode usar algo to simples quanto FIFO, embora o elevador v ficar se movimentando desnecessariamente. H vrias estratgias que podem ser usadas e so encontradas na literatura. Para cada passageiro transportado, voc deve imprimir o tempo de espera e o tempo dentro do elevador at o seu destino, ambos em Jepslons. Voc pode tambm imprimir a taxa de ocupao do elevador, assim como a distncia percorrida e o nmero de vezes que a porta foi aberta e fechada. Assim, elabore um programa com as seguintes caractersticas: 1. Projete o seu simulador, incluindo as estruturas de dados a serem utilizadas, assim como a estratgia a ser adotada pelo elevador. 2. O programa deve ser implementado em 3 mdulos. O primeiro mdulo deve tratar dos procedimentos de entrada e sada. O segundo mdulo contm a lgica do simulador. O terceiro mdulo contem o programa principal. Deve ainda ser definido um arquivo de prottipos e definies contendo as estruturas de dados e prottipos das funes dos vrios mdulos. A compilao do programa deve utilizar o utilitrio Make. 3. Todas as estruturas de dados devem ser alocadas dinamicamente, assim 4-20

como devem ser desalocadas aps o processamento. As rotinas de teste de configurao tambm devem ser implementadas usando estruturas de alocao dinmica. 4. O programa deve receber dois parmetros pela linha de comando, utilizando a primitiva getopt: a) b) arquivo descrevendo o ambiente do elevador. seqncia de eventos a serem tratados.

5-20

SOLUO APRESENTADA
1. Tipos abstratos de dados
Foram implementados dois tipos abstratos de dados para auxiliar na soluo da proposta apresentada. 1. 1) Lista simplesmente encadeada A lista simplesmente encadeada contm um registro de eventos, o qual possui os dados: tempo de ocorrncia, origem da chamada, destino do passageiro, tempo de espera fora e dentro do elevador, assim como tambm uma marcao referente situao em que um evento se encontra: passageiro fora do elevador, passageiro dentro do elevador e passageiro chegou ao seu destino.

1. 2) Lista duplamente encadeada A lista duplamente encadeada contm dados da simulao, os quais so: tempo, andar e carga atual, tambm marcadores de destino mximo, mnimo e ao do simulador e ainda apontadores.

6-20

2. Lgica do simulador
A lgica utilizada para controlar o elevador foi baseada na alternativa que fosse mais eficiente para atender todos os usurios do elevador rapidamente. Foi considerado que o elevador tem trs possveis estados: parado, subindo e descendo. Dessa forma, foi necessrio designar regras baseadas no estado do elevador para administrar o controle do elevador. Quando parado o elevador ir analisar destino mximo (subida) ou mnimo (descida) que possuir a menor distncia em relao sua posio atual. Em caso de empate, ou seja, a distncia entre a posio atual e os destinos mximo e mnimo for a mesma, por conveno, ser considerado o estado de descida. No caso do elevador estar em estado de descida ele far uma verificao para saber se existe uma chamada (de um usurio fora do elevador) ou um destino (de um usurio dentro do elevador) em um andar mais abaixo; se existir, ele permanecer no estado de descida, caso contrrio, ele verificar se o elevador ficar parado ou se ir subir. Analogamente ao estado de descida, quando o elevador estiver subindo ele far uma pesquisa para saber se existe uma chamada (de um usurio fora do elevador) ou um destino (de um usurio dentro do elevador) em um andar mais acima; se existir, ele permanecer no estado de descida, caso contrrio, ele verificar se o elevador ficar parado ou se ir descer.

7-20

FORMATOS DE ENTRADA/SADA
Foi necessrio utilizar trs arquivos, sendo duas de entrada e uma de sada, os quais foram utilizados para melhor funcionamento do algoritmo e so indispensveis, de tal forma, que a no utilizao do mesmo impede que o programa realize a simulao. O arquivo que serve como base de informaes do elevador contm apenas o nmero do andar mximo e a carga mxima. O outro arquivo o que contm as informaes iniciais de um evento: Tempo, Origem e Destino. As entradas sero analisadas pelo algoritmo e o resultado final da anlise ser gravada no arquivo de sada, a qual contm as informaes: jepslons (tempo), origem, destino, espera dentro, espera fora e espera total.

8-20

O ALGORITMO
O algoritmo comea declarando as variveis e em seguida faz uma chamada a funo gettimeofday() para calcular o tempo de incio de execuo do algoritmo. Ento, cria as listas (eventos e simulador). Aps feito isso, faz a leitura dos parmetros e carrega os arquivos do elevador e o arquivo dos eventos, j alistando todos os eventos. Em seguida, a lista de simulao cria as clulas dos andares a partir do nmero de andares fornecido pelo arquivo e chega a fase mais importante: a simulao. Na simulao ele trata as listas de acordo com a lgica de implementao e imprime a listagem de ocorrencia por andar: tempo, andar e carga atual. Aps terminada a simulao, a lista de simulao precisar ser desalocada. Ento, ser impressa a lista de resultados e a lista de eventos ser gravada no arquivo de sada e em seguida ser desalocada. Finalmente, utilizando a funo getrusage() faz-se a medida de tempo de usurio e sistema, e, a funo gettimeofday() para calcular o tempo final de execuo.

9-20

LISTAGEM DE ROTINAS E ANLISE DE SUAS COMPLEXIDADES


void esvaziar(): uma simples funo de criar/esvaziar uma lista. Complexidade: O(1). void criarSimulador(Simulador *lista): uma simples funo de criar/esvaziar uma lista. Complexidade: O(1). while((opt = getopt (argc, argv, "a:b:c:d:")) != -1): uma estrutura de repetio que tem como condio de parada a funo getopt() a qual receber quatro parmetros: 2 (dois) de entrada para leitura de arquivos e 1 (um) para sada para escrita de arquivo e 1 para definir o nmero de threads. Como as funes internas desta funo possuem complexidade O(1), sua complexidade [ 4*O(1)]. Complexidade: O(1). void alistar(Evento evento): uma funo que insere itens numa lista. Esta funo contm uma sequncia de comandos com complexidade O(1). Portanto, sua complexidade dada pelo O(max(1,1,....,1). Complexidade: O(1). void carregarEventos(char *eventos): uma funo que faz a leitura do arquivo de eventos. Esta funo contm um lao que repete n vezes, onde n o nmero de eventos do arquivo. Na parte interna do lao existe uma sequncia de comandos com complexidade O(1), entre eles est a funo alistar(). Dessa forma, a complexidade da funo dada por [ n*O(1)] . Complexidade: O(n). void carregarElevador(char *arqElevador): uma funo que faz a leitura do andar mximo e da carga mxima do elevador. Como o arquivo possui apenas uma linha da estrutura de repetio ser executada apenas uma vez. Sendo que os comandos internos dela possuem complexidade O(1). Complexidade: O(1). 10-20

void inserir(Andar x, Simulador *lista): uma funo que insere itens numa lista. Esta funo contm uma sequncia de comandos com complexidade O(1). Portanto, sua complexidade dada pelo O (max(1,1,....,1). Complexidade: O(1). void dimensionarSimulador(Simulador *lista): uma funo que define qual o tamanho da lista/simulador. Esta funo possui uma estrutura de repetio que repete k vezes, onde k o nmero de andares do elevador. Como a funo possui uma sequncia de comandos com complexidade O(1), incluindo a funo inserir(). Sua complexidade dada por [k*O(1)]. Complexidade: O(1). int ehVazia(Simulador *lista): uma funo que verifica se a lista est vazia ou no. Retornando 0 (zero) quando a lista no esta vazia e 1 (um) quando est. Como possui apenas uma comparao, sua complexidade O(1). Complexidade: O(1). int ehVaziaE(): uma funo que verifica se a lista est vazia ou no. Retornando 0 (zero) quando a lista no esta vazia e 1 (um) quando est. Como possui apenas uma comparao, sua complexidade O(1). Complexidade: O(1). void definirDestino(Simulador *lista): uma das funes mais importantes, pois, partir dela possvel definir at qual elevador ter que subir no seu percurso de subida e at qual andar o elevador ter que descer no seu percurso de descida. Esta funo possui uma sequncia de comandos com complexidade constante, portanto, sua complexidade O(1). Complexidade: O(1). void atualizacao(): uma funo que atualiza o tempo de espera de um evento, de acordo com a sua situao. Possui apenas comandos de complexidade constante. Complexidade: O(1).

11-20

void definirAcao(Simulador *lista): uma funo que define qual a ao do elevador: (0) parado, (1) descendo e (2) subindo. Possui apenas comandos de complexidade constante. Complexidade: O(1). Apontador estado(Simulador *lista): uma funo que a partir da ao do elevador, direciona o ponteiro (Apontador) em relao ao elevador, ou seja, realiza a permanncia, a descida ou a subida do elevador/simulador propriamente dito. Possui apenas comandos de complexidade constante. Complexidade: O(1). int acabarSimulacao(): uma funo que verifica se a simulao acabou. Esta funo possui uma estrutura de repetio que percorre a lista de eventos do inicio ao fim, ou seja, repete n vezes, onde n o numero de eventos. Na parte interna do lao existem apenas comandos de complexidade constante. Ento a complexidade desta funo dada por [n*O(1)]. Complexidade: O(n). void imprimirVisitas(Simulador *lista): uma funo que imprime o um andar e o numero de vezes que o mesmo foi visitado. Esta funo possui uma estrutura de repetio que percorre a lista de eventos do inicio ao fim, ou seja, repete k vezes, onde k o nmero de andares do elevador. Na parte interna do lao existem apenas comandos de complexidade constante. Ento a complexidade desta funo dada por [k*O(1)]. Complexidade: O(1). void desalocarSimulador(Simulador *lista): uma funo que desaloca a lista de simulao. Esta funo possui uma estrutura de repetio que percorre a lista de eventos do inicio ao fim, ou seja, repete k vezes, onde k o nmero de andares do elevador. Na parte interna do lao existem apenas comandos de complexidade constante. Ento a complexidade desta funo dada por [k*O(1)]. Complexidade: O(1).

12-20

void Simulacao(Simulador *lista): a funo que faz a simulao de um elevador orientado a eventos. Pode ser considerada a mais importante do trabalho, j que ela soluciona a proposta de trabalho. Essa funo possui 2 (dois) laos e chamadas das funes: imprimirVisitas() e desalocarSimulador(), ambas com complexidade possuem complexidade constante. No lao mais interno possuem apenas comandos de complexidade constante. Esse lao executado n vezes (considerando o pior caso), onde n nmero de eventos, cujos comandos internos so de complexidade constante. Portanto, o lao interno tem complexidade O(n). No lao externo existem, alm do lao interno, chamadas das funes: definirAcao(), estado() e acabarSimulacao(), cujas complexidades so O(1). Como o lao externo executado f vezes, onde f o tempo total de simulao e possui comando interno com complexidade O(max(1, 1, 1, .., n). A complexidade desse lao dado por [c*n*O(n)], onde c uma constante que multiplica n, a funo que define o tempo de simulao e O(n) a complexidade do mximo entre as funes internas do lao externo. Finalmente, a complexidade da funo Simulao() determinada pelo mximo de suas funes, esse mximo dado por O(Max(1,1,O(c*n*n)). Complexidade: O(n). void imprimirE(): uma funo que imprime os dados de cada evento. Esta funo possui um lao que repete n vezes, onde n o numero de eventos. Visto que internamente ela possui uma sequncia de comandos com complexidade constante, a complexidade dessa funo dada por [n*O(1)]. Complexidade: O(n). void gravarEventos(char *eventos): uma funo que gravar dados em um arquivo sada. Esta funo contm um lao que repete n vezes, onde n o nmero de eventos do arquivo. Na parte interna do lao existe uma sequncia de comandos com complexidade O(1). Dessa forma, a complexidade da funo dada por [ n*O(1)] . Complexidade: O(n).

13-20

void desalocarListaE(): uma funo que desaloca a lista de eventos. Esta funo contm um lao que repete n vezes, onde n o nmero de eventos do arquivo. Na parte interna do lao existe uma sequncia de comandos com complexidade O(1). Dessa forma, a complexidade da funo dada por [ n*O(1)] . Complexidade: O(n). int main(int argc, char *argv[]): a funo principal do trabalho, j que ela faz chamada direta ou indiretamente a todas as funes. Para definir sua complexidade precisamos achar a complexidade mxima entre as funes chamadas por ela. Seguem as funes e suas complexidades: esvaziar(): O(1). criarSimulador():O(1). carregarElevador(): O(1). carregarEventos(): O(n). alistar():O(1). dimensionarSimulador(): O(1). Simulacao(): O(n); imprimirE(): O(n). gravarEventos(): O(n). desalocarListaE(): O(n). Logo o mximo dado por O(max(1,1,1,n,1,1, n,n,n,n). Complexidade: O(n).

14-20

ANLISE ESTATSTICA DOS RESULTADOS


A partir de uma distribuio aleatria de eventos foi possvel criar uma pequena simulao de como poderia ser o funcionamento de um controlador de uma elevador na vida real. A TABELA1 mostra os resultados de tempo de espera dos usurios fora e dentro do elevador em relao unidade Jepslons, a qual uma unidade inventada, portanto, para fins de comparao, suponhamos que 1 Jepslons = 5 segundos. TABELA1: Tabela de resultados dos eventos.
Jepslons Chamada 1 1 5 7 7 10 123 157 167 177 196 231 272 282 323 4610 5411 558 627 656 656 656 656 683 702 775 857 10 5 1104 1178

Destino 8 6 5 4 1 2 1 2 1 1 1 5 4 4 1 2 9 11 2 1 1 7 2 1 8 10 3 4 9 1

TempoFora 3 5 22 20 1 5 19 3 2 1 1 4 2 1 6 10 4 8 3 2 2 2 17 9 2 3 11 1 1 2

TempoDentro 9 4 8 6 19 10 10 7 9 9 7 8 4 4 3 16 3 28 7 7 7 17 21 28 14 9 5 4 6 8

Tempo Total 12 9 30 26 20 15 29 10 11 10 8 12 6 5 9 26 7 36 10 9 9 19 38 37 16 12 16 5 7 10

Com base nessa TABELA1, podemos fazer uma anlise de distribuies estatsticas. 15-20

Dados: X: mdia de uma distribuio. Md(X): Mediana de uma distribuio. Mo: Moda de uma distribuio. DM: Desvio mdio de uma distribuio. s2: Varincia de uma distribuio. s : Desvio padro. CV: Coeficiente de variao. x*i : ponto mdio de um intervalo de classes. fi : Frequncia de um intervalo de classes. fri : Frequncia relativa de um intervalo de classes. Fi : Frequncia acumulada de um intervalo de classes. Fri : Frequncia acumulada relativa de um intervalo de classes. Obs.: Os valores apresentados a seguir sero aproximao, portanto, no so exatos, mas, servem como base para avaliao. Para fazer a uma tabela de distribuio de freqncias com intervalo de classes sobre o tempo de espera fora e dentro do elevador necessrio definir qual ser o nmero de classes utilizadas na distribuio. Para criar a distribuio de freqncia de espera fora do elevador, utilizaremos a frmula: k = 1 + 3,22*log(n), onde k um nmero inteiro de classes e n o nmero de elementos da amostra de espera. (k pode ser o inteiro mais prximo ou o maior valor inteiro menor que k) Portanto, temos que k = 5,77. Utilizaremos k = 6, j que este o inteiro mais prximo do valor obtido. Portanto, temos 6 classes. Para definir qual o tamanho do intervalo das classes, temos a frmula: h = A/ k, onde h o tamanho do intervalo e A a amplitude das amostras, cujo valor dado pela diferena entre o maior e o menor elemento da amostra. No caso, 22 e 1, portanto, temos: A = 21 e h = 21/6 = 4.

Conforme a tabela a seguir:

16-20

TABELA2: Distribuio de frequncia de espera fora do elevador. Jepslons 15 59 9 13 13 17 17 21 21 25 Estatsticas: X = 1/ 30 * 198 = 6,6. Md(X) = 13 + (15 26) / 0*4 = No possvel calcular essa mdiana, j que a frequncia da classe mdia 0 Mo = 1 + (19-0) / (19 + 15) * 4 = 3,24 DM = 45,6/30 = 1,52 s2 = 525,76/29 = 18,13 s = 4,26 CV = 4,26/6,6 * 100 = 64,55 % (Alta disperso) Da mesma forma, faremos agora a distribuio de espera dentro do elevador. Sabe-se que para essa amostra: k = 5,77 Utilizaremos k = 5, j que este o maior inteiro menor que o valor obtido. Portanto, temos 5 classes. Para definir qual o tamanho do intervalo das classes, temos a frmula: h = A/ k, onde h o tamanho do intervalo e A a amplitude das amostras, cujo valor dado pela diferena entre o maior e o menor elemento da amostra. No caso, 28 e 3, portanto, temos: A = 25 e h = 25/5 = 5. Conforme a tabela a seguir: TABELA3: Distribuio de frequncia de espera dentro do elevador. Jepslons 38 8 13 13 18 18 23 23 28 x*i 5,5 10,5 15,5 20,5 25,5 fi 14 9 3 2 2 fri (%) 47 30 10 6,5 6,5 Fi 14 23 26 28 30 Fri (%) 47 77 87 93,5 100 x*i 3 7 11 15 19 23 fi 19 4 3 0 3 1 fri (%) 63,3 13,3 10 0 10 3,4 Fi 19 23 26 26 29 30 Fri (%) 63,3 76,6 86,3 89,3 96,3 100

X = 1/ 30 * 310 = 10,33 Md(x) = 13 + (15 26) / 3 * 5 = 12,27 Mo = 3 + (14-0) / (14 + 5) * 5 = 6,68 17-20

DM = 35,51/30 = 1,18 s2 = 383,64/29 = 13,23 s = 3,64 CV = 3,64/10,33 *100 = 35,24 % (Alta disperso) Finalmente, iremos verificar a distribuio para a espera total. Sabe-se que para essa amostra: k = 5,77 Utilizaremos k = 5, j que este o maior inteiro menor que o valor obtido. Portanto, temos 5 classes. Para definir qual o tamanho do intervalo das classes, temos a frmula: h = A/ k, onde h o tamanho do intervalo e A a amplitude das amostras, cujo valor dado pela diferena entre o maior e o menor elemento da amostra. No caso, 28 e 3, portanto, temos: A = 33 e h = 33/5 = 7. Conforme a tabela a seguir: TABELA4: Distribuio de frequncia de espera dentro do elevador. Jepslons 5 12 12 19 19 26 26 33 33 40 x*i 8,5 15,5 22,5 29,5 36,5 fi 15 6 2 4 3 fri (%) 50 20 7 13 10 Fi 15 21 23 27 30 Fri (%) 50 70 77 90 100

X = 1/ 30 * 493 = 16,43 Md(x) = 12 + (15 15) / 6 *7 = 12 Mo = 5 + (15-0) / (15 + 9) * 7 = 9,375 DM = 48,07/30 = 1,6 s2 = 674,23/29 = 23,25 s = 4,82 CV = 4,82/16,43 *100 = 29,34 % (Mdia disperso) Analisando a TABELA2 e a TABELA3, podemos ver o tempo espera fora e dentro do elevador foi menor que 12 Jepslons (60seg) para cerca de 80% eventos e nos casos de esperas maiores que 18 Jepslons (90seg) no chegam a 15% dos eventos. Pela TABELA4, podemos perceber que 50% dos eventos tiverem espera total menor que 12 Jepslons (60seg).Podemos ver que os melhores casos de espera foram: 18-20

Melhor caso: - Espera fora: 1 Jepslons(5seg) - Espera dentro: 3 Jepslons(15seg) - Espera total: 5 Jepslons(25seg) Caso mdio: - Espera fora: 6,6 Jepslons (~30seg) - Espera dentro: 10,33 Jepslons (~50seg) - Espera total: 16,43 Jepslons (~83seg) Pior caso: - Espera fora: 22 Jepslons (110seg) - Espera dentro: 28 Jepslons (140seg) - Espera total: 38 Jepslons (190seg) possvel concluir que, baseados na suposio e na distribuio apresentadas, o algoritmo seria bastante eficiente se modelado para uma situao real. Analise de tempo de algoritmo: Tempo de usuario : 0.000 microsegundos Tempo de Sistema: 0.008 microsegundos Tempo Total: Tempo Real: 0.008 microsegundos 0.009 microsegundos

Levando em considerao a tamanho do arquivo e os tempos de execuo, fcil perceber que o tempo real e o tempo total so muito prximo, portanto, isso no afetaria a simulao real desconsiderarmos a parte de hardware que comanda o controlador.

19-20

CONCLUSO
Aps a realizao do trabalho foi possvel perceber a dificuldade de implementar um projeto de modelagem de uma situao real. Partindo do ponto que no possvel prever como ser o funcionamento real de um elevador, necessrio pensar em uma lgica de controle que atenda o mximo de usurios em um menor perodo de tempo, porm impedindo que os mesmos tenham que esperar o elevador por muito tempo. Levando em considerao que um projeto de dois estudantes, possvel comparar a forma de trabalho de dois representantes de empresas diferentes, porm com o mesmo propsito. Visto que os dois precisam encontrar tempo suficiente para desenvolver o que foi proposto no tempo estipulado e no prejudicar o trabalho que deve ser realizao dentro da empresa de cada um. Finalmente, o trabalho permitiu uma melhor compreenso de como construir um projeto com o auxlio de um colega, alm de aumentar nosso conhecimento sobre o funcionamento de algoritmos para controle de grande mquinas, como a base do trabalho, um elevador.

20-20

Você também pode gostar