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 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)