Projeto
de Implementação I
- Simulação de um Supermercado -
2000.1:
-
Modelo
básico
-
Forma
básica de funcionamento do sistema:
-
Forma
básica de funcionamento do Modelo
-
Modelagem
de um Cliente
-
Modelagem
de um Caixa
-
Modelagem
do Supermercado
Modelagem
e Simulação de um Supermercado
Esta simulação
vai permitir:
-
Ao dono de um
supermercado gerar estatísticas que permitam ver qual o melhor numero
de caixas de supermercado para a freqüência de chegada de clientes
do seu ponto.
-
Ao dono do supermercado
realizar cálculos dos custos de operação do supermercado
em função do faturamento gerado por cada caixa.
Modelo básico:
O modelo do
supermercado terá 3 tipos de dados básicos (objetos):
-
O Cliente - Um
cliente chega no supermercado num determinado momento, compra uma quantidade
de coisas, podendo pagar com cheque ou dinheiro.
-
O Caixa de Supermercado
- O caixa de supermercado possui uma Fila de Clientes e características
como eficiência, etc.
-
O Supermercado
- Um Supermercado possui um determinado número de caixas, que são
diferentes quanto à sua eficiência e um Relógio interno,
além da capacidade de calcular as suas estatísticas.
Forma
básica de funcionamento do sistema:
No sistema o usuário
entra com os seguintes dados:
-
O número de caixas
do supermercado, indicando para cada caixa se ele é eficiente,
médio ou ruim.
-
O tempo médio
de chegada, em segundos, de novos clientes no supermercado.
-
Quanto tempo de operação,
em horas, do supermercado o usuário deseja simular (tempo total
de simulação).
-
Estes dados podem ser
digitados em uma tela de entrada de dados ou então lidos de um arquivo
de configuração. Implemente ambas as opções.
O formato do arquivo de configuração está descrito
abaixo.
O Sistema proverá
ao usuário os seguintes dados:
-
O faturamento total
do supermercado no período.
-
O faturamento médio
por caixa.
-
O faturamento real de
cada caixa.
-
O lucro por caixa, descontando-se
o salario deste caixa no período compreendido pela simulação.
Ignore outros custos, como luz elétrica, manutenção
do terminal de ponto de venda, etc.
-
O tempo médio
de permanência de um cliente na fila.
-
O número de clientes
que desistiram porque a fila estava muito longa.
-
O faturamento que deixou
de ser realizado em função dos clientes que desistiram.
-
O Nome do Supermercado lido do arquivo
de configuração deve aparecer na tela quando o sistema terminar
a simulação.
Forma
básica de funcionamento do Modelo:
O supermercado
funcionará da seguinte forma:
-
A intervalos randômicos
com média dada pelo usuário chegam novos clientes no supermercado.
-
Cada cliente compra
um número variável de produtos, que possuem preço
variável, ambos gerados aleatoriamente em um intervalo.
-
Há dois tipos
de cliente: Um tipo de cliente escolhe a menor fila, o outro olha para
a quantidade de compras das pessoas na fila e escolhe a com a menor quantidade
para ficar.
-
Se o cliente não
encontrar uma fila que o satisfaça, ele abandona o carrinho com
as compras e vai embora. O valor dos produtos de um carrinho abandonado
são computados como faturamento que o supermercado deixou de realizar.
O supermercado possuirá:
-
Uma lista circular que
conterá todos os caixas e que será percorrida constantemente
até o fim do tempo de simulação.
-
A cada passada pela
lista, o supermercado incrementa o seu relógio interno de um segundo.
-
Ao passar pela lista,
toda vez que encontrar um cliente numa fila com tempo de saída igual
ao tempo atual, atenderá o cliente e o tirará da fila.
-
Se o tempo atual for
o tempo da chegada do próximo cliente, este será gerado,
suas compras geradas e um lugar para ele numa fila escolhido. Logo após,
o tempo de chegada do próximo cliente será gerado. O programa
inicia com a geração da chegada do primeiro cliente.
Comentário à distribuição
de valores aleatórios
Este é um trabalho de aula e por
isso devemos fazer alguns compromissos para que o tamanho do trabalho fique
dentro de limites factíveis. Se nos pensarmos bem, vamos chegar
à conclusão que uma distribuição uniforme faz
sentido para o tempo de chegada dos clientes mas com certeza não
faz sentido para a quantidade de compras que o cliente escolhe. Se nos
resolvessemos ir adiante e também dizer que o tempo que o
caixa leva para digitar um produto é um valor aleatorio dentro de
um intervalo, o qual é diferente para caixas bons, médios
e ruins; assumir uma distribuição uniforme aqui também
com certeza não seria adequado. Nos caso do tempo de digitação
do caixa, com certeza uma distribuição normal seria um valor
mais realista. Para o criterio de escolha da quantidade de produtos, fatores
sócio-econômicos com certeza estariam em jogo, sendo uma distribuição-t
aqui talvez um chute aceitável.
Mas como isto é um trabalho de aula.
não vamos complicar onde não há necessidade. O importante
é aprender a programar uma simulação, e não
obter dados absolutamente realistas.
Toques de programação
para geração de valores aleatórios em um intervalo:
-
Gerar valores aleatorios com distribuição
uniforme no intervalo 0 a 1, utilize as funções rand e srand.
-
Lembre-se de inicializar o sempre gerador
de numeros aleatorios, antes de usar, para garantir de que sejam usados
valores diferentes em cada simulação.
-
Para gerar um numero entre 0 e 1, voce precisa
dividir o valor gerado por RAND_MAX, definido em stdlib.h.
-
Para gerar um numero aleatorio com distribuição
uniforme em um intervalo, pegue este resultado, multiplique pelo tamanho
do intervalo e adicione a valor do limite inferior do intervalo.
Por exemplo: para gerar um valor aleatorio de compras entre
2 e 100, você pega o tamanho do intervalo, que é de 2 a 100
inclusive, logo 99 valores, e multiplica o seu numero aleatorio de
0 a 1 por 99. A seguir adiciona o limite inferior do intervalo, 2, ao resultado.
Para que voce possa usar este numero ainda falta truncar, pegando so a
parte inteira. Para isto basta fazer um typecasting: inteiro = (int)
real;
Modelagem
de um Cliente
Um cliente é
um tipo de dado que possui:
-
Um tipo: buscaMenorFila
ou buscaFilaComMenosProdutos.
Este tipo é
gerado aleatoriamente ao ser criado o cliente.
-
A informação
se ele vai pagar com cheque ou dinheiro. A probabilidade de ele pagar com
cheque é de 20%.
-
Um total de compras.
Gerado aleatoriamente entre 2 e 100.
-
Um valor total das compras.
O valor de cada ítem varia entre R$ 1 e R$ 90. Para cada ítem
o valor é gerado aleatoriamente. Depois disso o valor total é
computado.
-
O tempo de chegada no
supermercado.
-
O tempo em que vai sair
da fila do caixa.
O tempo de saída
da fila:
-
Computado para o cliente
depois que é escolhido um caixa para o cliente. Calculado com base
nas compras do cliente, desempenho do caixa, se ele vai pagar com cheque
e na soma dos tempos das pessoas que estão na fila antes dele.
-
O sistema sempre olha
o tempo de saída do primeiro da fila de cada caixa, para ver se
ele vai sair agora.
Se não
houver fila com menos que 15 pessoas, o cliente abandona o carrinho.
Modelagem
de um Caixa:
Um Caixa possui
uma Fila de Clientes. O Caixa:
-
Tem um identificador
(Rosilda, Dona_Beia, etc)
-
Tem um desempenho: eficiente,
médio, ruim. Um caixa eficiente leva 1 segundo para um ítem,
o médio leva 2 segundos e o ruim 4 segundos. Codifique eficiente,
médio, ruim como numeros inteiros 1,2,3.
-
Tem um salario.
-
Se o cliente paga com
cheque, o caixa eficiente leva mais 10 segundos para processar, o médio
leva mais 25 segundos e o ruim mais 60 segundos. Se o cliente paga em dinheiro,
o tempo de pagamento é Zero.
-
O tempo de saída
de um cliente é calculado quando ele é incluído na
fila.
Dados do Caixa:
-
Ponteiro para a fila
de clientes.
-
Número de clientes
na fila.
-
Número de clientes
atendidos.
-
Tempo médio de
espera de um cliente na fila.
-
Faturamento total.
-
Faturamento médio.
-
Além desses,
os vistos anteriormente:
-
Identificador
-
Eficiência.
Modelagem
do Supermercado
O tipo Supermercado
possui os seguintes dados:
-
Um ponteiro para a lista
circular de Caixas.
-
Um relógio interno,
inicialmente Zero.
-
O número de clientes
que desistiram.
-
O valor das compras
dos clientes que desistiram.
Todos os outros dados
estatísticos e operacionais podem ser calculados a partir dos dados
armazenados nos caixas.
O Supermercado,
ao ser iniciado o programa, lerá um arquivo de configuração
contendo as informações necessárias para a execução
da simulação. Este arquivo conterá as seguintes informações,
utilizando-se da seguinte sintaxe:
# comentarios quaisquer ate
o fim da linha
# mais um comentario.
# =======================================
Nome do Supermercado Inclusive
Brancos
tempo_de_simulacao_em_horas
tempo_medio_de_chegada_de_cliente_em_segundos
numero de caixas
id_caixa1_sem_brancos eficiencia1
salario1
id_caixa2_sem_brancos eficiencia2
salario2
- - -
id_caixaN_sem_brancos eficienciaN
salarioN
Exemplo:
#=============================
# Dados do Super NaoCompre
# Programado por Hack++
# Arquivo: naocompre.dat
#=============================
NaoCompre Costeira
5
7
4
Maria_Benta 1 800
Juliana_Digito 1 800
Zeca_Mole 3 180
Joao_DeMora 3 180
#================FIM
Os seguintes critérios devem
obrigatoriamente ser obedecidos pela rotina de leitura do arquivo de configuração:
-
Entre as linhas de um arquivo de configuracao
pode existir qualquer numero de linhas em branco.
-
Cada caixa esta em uma linha. O nome
do caixa deve ser escrito sem brancos e a eficiencia codificada como um
inteiro 1,2 ou 3. o salario eh escrito usando-se um inteiro para o valor.
-
Comentarios podem aparecer em qualquer lugar
do arquivo. Sao identificados por um # na primeira coluna. Linhas com comentario
sao ignoradas.
-
Dados, quasquer que sejam devem sempre comecar
na primeira coluna.
Toques de programação para
a leitura do arquivo:
-
Para ler as linhas do arquivo de configuração,
use uma rotina que vai lendo linha a linha utilizando fgets(arquivo, string).
até chegar ao fim do arquivo. fgets() le uma linha de um arquivo
dado.
-
O fim de um arquivo você pode testar
com feof(arquivo).
-
Cada string lido pode entao ser interpretado
com sscanf(), depois de voce ter verificado se string[0] não é
um '#' (comentario) ou '\n' ou caracter branco (linha vazia). A função
sscanf(), string-scan-function, percorre um string e retira de la dados
formatados da mesma forma que scanf() o faz do teclado (stdin).
-
Veja as manpages dessas funções
para tirar as suas dúvidas: sscanf, feof, fgets.
-
Quando falamos em arquivo sempre estamos falando
de um ponteiro do tipo FILE*, retornado por uma funç~ao de abertura
de arquivo do tipo FILE *fopen("nome do arquivo", "modo de abrir");
Última atualização:
24.04.2000