Advertisement
Guest User

simulador

a guest
Apr 30th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.61 KB | None | 0 0
  1. import rand_generator
  2. import Evento
  3. import Lista
  4. import Servico
  5. import Peca
  6. import Registrador
  7. import Aleatorio
  8.  
  9.  
  10. class Simulador:
  11.     """
  12.    Representa o simulador com os dados iniciais pre-inseridos
  13.  
  14.    A unidade de tempo é o minuto
  15.    """
  16.  
  17.     def __init__(self, nome: str = "SimuladorX", debug: bool = False, registrar: bool = True, aleatorio: bool = False,
  18.                  gui_stream: list = None):
  19.         self.nome = nome
  20.  
  21.         self.debug = debug
  22.         self.registrar = registrar  # Atrasa bastante o acesso ao programa
  23.         self.seed_aleatoria = aleatorio
  24.  
  25.         # Representa o sitio onde são adicionados os prints caso queiramos imprimir num GUI e não na consola
  26.         self.gui_stream = gui_stream
  27.  
  28.         if gui_stream is not None:
  29.             self.debug = False
  30.  
  31.         # Numero de pecas diferentes
  32.         self.numero_pecas = 2
  33.  
  34.         # Relogio do simulador - Sempre inicializado a 0
  35.         self.tempo = 0
  36.  
  37.         # Tempo de funcionamento da simulacao
  38.         #       Horas de producao por dia
  39.         self.horas = 8
  40.         #       Dias da simulacao
  41.         self.dias = 20
  42.  
  43.         # Servicos - pode haver mais que um
  44.         self.matriz_servicos = [[] for i in range(self.numero_pecas)]
  45.         #   ---> Servicos Peca B
  46.         self.matriz_servicos[0].append(Servico.Servico(self, 2, 0.7, 10 * 1111111, 10, nome="Perfuracao_A"))
  47.         self.matriz_servicos[0].append(Servico.Servico(self, 4, 1.2, 11 * 1111111, 11, nome="Polimento_A"))
  48.         #   ---> Servicos Peca B
  49.         self.matriz_servicos[1].append(Servico.Servico(self, 0.75, 0.3, 12 * 1111111, 12, nome="Perfuracao_B"))
  50.         self.matriz_servicos[1].append(Servico.Servico(self, 3, 1, 13 * 1111111, 13, maquinas=2, nome="Polimento_B"))
  51.         #   ---> Servicos Comuns
  52.         servico = Servico.Servico(self, 1.4, 0.3, 14 * 1111111, 14, maquinas=2, nome="Envernizamento_Comum")
  53.         self.matriz_servicos[0].append(servico)
  54.         self.matriz_servicos[1].append(servico)
  55.  
  56.         self.servicos = []
  57.         for i in range(len(self.matriz_servicos)):
  58.             for j in range(len(self.matriz_servicos[i])):
  59.                 if self.matriz_servicos[i][j] not in self.servicos:
  60.                     self.servicos.append(self.matriz_servicos[i][j])
  61.  
  62.         # Lista de eventos - onde são mantidos todos os eventos da simulacao - Apenas existe uma por simulador
  63.         self.lista = Lista.Lista(self)
  64.  
  65.         # Tipos de Pecas vendidas
  66.         self.tipo_pecas = [
  67.             Peca.Peca(0, 1 * 1000000, 1, 5, Aleatorio.exp_neg, "A", 0.05, seed_aleatoria=self.seed_aleatoria),
  68.             Peca.Peca(1, 2 * 1000000, 2, 1.33, Aleatorio.exp_neg, "B", 0.05, seed_aleatoria=self.seed_aleatoria)]
  69.  
  70.         # Numero de pecas vendidas
  71.         self.pecas_vendidas = [0 for i in range(self.numero_pecas)]
  72.         self.pecas_criadas = [0 for i in range(self.numero_pecas)]
  73.  
  74.         # Custo inicial de quaisquer alteracoes
  75.         self.divida = 0
  76.  
  77.         if self.registrar:
  78.             self.registo = Registrador.comeca_registo()
  79.             Registrador.regista(self.registo, str(self))
  80.         else:
  81.             self.registo = None
  82.  
  83.     def __str__(self):
  84.         string = ""
  85.         string += "Simulador \"" + self.nome + "\":\n"
  86.  
  87.         if self.debug:
  88.             string += "\tModo Debug\n"
  89.         if self.registrar:
  90.             string += "\tA registar valores em " + Registrador.diretorio_registos + " -> " + self.registo.name + "\n"
  91.         if self.seed_aleatoria:
  92.             string += "\tA usar seeds aleatorias\n"
  93.  
  94.         string += "\n\tHorario de funcionamento: " + str(self.horas) + " "
  95.         if self.horas == 1:
  96.             string += "hora "
  97.         else:
  98.             string += "horas "
  99.         string += "por dia durante " + str(self.dias) + " "
  100.         if self.dias == 1:
  101.             string += "dia"
  102.         else:
  103.             string += "dias"
  104.  
  105.         string += "\n\tTipos de Pecas:\n"
  106.         for peca in self.tipo_pecas:
  107.             string += altera_string(str(peca), "\t", "\t\t") + "\n"
  108.  
  109.         string += "\n\tServicos:\n"
  110.         for i in range(len(self.tipo_pecas)):
  111.             string += "\t\tPeca " + str(self.tipo_pecas[i].nome) + ":\n"
  112.             for j in range(len(self.matriz_servicos[i])):
  113.                 string += altera_string(str(self.matriz_servicos[i][j]), "\t", "\t\t\t") + "\n"
  114.  
  115.         return string
  116.  
  117.     def insereEvento(self, evento):
  118.         self.lista.insere_evento(evento)
  119.  
  120.     def altera_aleatoriedade(self, altera: bool):
  121.         self.seed_aleatoria = altera
  122.         for serv in self.servicos:
  123.             serv.altera_aleatoriedade(altera)
  124.         for peca in self.tipo_pecas:
  125.             peca.altera_aleatoriedade(altera)
  126.  
  127.     def executa(self):
  128.         for i in range(self.numero_pecas):
  129.             self.insereEvento(Evento.Chegada(self.tempo, self, self.matriz_servicos[i][0], self.tipo_pecas[i]))
  130.             rand_generator.randst(self.tipo_pecas[i].semente, self.tipo_pecas[i].stream,
  131.                                   self.tipo_pecas[i].seed_aleatoria)
  132.  
  133.         dias_executados = 0
  134.  
  135.         if self.registrar:
  136.             Registrador.regista(self.registo,
  137.                                 "\n______________________Inicio da Simulacao_____________________________\n")
  138.  
  139.         while dias_executados < self.dias:
  140.             self.executa_dia(dias_executados)
  141.             print("Dia executado: " + str(dias_executados + 1))
  142.             dias_executados += 1
  143.  
  144.         strings = self.relat()
  145.         if self.gui_stream is None:
  146.             for linha in strings:
  147.                 print(linha)
  148.         else:
  149.             self.gui_stream.extend(strings)
  150.  
  151.         if self.registrar:
  152.             for l in strings:
  153.                 Registrador.regista(self.registo, l)
  154.             if self.gui_stream is not None:
  155.                 self.gui_stream.append(
  156.                     "\nDados de registo salvos em " + Registrador.diretorio_registos + " -> " + self.registo.name)
  157.             print("\nDados de registo salvos em " + Registrador.diretorio_registos + " -> " + self.registo.name)
  158.             Registrador.fecha_registo(self.registo)
  159.  
  160.     def executa_dia(self, dias_executados: int):
  161.         temp_string = "\n\n||||||||||||||||||||\n\n"
  162.         temp_string += "->\tDia " + str(dias_executados + 1) + ":"
  163.         temp_string += "\n\n||||||||||||||||||||\n"
  164.         if self.debug:
  165.             if self.gui_stream is None:
  166.                 print(temp_string)
  167.             else:
  168.                 self.gui_stream.append(temp_string)
  169.         if self.registrar:
  170.             Registrador.regista(self.registo, temp_string)
  171.  
  172.         while self.tempo < (self.horas * 60 * (dias_executados + 1)):
  173.             linhas = self.lista.lista_to_string()
  174.             for l in linhas:
  175.                 if self.debug:
  176.                     if self.gui_stream is None:
  177.                         print(l)
  178.                     else:
  179.                         self.gui_stream.append(l)
  180.                 if self.registrar:
  181.                     Registrador.regista(self.registo, l)
  182.             evento = self.lista.retira_evento()
  183.             self.tempo = evento.instante
  184.             self.act_stats()
  185.             evento.executa()
  186.  
  187.     def act_stats(self):
  188.         """M�todo que actualiza os valores estat�sticos do simulador"""
  189.         atualizados = []
  190.         for i in range(self.numero_pecas):
  191.             for j in range(len(self.matriz_servicos[i])):
  192.                 if self.matriz_servicos[i][j] not in atualizados:
  193.                     self.matriz_servicos[i][j].act_stats()
  194.                     atualizados.append(self.matriz_servicos[i][j])
  195.  
  196.     def relat(self):
  197.         """M�todo que apresenta os resultados de simula��o finais"""
  198.         strings = []
  199.         for i in range(self.numero_pecas):
  200.             strings.append("\n\n|----------------- Estatisticas da Peca " + str(
  201.                 self.tipo_pecas[i].nome) + " ------------------------|")
  202.             for j in range(len(self.matriz_servicos[i])):
  203.                 strings.append("\n\n------------ Resultados " + str(
  204.                     self.matriz_servicos[i][j].nome) + "---------------\n\n")
  205.                 relat_servico = self.matriz_servicos[i][j].relat()
  206.                 for string in relat_servico:
  207.                     strings.append(string)
  208.  
  209.         strings.append("\n\n-----Resultados------------\n\n")
  210.  
  211.         lucro_total = 0
  212.         for i in range(self.numero_pecas):
  213.             strings.append("Peca " + str(self.tipo_pecas[i].nome) + ":")
  214.             strings.append("\tPreco por Peca: " + str(self.tipo_pecas[i].custo) + " euros")
  215.             strings.append("\tPecas Criadas: " + str(self.pecas_criadas[i]))
  216.             strings.append("\tPecas Vendidadas: " + str(self.pecas_vendidas[i]))
  217.             lucro = self.pecas_vendidas[i] * self.tipo_pecas[i].custo
  218.             lucro_total += lucro
  219.             strings.append("\tLucro total: " + "{:.2f}".format(lucro))
  220.             strings.append(
  221.                 "\tLucro apos pagar divida: " + "{:.2f}".format(lucro - self.divida))
  222.  
  223.         strings.append("Lucro total producao: " + "{:.2f}".format(lucro_total))
  224.         strings.append(
  225.             "Lucro producao apos pagar divida: " + "{:.2f}".format(lucro_total - self.divida))
  226.         return strings
  227.  
  228.     def regista_servidor(self):
  229.         Registrador.regista(self.registo, "Simulador \"" + self.nome + "\":")
  230.  
  231.         string = "\tHorario de funcionamento: " + str(self.horas) + " "
  232.         if self.horas == 1:
  233.             string += "hora "
  234.         else:
  235.             string += "horas "
  236.         string += "por dia durante " + str(self.dias) + " "
  237.         if self.dias == 1:
  238.             string += "dia"
  239.         else:
  240.             string += "dias"
  241.         Registrador.regista(self.registo, string)
  242.  
  243.         string = "\tTipos de Pecas:\n"
  244.         for peca in self.tipo_pecas:
  245.             string += "\t\t" + str(peca) + "\n"
  246.         Registrador.regista(self.registo, string)
  247.  
  248.         string = "\tServicos:\n"
  249.         for i in range(len(self.tipo_pecas)):
  250.             string += "\t\tPeca " + str(self.tipo_pecas[i].nome) + ":\n"
  251.             for j in range(len(self.matriz_servicos[i])):
  252.                 string += "\t\t\t" + str(self.matriz_servicos[i][j]) + "\n"
  253.         Registrador.regista(self.registo, string)
  254.  
  255.     def limpa_servicos(self):
  256.         self.matriz_servicos = [[] for i in range(self.numero_pecas)]
  257.         self.servicos = []
  258.  
  259.     def restora_lista_servicos(self):
  260.         self.servicos = []
  261.         for i in range(len(self.matriz_servicos)):
  262.             for j in range(len(self.matriz_servicos[i])):
  263.                 if self.matriz_servicos[i][j] not in self.servicos:
  264.                     self.servicos.append(self.matriz_servicos[i][j])
  265.  
  266.     def remove_servico(self, peca, indice):
  267.         self.matriz_servicos[peca.tipo] = self.matriz_servicos[peca.tipo][:indice] + self.matriz_servicos[peca.tipo][
  268.                                                                                      indice + 1:]
  269.  
  270.     def altera_maquinas_servico(self, indice: int, maquinas: int):
  271.         self.servicos[indice].altera_maquinas(maquinas)
  272.  
  273.     def altera_tempo_servico(self, indice: int, media: float, desvio: float):
  274.         self.servicos[indice].altera_tempo(media, desvio)
  275.  
  276.     def altera_tempo_chegada(self, indice: int, media: float):
  277.         self.tipo_pecas[indice].altera_media(media)
  278.  
  279.     def altera_custo_peca(self, indice: int, custo: float):
  280.         self.tipo_pecas[indice].altera_custo(custo)
  281.  
  282.     def altera_horas(self, horas: int):
  283.         self.horas = horas
  284.  
  285.     def altera_dias(self, dias: int):
  286.         self.dias = dias
  287.  
  288.     def altera_registrar(self, altera: bool):
  289.         if not self.registo and altera:
  290.             self.registo = Registrador.comeca_registo()
  291.  
  292.     def restora_simulador(self):
  293.         self.tempo = 0
  294.         self.lista = Lista.Lista(self)
  295.         self.pecas_vendidas = [0 for i in range(self.numero_pecas)]
  296.         self.pecas_criadas = [0 for i in range(self.numero_pecas)]
  297.         for serv in self.servicos:
  298.             serv.restora_servico()
  299.  
  300.         if self.registrar:
  301.             self.registo = Registrador.comeca_registo()
  302.             Registrador.regista(self.registo, str(self))
  303.         else:
  304.             self.registo = None
  305.  
  306.  
  307. def altera_string(string: str, prefixo: str, adiciona: str) -> str:
  308.     nova = ""
  309.     (antes, sep, depois) = string.partition(prefixo)
  310.     while sep != "":
  311.         nova += (adiciona + antes + sep)
  312.         (antes, sep, depois) = depois.partition(prefixo)
  313.     nova += adiciona + antes
  314.     return nova
  315.  
  316.  
  317. if __name__ == "__main__":
  318.     sim = Simulador(registrar=True)
  319.     # sim.altera_dias(20)
  320.     # sim.altera_horas(8)
  321.     print(str(sim))
  322.     sim.executa()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement