static AdjacencyList leerGrafo() { AdjacencyList grafo; string archivoTxt = Path.Combine(Directory.GetCurrentDirectory(), "adyacenciaExamen.txt"); string[] lines = File.ReadAllLines(archivoTxt); //Console.WriteLine(lines.Length); grafo = new AdjacencyList(int.Parse(lines[0])); foreach (var i in lines) { string[] j = i.Split(','); int x = int.Parse(j[0]); try{ grafo.agregaVertice(int.Parse(j[0]), int.Parse(j[1]), int.Parse(j[2])); }catch (Exception) { //PARA EVITAR LA PRIMERA LINEA QUE ES EL NUMERO DE NODOS continue; } } return(grafo); }
static void Main(string[] args) { //Initialize parameters //f -> number of frogs //m -> number of memeplexes, f is distributed in these memeplexes //Each memeplex consists of n frogs that F = mn //f(i) -> fitness //n -> number of frogs in each memeplex //q -> number of paths in a submemeplex of a frog //Px -> position of a frog //PB -> best solution //PW -> worst solution //S -> the updated step size of the frog-leaping //Smax -> maximum step size allowed by a frog after being affected //i -> number of iterations //wth is U(i) -> vector de la rana i //Variables miscelaneas grafo = leerGrafo(); bool[] visitados = fillArrayBool(grafo.tamanioGrafo()); /*Variables algoritmo*/ Random rnd = new Random(); int numRnd = rnd.Next(10, 20); int cantNodos = grafo.tamanioGrafo(); int f = (numRnd % 2 == 0) ? numRnd : numRnd + 1; int m = 2; int n = f / m; int q = cantNodos; //caminos por rana Console.WriteLine($"{cantNodos} Numero total de ranas : {f} .\n Numeros memeples {m} \n Numero de submemeplex {n} \n Cantidad de ranas {q}"); //3.1 POSITION OF INDIVIDUAL FROG //CAMINOS OPTIMOS POSIBLES //OBTENER TODOS LOS CAMINOS INICIALES POSIBLES //DE MANERA ALEATORIA ASIGNARLOS A DIFERENTES RANAS //CADA RANA AL PRINCIPIO TENDRÁ UN CAMINO IGUAL ->CADA SUBMEMEPLEX SERÁ IGUAL List <Camino> caminos = new List <Camino>(); caminos.Clear(); for (int i = 0; i < cantNodos; i++) { camino.Clear(); int costo = 0; visitados = fillArrayBool(cantNodos); int[] res = busqueda(i, i, visitados, costo); //costos.Add(costo); //Console.WriteLine($"costo : {res[0]}"); if (res[0] == 200) { costo = res[1]; double fit = getFitness(costo); //Console.WriteLine($"costo : {fit}"); Camino c = new Camino(camino.ToArray(), fit, costo); caminos.Add(c); } else if (res[0] == 500) { return; } } List <Rana> ranas = new List <Rana>(); //GENERA F CANTIDAD DE RANAS for (int i = 0; i < f; i++) { //a cada rana, asignarle una lista de caminos ranas.Add(new Rana(obtenerCaminos(q, caminos))); } List <Mememplex> memeplexes = new List <Mememplex>(); //CONSTRUIR M MEMEPLEXES Camino mejorCaminoGlobal = new Camino(caminos[0].camino, 1, 0); int cont = 0; for (int i = 0; i < m; i++) { List <Rana> ranasSub = new List <Rana>(); for (int j = 0; j < n; j++) { //Estas ranas van a este memeplex var rOrd = ranas[cont].caminos.OrderByDescending(x => x.fitness).ToList(); ranasSub.Add(new Rana(rOrd)); cont++; //Obtener peor camino de una rana cualquiera mejorCaminoGlobal = rOrd[4]; } memeplexes.Add(new Mememplex(ranasSub)); } //LOCAL EXPLORATION List <Tuple <int, int, Camino> > mejor = new List <Tuple <int, int, Camino> >(); System.IO.StreamWriter archivo = new System.IO.StreamWriter(Path.Combine(Directory.GetCurrentDirectory(), "ranas.txt")); double mejorFitness = 0.0; int iteracion = 0; while (mejorCaminoGlobal.fitness > mejorFitness) { mejorFitness = mejorCaminoGlobal.fitness; Console.WriteLine($"mejor fitness {mejorFitness}"); //ACTUALIZAR MEMEPLEX memeplexes = localSearch(memeplexes, mejorCaminoGlobal); //BUSCA MEJOR RANA archivo.WriteLine($"Iteración {iteracion}"); List <Tuple <int, int, Camino> > mejorMemeplex = new List <Tuple <int, int, Camino> >(); for (int me = 0; me < memeplexes.Count; me++) //MEMEPLEXES { archivo.WriteLine($" Memeplex {me}"); List <Tuple <int, Camino> > mejorSubmemeplex = new List <Tuple <int, Camino> >(); for (int r = 0; r < memeplexes[me].ranas.Count; r++) //SUBMEMEPLEXES { archivo.WriteLine($" SubMemeplex {r}"); List <Camino> nuevosCaminos = new List <Camino>(); for (int cm = 0; cm < memeplexes[me].ranas[r].caminos.Count; cm++) //RANAS aka CAMINOS { double dado = numAzar(); Camino at = memeplexes[me].ranas[r].caminos[cm]; double pj = (double)2 * (n + 1 - cm) / (n * (n + 1)); archivo.WriteLine($" Rana {cm} : {imprimirCaminoTxt(at.camino)} | Fitness {at.fitness:#.#####} | Costo {at.costo} | Probabilidad {pj:#.#####} | Dado {dado}"); if (dado > pj || cm == 0) //Rana que entra con la probabilidad { nuevosCaminos.Add(memeplexes[me].ranas[r].caminos[cm]); } Thread.Sleep(1); } //AGREGAR A ESTA RANA LAS QUE QUEDARON if (nuevosCaminos.Count > 0) { memeplexes[me].ranas[r].caminos = nuevosCaminos; } memeplexes[me].ranas[r].caminos = memeplexes[me].ranas[r].caminos.OrderBy(z => z.fitness).ToList(); mejorSubmemeplex.Add(new Tuple <int, Camino>(r, nuevosCaminos.First())); } var delSubmemeplx = mejorSubmemeplex.OrderByDescending(x => x.Item2.fitness).First(); mejorMemeplex.Add(new Tuple <int, int, Camino>(me, delSubmemeplx.Item1, delSubmemeplx.Item2)); } archivo.WriteLine($" Mejor de Memeplex"); Tuple <int, int, Camino> mejorMemeplexes = mejorMemeplex.OrderByDescending(x => x.Item3.fitness).First(); archivo.WriteLine(" " + imprimirCaminoTxt(mejorMemeplexes.Item3.camino)); mejor.Add(mejorMemeplexes); Console.WriteLine($"mejor global ant: {mejorCaminoGlobal.fitness} camino { imprimirCaminoTxt(mejorCaminoGlobal.camino) }"); mejorCaminoGlobal = mejorMemeplexes.Item3; Console.WriteLine($"mejor global aft: {mejorCaminoGlobal.fitness} camino { imprimirCaminoTxt(mejorCaminoGlobal.camino) }"); iteracion++; } archivo.Close(); //GUARDA EN EL ARCHIVO REPORTE LAS MEJORES RANAS POR ITERACION try{ using (System.IO.StreamWriter file = new System.IO.StreamWriter(Path.Combine(Directory.GetCurrentDirectory(), "caminos.txt"))) { for (int i = 0; i < mejor.Count; i++) { file.Write($"Iteración {i} -> "); file.WriteLine($"Camino: { imprimirCaminoTxt(mejor[i].Item3.camino)} Costo {mejor[i].Item3.costo}"); } file.Close(); } }catch (Exception e) { Console.WriteLine("No se ha guardado el archivo" + e); } }