/**************************************************************** * Evalua si la población es buena o no * * Retorna True si la población cumple con las caracteristicas * * Retorna False si la población no cumple con las caracteristicas * ****************************************************************/ public bool Fitness(Poblacion poblacion, int generation) { // Busca la linea con menor capacidad Linea lineaConMenoCapacidad = this.GetLineaConMenoCapacidad(); int maximoValorPorLinea = lineaConMenoCapacidad.GetTiempoAtencion(); // Busca si alguna linea se pasa del rango int rango = maximoValorPorLinea + 20; if (this.LineasFueraDeRango(rango) == false) { return(false); } // Verifica que cada lineas esté en el rango if (this.LineasEnRango(rango) == false) { return(false); } // Verifico la equivalencia final int mayorCargaPosible = lineaConMenoCapacidad.GetTiempoAtencion() - lineaConMenoCapacidad.GetTiempoRestante() + 20; if (this.VerificarEquivalencia(mayorCargaPosible)) { // Si llega aqui, es una solucion valida return(true); } // Si se acabaron las generaciones if (generation == this.numGenerations) { return(true); } return(false); }
/**************************************************** * Asigna los vehiculos de una poblacion a las lineas * ****************************************************/ public void AsignarVehiculosALineas(Poblacion poblacion) { // Asigna el valor inicial a cada linea foreach (Linea l in poblacion.GetLineas()) { l.RestablecerTiemporestante(); } foreach (vehiculo v in this.listaEspera) { v.SetLineaAsignada(null); } // Ordena la lista de menor a mayor segun las probabilidades del vehiculo IEnumerable <vehiculo> sorted = poblacion.GetVehiculos().OrderBy(x => x.GetProbAsignado()); List <vehiculo> tempListaEspera = new List <vehiculo>(); foreach (vehiculo v in sorted) { tempListaEspera.Add(v); } for (int i = 0; i < tempListaEspera.Count; i++) { // Aleatorio segun la probabilidad del vehiculo int rand = rnd.Next(0, 101); if ((rand < tempListaEspera.ElementAt(i).GetProbAsignado())) { vehiculo tempVehiculo = tempListaEspera.ElementAt(i); // Busco las lineas en que puede entrar List <Linea> tempLineas = new List <Linea>(); for (int j = 0; j < poblacion.GetLineas().Count; j++) { if (poblacion.GetLineas().ElementAt(j).GetEstaActiva()) { List <char> opciones = poblacion.GetLineas().ElementAt(j).getTiposVehiculos(); if (opciones.Contains(tempVehiculo.GetTipo())) { if ((poblacion.GetLineas().ElementAt(j).GetTiempoRestante() - tempVehiculo.GetTiempo()) >= 0) { tempLineas.Add(poblacion.GetLineas().ElementAt(j)); } } } } // Lista de lineas donde el vehiculo puede entrar if (tempLineas.Count > 0) { // ver cual está vacia Linea tempMenorLinea = tempLineas.ElementAt(0); bool asignado = false; foreach (Linea l in tempLineas) { if (l.GetTiempoAtencion() == l.GetTiempoRestante()) { tempVehiculo.SetLineaAsignada(l); l.RestarTiempo(tempVehiculo.GetTiempo()); l.IncrementarVehiculos(); asignado = true; break; } int tiempoAsignado = tempMenorLinea.GetTiempoAtencion() - tempMenorLinea.GetTiempoRestante(); if (tiempoAsignado > (l.GetTiempoAtencion() - l.GetTiempoRestante())) { tempMenorLinea = l; } } // si no, ver la que tenga menor carga y que no sobrepase el limite if (asignado == false) { int futuroValorLinea = (tempMenorLinea.GetTiempoAtencion() - tempMenorLinea.GetTiempoRestante()) + tempVehiculo.GetTiempo(); int maximoConsumo = this.GetTiempoatencionLineaMasPequena() + 20; if (futuroValorLinea <= maximoConsumo) { tempVehiculo.SetLineaAsignada(tempMenorLinea); tempMenorLinea.RestarTiempo(tempVehiculo.GetTiempo()); tempMenorLinea.IncrementarVehiculos(); } } } Console.WriteLine("El vehiculo: " + tempVehiculo.GetId()); if (tempVehiculo.GetLineaAsignada() != null) { Console.WriteLine("Fué asignado en la linea: " + tempVehiculo.GetLineaAsignada().GetTiempoAtencion()); Console.WriteLine("#"); Console.WriteLine("--------------------------------------"); } else { Console.WriteLine("- - - > No se asignó el vehiculo "); } } } }