Last active
October 29, 2020 17:45
-
-
Save gabrielfern/182e1bb91bdd9da887313c926800b776 to your computer and use it in GitHub Desktop.
Implementação do Escalonador - ADSD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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)} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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