Skip to content

Instantly share code, notes, and snippets.

@gabrielfern
Last active October 29, 2020 17:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gabrielfern/182e1bb91bdd9da887313c926800b776 to your computer and use it in GitHub Desktop.
Save gabrielfern/182e1bb91bdd9da887313c926800b776 to your computer and use it in GitHub Desktop.
Implementação do Escalonador - ADSD
# -*- coding: utf-8 -*-
def num_gerador(mod):
"""
Gera números aleatórios baseado
no metódo aditivo com módulo mod
"""
from time import time
num = int(time())
while (True):
num = (num + 7) % mod
yield num
def gera_uniforme(comeco, fim):
"""
Retorna uma função que a cada chamada
gera números da uniforme(comeco, fim)
"""
num_ger = num_gerador(1 + fim - comeco)
def unif():
return comeco + next(num_ger)
return unif
def testa_uniforme(comeco, fim, n):
"""
Calcula as ocorrências de cada número
do intervalo [comeco...fim] em n chamadas
a uniforme(comeco, fim)
"""
unif = gera_uniforme(comeco, fim)
l = [unif() for _ in range(n)]
return {k : l.count(k) for k in range(comeco, fim + 1)}
# -*- coding: utf-8 -*-
from aleatorios import gera_uniforme
from time import sleep
from sys import version_info
TEMPO_REAL = False
DURACAO = 30
class Escalonador:
def __init__(self, duracao):
self.tempo = 0
self.duracao = duracao
self.unif_cheg_fregues_1 = gera_uniforme(1, 10)
self.unif_cheg_fregues_2 = gera_uniforme(1, 5)
self.unif_term_servico = gera_uniforme(3, 7)
self.servico_ocup = ''
self.tempo_cheg_fregues_1 = None
self.tempo_cheg_fregues_2 = None
self.tempo_term_servico = None
self.fila_1 = 0
self.fila_2 = 0
self.escal_cheg_fregues_1()
self.escal_cheg_fregues_2()
self.log_num = 0
def escal_cheg_fregues_1(self):
self.tempo_cheg_fregues_1 = self.unif_cheg_fregues_1() + self.tempo
def escal_cheg_fregues_2(self):
self.tempo_cheg_fregues_2 = self.unif_cheg_fregues_2() + self.tempo
def escal_term_servico(self):
self.tempo_term_servico = self.unif_term_servico() + self.tempo
def log_status(self):
print('Elementos na Fila 1:', self.fila_1)
print('Elementos na Fila 2:', self.fila_2)
print('Serviço', 'ocupado (' +
self.servico_ocup + ')' if self.servico_ocup else 'livre')
print()
def log_cheg_fregues_1(self):
self.log_num += 1
print((str(self.log_num) + '.' +
' Chegada de freguês da classe 1').ljust(37) +
' ' + str(self.tempo).rjust(5) + '"')
self.log_status()
def log_cheg_fregues_2(self):
self.log_num += 1
print((str(self.log_num) + '.' +
' Chegada de freguês da classe 2').ljust(37) +
' ' + str(self.tempo).rjust(5) + '"')
self.log_status()
def log_term_servico(self):
self.log_num += 1
print((str(self.log_num) + '.' +
' Término de serviço').ljust(37) +
' ' + str(self.tempo).rjust(5) + '"')
self.log_status()
def ocupa_servico(self):
if not self.servico_ocup:
if self.fila_1 > 0:
self.fila_1 -= 1
self.servico_ocup = 'freguês da classe 1'
self.escal_term_servico()
elif self.fila_2 > 0:
self.fila_2 -= 1
self.servico_ocup = 'freguês da classe 2'
self.escal_term_servico()
def n_terminado(self):
return True if self.tempo < self.duracao else False
def avanca_tempo(self):
self.tempo += 1
if self.tempo_term_servico == self.tempo:
self.servico_ocup = ''
self.ocupa_servico()
self.log_term_servico()
if self.tempo_cheg_fregues_1 == self.tempo:
self.fila_1 += 1
self.ocupa_servico()
self.escal_cheg_fregues_1()
self.log_cheg_fregues_1()
if self.tempo_cheg_fregues_2 == self.tempo:
self.fila_2 += 1
self.ocupa_servico()
self.escal_cheg_fregues_2()
self.log_cheg_fregues_2()
if __name__ == "__main__":
if version_info < (3, 5):
print('Necessario versao mais atualizada Python 3.5+')
exit(1)
escal = Escalonador(DURACAO)
while escal.n_terminado():
if TEMPO_REAL:
sleep(1)
escal.avanca_tempo()
1. Chegada de freguês da classe 2 1"
Elementos na Fila 1: 0
Elementos na Fila 2: 0
Serviço ocupado (freguês da classe 2)
2. Término de serviço 4"
Elementos na Fila 1: 0
Elementos na Fila 2: 0
Serviço livre
3. Chegada de freguês da classe 2 4"
Elementos na Fila 1: 0
Elementos na Fila 2: 0
Serviço ocupado (freguês da classe 2)
4. Chegada de freguês da classe 1 6"
Elementos na Fila 1: 1
Elementos na Fila 2: 0
Serviço ocupado (freguês da classe 2)
5. Término de serviço 9"
Elementos na Fila 1: 0
Elementos na Fila 2: 0
Serviço ocupado (freguês da classe 1)
6. Chegada de freguês da classe 1 9"
Elementos na Fila 1: 1
Elementos na Fila 2: 0
Serviço ocupado (freguês da classe 1)
7. Chegada de freguês da classe 2 9"
Elementos na Fila 1: 1
Elementos na Fila 2: 1
Serviço ocupado (freguês da classe 1)
8. Chegada de freguês da classe 2 11"
Elementos na Fila 1: 1
Elementos na Fila 2: 2
Serviço ocupado (freguês da classe 1)
9. Chegada de freguês da classe 2 15"
Elementos na Fila 1: 1
Elementos na Fila 2: 3
Serviço ocupado (freguês da classe 1)
10. Término de serviço 16"
Elementos na Fila 1: 0
Elementos na Fila 2: 3
Serviço ocupado (freguês da classe 1)
11. Chegada de freguês da classe 2 16"
Elementos na Fila 1: 0
Elementos na Fila 2: 4
Serviço ocupado (freguês da classe 1)
12. Chegada de freguês da classe 1 19"
Elementos na Fila 1: 1
Elementos na Fila 2: 4
Serviço ocupado (freguês da classe 1)
13. Chegada de freguês da classe 2 19"
Elementos na Fila 1: 1
Elementos na Fila 2: 5
Serviço ocupado (freguês da classe 1)
14. Término de serviço 20"
Elementos na Fila 1: 0
Elementos na Fila 2: 5
Serviço ocupado (freguês da classe 1)
15. Chegada de freguês da classe 2 24"
Elementos na Fila 1: 0
Elementos na Fila 2: 6
Serviço ocupado (freguês da classe 1)
16. Término de serviço 26"
Elementos na Fila 1: 0
Elementos na Fila 2: 5
Serviço ocupado (freguês da classe 2)
17. Chegada de freguês da classe 1 26"
Elementos na Fila 1: 1
Elementos na Fila 2: 5
Serviço ocupado (freguês da classe 2)
18. Chegada de freguês da classe 2 26"
Elementos na Fila 1: 1
Elementos na Fila 2: 6
Serviço ocupado (freguês da classe 2)
19. Término de serviço 29"
Elementos na Fila 1: 0
Elementos na Fila 2: 6
Serviço ocupado (freguês da classe 1)
20. Chegada de freguês da classe 1 30"
Elementos na Fila 1: 1
Elementos na Fila 2: 6
Serviço ocupado (freguês da classe 1)
21. Chegada de freguês da classe 2 30"
Elementos na Fila 1: 1
Elementos na Fila 2: 7
Serviço ocupado (freguês da classe 1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment