예제 #1
0
파일: Program.cs 프로젝트: fanyCaz/tso
        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);
        }
예제 #2
0
파일: Program.cs 프로젝트: fanyCaz/tso
        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);
            }
        }