/****************************************************** * Inicia el algoritmo genetico con base en la poblacion * ******************************************************/ public void IniciarGenetico() { // Si no se ha generado la población if (this.poblacion == null) { Console.WriteLine("genetico NO iniciado, no hay una población"); return; } // Si la población fue generada correctamente for (int i = 0; i < this.numGenerations; i++) { Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("GENERACION: " + i); // Asigna los vehiculos a las lineas this.AsignarVehiculosALineas(this.poblacion); //this.PrintPoblacion(); // Se calcula el fitness. Si es una solucion valida, debo parar porque ya tenemos solucion bool validSolution = this.Fitness(this.poblacion, i); if (validSolution == true) { this.mejorPoblacion = this.poblacion; return; } // Genera una nueva población this.AplicarOperadoresGeneticos(); } }
/************************************************************************** * Genera una población apartir de la lista de espera y la lista de lineas * **************************************************************************/ public void GenerarPoblacionInicial() { for (int i = 0; i < this.listaEspera.Count; i++) { double prob = GetProbVehiculo(listaEspera.ElementAt(i), this.lineas); listaEspera.ElementAt(i).SetProbAsignado(prob); } this.poblacion = new Poblacion(this.listaEspera, this.lineas); }
static void Main(string[] args) { // Creo la configuración Configuracion config = new Configuracion(); // Creo las lineas List <char> l1 = new List <char>(); l1.Add('a'); l1.Add('b'); l1.Add('c'); List <char> l2 = new List <char>(); l2.Add('c'); List <char> l3 = new List <char>(); l3.Add('a'); l3.Add('b'); l3.Add('c'); config.AgregarLinea(200, l1, true); config.AgregarLinea(100, l2, true); config.AgregarLinea(300, l3, true); // Creo los vehiculos config.AgregarVehiculoEnEspera(1, 'b', 20); config.AgregarVehiculoEnEspera(2, 'a', 30); config.AgregarVehiculoEnEspera(3, 'c', 60); config.AgregarVehiculoEnEspera(4, 'a', 40); config.AgregarVehiculoEnEspera(5, 'a', 60); config.AgregarVehiculoEnEspera(6, 'b', 40); config.AgregarVehiculoEnEspera(7, 'c', 30); config.AgregarVehiculoEnEspera(8, 'c', 20); config.AgregarVehiculoEnEspera(9, 'b', 120); config.AgregarVehiculoEnEspera(10, 'a', 80); config.AgregarVehiculoEnEspera(11, 'a', 100); config.AgregarVehiculoEnEspera(12, 'c', 100); // Inicio la asignación config.GenerarPoblacionInicial(); config.IniciarGenetico(); Poblacion poblacion = config.GetMejorPoblacion(); // Aqui deberia tomar sol y usarlo en la interfaz String fin = Console.ReadLine(); }
/**************************************************************** * 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); }
// IMPRIME UNA SOLUCION en consola public void PrintPoblacion() { Poblacion pob = this.poblacion; List <vehiculo> listaEsperaTemp = pob.GetVehiculos(); List <Linea> lineasTemp = pob.GetLineas(); Console.WriteLine("##############################################################"); Console.WriteLine("##############################################################"); Console.WriteLine("LINEAS"); for (int i = 0; i < lineasTemp.Count; i++) { Console.WriteLine("---------------------------------------------------------------"); Console.WriteLine("Linea: " + i); Console.WriteLine("Tiempo de atencion: " + lineasTemp.ElementAt(i).GetTiempoAtencion()); Console.WriteLine("Tiempo restante: " + lineasTemp.ElementAt(i).GetTiempoRestante()); Console.WriteLine("¿Está activa?: " + lineasTemp.ElementAt(i).GetEstaActiva()); Console.WriteLine("---------------------------------------------------------------"); } Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("VEHICULOS"); for (int i = 0; i < listaEsperaTemp.Count; i++) { Console.WriteLine("---------------------------------------------------------------"); Console.WriteLine("Vehiculo: " + listaEsperaTemp.ElementAt(i).GetId()); Console.WriteLine("Tipo: " + listaEsperaTemp.ElementAt(i).GetTipo()); Console.WriteLine("Tiempo total: " + listaEsperaTemp.ElementAt(i).GetTiempo()); Console.WriteLine("Probabilidad: " + listaEsperaTemp.ElementAt(i).GetProbAsignado()); Linea linea = listaEsperaTemp.ElementAt(i).GetLineaAsignada(); if (linea != null) { Console.WriteLine("Tiempo restante de linea asignada: " + linea.GetTiempoRestante()); } Console.WriteLine("---------------------------------------------------------------"); } Console.WriteLine("##############################################################"); Console.WriteLine("##############################################################"); }
/**************************************************** * 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 "); } } } }