internal List <List <List <double> > > MutarIndividuos(List <List <List <double> > > individuosAMutar, List <double> listaRandom, List <List <List <double> > > individuosMutados, double ciclo, Random random) { LogicaPrincipal logicaPrincipal = new LogicaPrincipal(); List <List <double> > individuoMutado = new List <List <double> >(); double numAleatorio; for (int i = 0; i < 2; i++) { numAleatorio = logicaPrincipal.GenerarNumAleatorio(listaRandom); //Console.WriteLine("num: " + numAleatorio); if (numAleatorio < 0.2) { individuoMutado = GenerarMutación(individuosAMutar[i], ciclo, random); individuosMutados.Add(individuoMutado); Console.WriteLine("Mutado"); } else { individuoMutado = individuosAMutar[i]; individuosMutados.Add(individuoMutado); } } return(individuosMutados); }
public static void main() { Coordinador miCoordinador = new Coordinador(); VentanaPrincipal ventanaPrincipal = new VentanaPrincipal(); LogicaPrincipal logicaPrincipal = new LogicaPrincipal(); Población población = new Población(); FunciónFitness funciónFitness = new FunciónFitness(); Intersección intersección = new Intersección(); Casamiento casamiento = new Casamiento(); Mutación mutación = new Mutación(); Selección selección = new Selección(); ventanaPrincipal.SetCoordinador(miCoordinador); logicaPrincipal.SetCoordinador(miCoordinador); población.SetCoordinador(miCoordinador); funciónFitness.SetCoordinador(miCoordinador); intersección.SetCoordinador(miCoordinador); casamiento.SetCoordiador(miCoordinador); mutación.SetCoordinador(miCoordinador); selección.SetCoordinador(miCoordinador); miCoordinador.setPoblación(población); miCoordinador.setVentanaPrincipal(ventanaPrincipal); miCoordinador.setLogicaPrincipal(logicaPrincipal); miCoordinador.SetFunciónFitness(funciónFitness); miCoordinador.SetIntersección(intersección); miCoordinador.SetCasamiento(casamiento); miCoordinador.SetMutación(mutación); miCoordinador.SetSelección(selección); }
internal List <List <List <double> > > SeleccionarPadres(List <double> listaRandom, List <List <List <double> > > poblaciónPrueba, List <List <double> > probabilidadesAcumuladasPrueba, List <List <List <double> > > listaPadresPrueba) { LogicaPrincipal logicaPrincipal = new LogicaPrincipal(); List <List <double> > padreAux = new List <List <double> >(); for (int i = 0; i < 2; i++) { List <List <double> > padre = new List <List <double> >(); double numAleatorioPrueba = logicaPrincipal.GenerarNumAleatorio(listaRandom); //Console.WriteLine("número aleatorio: " + numAleatorio); padre = SeleccionarPadre(poblaciónPrueba, probabilidadesAcumuladasPrueba, numAleatorioPrueba, listaPadresPrueba); while (padre == padreAux) { numAleatorioPrueba = logicaPrincipal.GenerarNumAleatorio(listaRandom); padre = SeleccionarPadre(poblaciónPrueba, probabilidadesAcumuladasPrueba, numAleatorioPrueba, listaPadresPrueba); } padreAux = padre; listaPadresPrueba.Add(padre); } return(listaPadresPrueba); }
internal List <List <double> > GenerarMutación(List <List <double> > individuoAMutar, double ciclo, Random random) { List <List <double> > individuoMutado = new List <List <double> >(); LogicaPrincipal logicaPrincipal = new LogicaPrincipal(); double posición = random.Next(0, individuoAMutar.Count); int i = 0; foreach (List <double> nodo in individuoAMutar) { double numAleatorio = random.Next(1, Convert.ToInt32(ciclo)); while (numAleatorio + nodo[4] + 4 >= ciclo) { numAleatorio = random.Next(1, Convert.ToInt32(ciclo)); //Console.WriteLine("numRand: " + numAleatorio); } List <double> nuevoNodo = new List <double>(); nuevoNodo.Add(nodo[0]); nuevoNodo.Add(nodo[1]); nuevoNodo.Add(nodo[2]); //double rand = r.Next(1, Convert.ToInt32(ciclo)); //Console.WriteLine("random: " + num); if (i == posición) { nuevoNodo.Add(numAleatorio); } else { nuevoNodo.Add(nodo[3]); } nuevoNodo.Add(nodo[4]); individuoMutado.Add(nuevoNodo); //numAleatorio = logicaPrincipal.GenerarNumAleatorio(ciclo); i++; } return(individuoMutado); }
public void Evaluar(int cantPoblación) { logicaPrincipal = new LogicaPrincipal(); funciónFitness = new FunciónFitness(); this.población = new Población(); intersección = new Intersección(); casamiento = new Casamiento(); mutación = new Mutación(); selección = new Selección(); List <int> listaNodos = new List <int>(); List <List <double> > listaPoblación = new List <List <double> >(); List <double> cicloNodo1 = new List <double>(); int cantGeneraciones = 1000; logicaPrincipal.InstanciarArchivos(); double ciclo = 0; double sumaIR; listaNodos.Add(8); listaNodos.Add(10); listaNodos.Add(14); List <double> individuo = new List <double>(); List <List <double> > datosFlujoNodos = new List <List <double> >(); List <List <double> > datosCicloNodos = new List <List <double> >(); List <List <double> > listaFlujoSaturación = new List <List <double> >(); List <List <double> > IRIntersecciones = new List <List <double> >(); List <List <double> > individuoPrueba = new List <List <double> >(); int cantIntersecciones = 0; cantIntersecciones = intersección.CalcularCantIntersecciones(listaNodos); for (int i = 0; i < cantIntersecciones; i++) { datosFlujoNodos = intersección.ObtenerDatosFlujoNodo(listaNodos[i], datosFlujoNodos); datosCicloNodos = intersección.ObtenerDatosCicloNodo(listaNodos[i], datosCicloNodos); listaFlujoSaturación = intersección.ObtenerFlujoSaturación(listaNodos[i], datosFlujoNodos, listaFlujoSaturación); IRIntersecciones = funciónFitness.ObtenerIR(listaNodos[i], datosFlujoNodos, datosCicloNodos, listaFlujoSaturación, IRIntersecciones, 0, 0); individuoPrueba = this.población.GenerarPoblación(listaNodos[i], datosCicloNodos, cantIntersecciones, individuoPrueba); //listaPoblación = población.GenerarPoblación(listaNodos[i], datosCicloNodos, cantIntersecciones, listaPoblación); } List <List <List <double> > > población = new List <List <List <double> > >(); //logicaPrincipal.imprimirDatos(individuoPrueba, "Individuo prueba: "); Random rand = new Random(); cicloNodo1 = datosCicloNodos[0]; ciclo = cicloNodo1[1]; for (int i = 0; i < 3; i++) { List <List <double> > individuoPruebaVEIncent = new List <List <double> >(); double nuevoEV = rand.Next(1, Convert.ToInt32(ciclo)); int j = 0; foreach (List <double> nodo in individuoPrueba) { List <double> nodoPrueba = new List <double>(); nodoPrueba.Add(nodo[0]); nodoPrueba.Add(nodo[1]); nodoPrueba.Add(nodo[2]); nodoPrueba.Add(nuevoEV); nodoPrueba.Add(nodo[4]); individuoPruebaVEIncent.Add(nodoPrueba); j++; } población.Add(individuoPruebaVEIncent); } logicaPrincipal.imprimirDatosGrandes(población, "Individuo nuevo"); for (int generacion = 0; generacion < cantGeneraciones; generacion++) { Console.WriteLine("Generación:" + generacion); int cont = 0; List <List <double> > IRPoblaciónPrueba = new List <List <double> >(); foreach (List <List <double> > ind in población) { IRIntersecciones = new List <List <double> >(); datosFlujoNodos = new List <List <double> >(); datosCicloNodos = new List <List <double> >(); listaFlujoSaturación = new List <List <double> >(); List <double> IRIndividuoPrueba = new List <double>(); foreach (List <double> inter in ind) { datosFlujoNodos = intersección.ObtenerDatosFlujoNodo(Convert.ToInt32(inter[0]), datosFlujoNodos); datosCicloNodos = intersección.ObtenerDatosCicloNodo(Convert.ToInt32(inter[0]), datosCicloNodos); listaFlujoSaturación = intersección.ObtenerFlujoSaturación(Convert.ToInt32(inter[0]), datosFlujoNodos, listaFlujoSaturación); IRIntersecciones = funciónFitness.ObtenerIR(Convert.ToInt32(inter[0]), datosFlujoNodos, datosCicloNodos, listaFlujoSaturación, IRIntersecciones, inter[3], 1); } logicaPrincipal.ImprimirDatos(IRIntersecciones, "IR Individuo "); sumaIR = funciónFitness.SumaIR(IRIntersecciones, 0); IRIndividuoPrueba.Add(cont); IRIndividuoPrueba.Add(sumaIR); IRPoblaciónPrueba.Add(IRIndividuoPrueba); cont++; } logicaPrincipal.ImprimirDatos(IRPoblaciónPrueba, "IR Población"); double sumaIRTotal = funciónFitness.SumaIR(IRPoblaciónPrueba, 0); //Console.WriteLine("Suma IR total población: "+ sumaIRTotal); List <List <double> > probabilidadIndividuos = new List <List <double> >(); foreach (List <double> IRInd in IRPoblaciónPrueba) { probabilidadIndividuos = logicaPrincipal.ObtenerProbabilidad(Convert.ToInt32(IRInd[0]), IRPoblaciónPrueba, sumaIRTotal, probabilidadIndividuos); } logicaPrincipal.ImprimirDatos(probabilidadIndividuos, "Probabilidad individuos"); List <List <double> > probabilidadesAcumuladasPrueba = new List <List <double> >(); probabilidadesAcumuladasPrueba = logicaPrincipal.ObtenerProbabilidadAcumulada(probabilidadIndividuos, 0, probabilidadesAcumuladasPrueba); logicaPrincipal.ImprimirDatos(probabilidadesAcumuladasPrueba, "Probabilidades acumuladas"); List <List <List <double> > > listaPadresPrueba = new List <List <List <double> > >(); List <double> listaRandom = new List <double>(); listaPadresPrueba = selección.SeleccionarPadres(listaRandom, población, probabilidadesAcumuladasPrueba, listaPadresPrueba); logicaPrincipal.imprimirDatosGrandes(listaPadresPrueba, "Padre"); double numAleatorio = logicaPrincipal.GenerarNumAleatorio(listaRandom); List <List <List <double> > > individuosAMutar = new List <List <List <double> > >(); if (numAleatorio < 0.6) { //Console.WriteLine("entra a cruzar"); individuosAMutar = casamiento.CruzarIndividuos(listaPadresPrueba); //individuosAMutar = casamiento.CruceAritmético(listaPadresPrueba); } else { individuosAMutar = listaPadresPrueba; } logicaPrincipal.imprimirDatosGrandes(individuosAMutar, "Hijos"); List <List <List <double> > > individuosMutados = new List <List <List <double> > >(); Random random = new Random(); individuosMutados = mutación.MutarIndividuos(individuosAMutar, listaRandom, individuosMutados, ciclo, random); logicaPrincipal.imprimirDatosGrandes(individuosMutados, "individuo mutado"); List <List <List <double> > > listaIndACompetir = new List <List <List <double> > >(); listaIndACompetir = selección.SeleccionarCompetidores(población, individuosMutados, listaIndACompetir); logicaPrincipal.imprimirDatosGrandes(listaIndACompetir, "Competidores: "); List <List <double> > listaIndASeleccionar = new List <List <double> >(); List <List <List <double> > > listaIRNodos = new List <List <List <double> > >(); listaIRNodos = funciónFitness.calcularIRNodos(listaIRNodos, IRIntersecciones, datosFlujoNodos, datosCicloNodos, listaFlujoSaturación, listaIndACompetir); List <List <double> > IRCompetidores = new List <List <double> >(); IRCompetidores = funciónFitness.DeterminarIRCompetidores(IRCompetidores, listaIRNodos); //logicaPrincipal.ImprimirDatos(IRCompetidores, "IR Competidores"); List <double> IRIND1 = IRCompetidores[0]; double ganador = selección.Ganador(IRCompetidores); List <List <double> > individuoGanador = new List <List <double> >(); individuoGanador = selección.SelecciónPorTorneo(ganador, individuoGanador, listaIndACompetir, IRIND1); logicaPrincipal.ImprimirDatos(individuoGanador, "Ganador"); List <double> listaDistancias = new List <double>(); listaDistancias = selección.Crowding(individuoGanador, población, listaDistancias); double posición = 0; posición = selección.PosiciónIndSemejante(listaDistancias, posición, listaDistancias[0]); //Console.WriteLine("Posición: "+posición); logicaPrincipal.imprimirDatosGrandes(población, "Población Original"); población = selección.InsertarIndividuoGanador(población, individuoGanador, posición); logicaPrincipal.imprimirDatosGrandes(población, "Población final"); } }
public void setLogicaPrincipal(LogicaPrincipal logicaPrincipal) { this.logicaPrincipal = logicaPrincipal; throw new NotImplementedException(); }
internal List <List <List <double> > > CruzarIndividuos(List <List <List <double> > > listaPadresPrueba) { double alpha = 0.5; List <List <double> > Padre1 = new List <List <double> >(); List <List <double> > Padre2 = new List <List <double> >(); List <List <List <double> > > listaHijos = new List <List <List <double> > >(); List <double> nodo1 = new List <double>(); List <double> nodo2 = new List <double>(); double verdeEfectivo1 = 0; double verdeEfectivo2 = 0; Padre1 = listaPadresPrueba[0]; Padre2 = listaPadresPrueba[1]; nodo1 = Padre1[0]; nodo2 = Padre2[0]; verdeEfectivo1 = nodo1[3]; verdeEfectivo2 = nodo2[3]; double Cmax = Math.Max(verdeEfectivo1, verdeEfectivo2); double Cmin = Math.Min(verdeEfectivo1, verdeEfectivo2); double I = Cmax - Cmin; double limite1 = Cmin - I * alpha; double limite2 = Cmax + I * alpha; int i = 0; Random r = new Random(); listaHijos = new List <List <List <double> > >(); foreach (List <List <double> > padre in listaPadresPrueba) { List <List <double> > hijo1 = new List <List <double> >(); List <List <double> > hijo2 = new List <List <double> >(); double num = Convert.ToDouble(r.Next(Convert.ToInt32(limite1), Convert.ToInt32(limite2))); foreach (List <double> nodo in padre) { List <double> nodoHijo1 = new List <double>(); List <double> nodoHijo2 = new List <double>(); if (i == 0) { nodoHijo1.Add(nodo[0]); nodoHijo1.Add(nodo[1]); nodoHijo1.Add(nodo[2]); nodoHijo1.Add(Math.Abs(num)); nodoHijo1.Add(nodo[4]); hijo1.Add(nodoHijo1); } else { nodoHijo2.Add(nodo[0]); nodoHijo2.Add(nodo[1]); nodoHijo2.Add(nodo[2]); nodoHijo2.Add(Math.Abs(num)); nodoHijo2.Add(nodo[4]); hijo2.Add(nodoHijo2); //Console.WriteLine("Agrega hijo2"); } } if (i == 0) { listaHijos.Add(hijo1); //Console.WriteLine("Agrega hijo1"); } else { listaHijos.Add(hijo2); //Console.WriteLine("Agrega hijo2"); } i++; } LogicaPrincipal logicaPrincipal = new LogicaPrincipal(); //logicaPrincipal.imprimirDatos(hijo1, "Hijo1"); //logicaPrincipal.imprimirDatos(hijo2, "Hijo2"); return(listaHijos); }