def test_puedo_decir_que_un_dia_de_todas_las_semanas_es_no_laborable(self): calendario = Calendario() calendario.agregar_fecha_no_laborable(DiaNoLaborable("sunday")) calendario.agregar_fecha_no_laborable(DiaNoLaborable("monday")) self.assertFalse(calendario.es_laborable(datetime(2012,05,13))) self.assertFalse(calendario.es_laborable(datetime(2012,05,14)))
def calcola_classifiche_singolo_processo(squadre, giornate, all_permutations, starting_time): """Calcola la 'classifica delle classifiche' utilizzando un singolo processo""" classifica_calendari = dict(zip(squadre, [0] * Costanti.NUM_SQUADRE)) print 'in elaborazione...' for perm in all_permutations: calendario = Calendario(perm, giornate) calendario.calcola_classifica() squadre_campioni = calendario.get_squadra_campione() classifica_attuale = dict(zip(squadre, [0] * Costanti.NUM_SQUADRE)) for sc in squadre_campioni: classifica_attuale[sc] = 1 classifica_calendari = dict( Counter(classifica_calendari) + Counter(classifica_attuale)) utils.esporta_classifica_csv(classifica_calendari) print 'Tempo impiegato: {0:.2f} s'.format(time.time() - starting_time)
def test_regla_expirable(self): calendario = Calendario() calendario.agregar_fecha_no_laborable( ReglaExpirable(datetime(2012,02,10), datetime(2012,5,20), DiaNoLaborable("tuesday") ) ) self.assertFalse(calendario.es_laborable(datetime(2012,03,13))) self.assertTrue(calendario.es_laborable(datetime(2012,05,22)))
def test_puedo_agregar_una_fecha_no_laborable(self): calendario = Calendario() calendario.agregar_fecha_no_laborable( FechaNoLaborable(datetime(2012,1,1)) ) self.assertTrue(calendario.es_laborable(datetime(2012,06,30))) self.assertFalse(calendario.es_laborable(datetime(2012,1,1)))
def poblacion(self, ): try: return self._poblacion except AttributeError: from calendario import Calendario self._poblacion = [] for calendario in Calendario.objects.filter(espacio=self): calendario = Calendario.create(calendario.id) self._poblacion.append(calendario) return self._poblacion
def calcola_classifiche_distribuito(squadre, giornate, all_permutations, starting_time): """Calcola la 'classifica delle classifiche' utilizzando un pool di processi""" print '{} processi da lanciare per {} calendari'.format( Costanti.NUM_PROCESSES, len(all_permutations)) print 'inizializzazione...' calendari = [Calendario(perm, giornate) for perm in all_permutations] initialization_time = time.time() print 'Tempo impiegato per inizializzazione: {0:.2f} s'.format( initialization_time - starting_time) print 'in elaborazione...' pool = Pool(processes=Costanti.NUM_PROCESSES) print '\tmap...' classifiche = pool.map(calcola_classifica_distribuito_map, calendari) print '\treduce...' classifica_calendari = reduce(calcola_classifica_distribuito_reduce, classifiche) utils.esporta_classifica_csv(classifica_calendari) ending_time = time.time() print 'Tempo impiegato per elaborazione: {0:.2f} s'.format( ending_time - initialization_time) print 'Tempo impiegato totale: {0:.2f} s'.format(time.time() - starting_time)
def input_correcto(self): ''' Revisa si el parametro ingresado en el superinput (self.entrada) es de alguno de los tipos permitidos en self.lista Si lo es, retorna True. Si no, False. ''' v1, v2, v3, v4, v5, v6 = False, False, False, False, False, False for i in self.lista: if self.es_int(i): try: self.entrada = int(self.entrada) v1 = True except: v1 = False elif self.es_float(i): try: self.entrada = float(self.entrada) v2 = True except: v2 = False elif self.es_mail(i): print('Aún no está creada la opcion mail del superinput') v3 = False elif self.es_str(i): v4 = True elif i == 'fecha': v5 = True for l in self.entrada: if not (l.isnumeric() or l == '/'): v5 = False if (not self.mensaje_error) and (not v5): self.mensaje_error = 'Formato de fecha incorrecto, ingresar de nuevo.' if v5: dia = self.entrada[:self.entrada.find('/')] fecha = self.entrada[self.entrada.find('/') + 1:] mes = fecha[:fecha.find('/')] fecha = fecha[fecha.find('/') + 1:] ano = fecha c = Calendario() if not c.fecha_valida(dia, mes, ano): v5 = False if not self.mensaje_error: self.mensaje_error = 'Fecha no válida, ingresar otra fecha.' elif i == 'hora': v6 = True if len(self.entrada) != 8: v6 = False if v6: for l in self.entrada: if not (l.isnumeric() or l == ':'): v6 = False if not self.mensaje_error and not v6: self.mensaje_error = 'Formato de hora incorrecto, ingresar de nuevo.' if v6: if self.entrada[0] == 0: horas = int(self.entrada[1]) else: horas = int(self.entrada[:2]) if self.entrada[3] == 0: minutos = int(self.entrada[4]) else: minutos = int(self.entrada[3:5]) if self.entrada[6] == 0: segundos = int(self.entrada[7]) else: segundos = int(self.entrada[6:]) if not (horas >= 0 and horas <= 23): v6 = False if not (minutos >= 0 and minutos <= 59): v6 = False if not (segundos >= 0 and segundos <= 59): v6 = False if not v6 and not self.mensaje_error: self.mensaje_error = 'Hora no válida, ingresar otra hora.' ''' Este segmento esta encaminado para que el programa acepte horas no solo del formato hh:mm:ss, sino que también horas con el formato hh:mm o simplemente hh, supondiendo que todo lo demás es 0. Terminar más adelante. Hay partes que se deben usar del algoritmo actualmente funcional del programa (que acepta solo hh:mm:ss) if v6: hora = '' if self.entrada.find(':') != -1: horas = self.entrada[:self.entrada.find(':')] hora = self.entrada[self.entrada.find(':') + 1:] else: horas = self.entrada if hora.find(':') != -1: minutos = hora[:hora.find(':')] hora = hora[hora.find(':') + 1:] else: minutos = hora if minutos != hora: segundos = hora ''' return (v1 or v2 or v3 or v4 or v5 or v6)
def test_puedo_mezclar_fechas_exactas_y_dias_de_la_semana(self): calendario = Calendario() calendario.agregar_fecha_no_laborable(DiaNoLaborable("sunday")) calendario.agregar_fecha_no_laborable(DiaNoLaborable("monday")) calendario.agregar_fecha_no_laborable( FechaNoLaborable(datetime(2012,1,1)) ) calendario.agregar_fecha_no_laborable( FechaNoLaborable(datetime(2012,3,21)) ) self.assertFalse(calendario.es_laborable(datetime(2012,03,21))) self.assertFalse(calendario.es_laborable(datetime(2012,1,1))) self.assertFalse(calendario.es_laborable(datetime(2012,05,13))) self.assertFalse(calendario.es_laborable(datetime(2012,05,14))) self.assertTrue(calendario.es_laborable(datetime(2012,2,24))) self.assertTrue(calendario.es_laborable(datetime(2012,7,3)))
def test_puedo_agregar_mas_de_una_fecha_no_laborable(self): calendario = Calendario() calendario.agregar_fecha_no_laborable( FechaNoLaborable(datetime(2012,1,1)) ) calendario.agregar_fecha_no_laborable( FechaNoLaborable(datetime(2012,3,21)) ) calendario.agregar_fecha_no_laborable( FechaNoLaborable(datetime(2012,7,14)) ) calendario.agregar_fecha_no_laborable( FechaNoLaborable(datetime(2012,6,30)) ) self.assertFalse(calendario.es_laborable(datetime(2012,06,30))) self.assertFalse(calendario.es_laborable(datetime(2012,03,21))) self.assertFalse(calendario.es_laborable(datetime(2012,07,14))) self.assertFalse(calendario.es_laborable(datetime(2012,1,1))) self.assertTrue(calendario.es_laborable(datetime(2012,1,2))) self.assertTrue(calendario.es_laborable(datetime(2012,2,24))) self.assertTrue(calendario.es_laborable(datetime(2012,7,1))) self.assertTrue(calendario.es_laborable(datetime(2012,3,1)))
def tarefa_calendario(self): self.c = Calendario() self.setCentralWidget(self.c)
Altayskiy = Campo( "Altayskiy", "Алтаыскиы", 10, 0, "Não", 0, "Frio", ((int(screen.get_width() * .6), int(screen.get_height() * .4))), foto="jo.jpg") lista_gulags = [ Trofimovsk, Solovetsky, Norilsk, Sevvostlag, Pechorlag, Karlag, Altayskiy ] #Criação do calendário calendario = Calendario(screen, sw, sh) click = False #Seleção inicial de Gulag def menu_selecao(): screen.fill((0, 0, 0)) global sh, sw running = True click = False #Setup dos botões
def generarpoblacioninicial(self, ): """ Genera individuos desde cero y los guarda en el atributo 'poblacion'. @Parametros: None. @Return: None. """ from calendario import Calendario from horario import Horario cant_horas = 0 individuos = [] # Iteramos generando todas las combinaciones de horarios # posibles. Y por cada uno creamos un calendario. # Contamos la cantidad total de horas. for coordinador in self.coordinadores: cant_horas += coordinador.especialidad.carga_horaria_semanal # Cantidad de iteraciones por los dias. for dia in self.dias_habiles: # Cantidad de iteraciones por las horas. for hora in self.horas: # Iteracion por cada coordinador. for coordinador in self.coordinadores: # Se crea un Calendario. calendario = Calendario.create() # Se le asigna este espacio. calendario.espacio = self # A su vez el Calendario es agregado a la poblacion. individuos.append(calendario) # Se crea un Horario. horario = Horario() # Se le asigna el Coordinador. horario.coordinador = coordinador # Se le asigna una hora desde. horario.hora_desde = hora.hora_desde # Se le asigna una hora hasta. horario.hora_hasta = hora.hora_hasta # Se le asigna un dia de la semana. horario.dia_semana = dia.dia # El Horario es agregado al Calendario. calendario.agregar_horario(horario) # La cantidad total de horas no fue cubierta, quiere # decir que en el calendario deben haber horas libres. if len(self.dias_habiles) * len(self.horas) != cant_horas: # Cantidad de iteraciones por los dias. for dia in self.dias_habiles: # Cantidad de iteraciones por las horas. for hora in self.horas: # Se crea un Calendario. calendario = Calendario.create() # Se le asigna este espacio. calendario.espacio = self # A su vez el Calendario es agregado a la poblacion. individuos.append(calendario) # Se crea un Horario. horario = Horario() # Se le asigna una hora desde. horario.hora_desde = hora.hora_desde # Se le asigna una hora hasta. horario.hora_hasta = hora.hora_hasta # Se le asigna un dia de la semana. horario.dia_semana = dia.dia # El Horario es agregado al Calendario. calendario.agregar_horario(horario) # Rellenamos los calendarios generando Horarios aleatoriamente. coordinadores_asig_global = [] for coordinador in self.coordinadores.all(): carga_horaria = coordinador.especialidad.carga_horaria_semanal for i in range(carga_horaria): coordinadores_asig_global.append(copy.copy(coordinador)) for individuo in individuos: # Se crea la lista de coordinadores a asignar. coordinadores_asig = copy.copy(coordinadores_asig_global) for coordinador in coordinadores_asig_global: if coordinador == individuo.horarios[0][0].coordinador: coordinadores_asig.remove(coordinador) break horas_libres = abs(len(self.dias_habiles) * len(self.horas) - cant_horas) for i in range(horas_libres): coordinadores_asig.append(None) # Iteramos por la cantidad de dias. for dia in self.dias_habiles: # Tambien por la cantidad de horas. for hora in self.horas: if len(coordinadores_asig) == 0: break indice = randint(0, len(coordinadores_asig)-1) coordinador = coordinadores_asig[indice] # Se crea un Horario. horario = Horario() # Se le asigna el Coordinador. horario.coordinador = coordinador # Se le asigna una hora desde. horario.hora_desde = hora.hora_desde # Se le asigna una hora hasta. horario.hora_hasta = hora.hora_hasta # Se le asigna un dia de la semana. horario.dia_semana = dia.dia # Comprobamos que el Horario generado # no exista en el Calendario. existe = False for franja_horaria in individuo.horarios: for horario_comp in franja_horaria: if horario == horario_comp: existe = True # Si ya existia continuamos generando. if existe: continue coordinadores_asig.remove(coordinador) # Lo agregamos a la lista de horarios del Calendario. individuo.agregar_horario(horario) self.poblacion.append(individuo)