Example #1
0
        //---------------------------------------------------------------------
        public static void TestRandomWalkv2(string mesh_type)
        {
            int[] sizes_mesh = new int[21] {
                10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50
            };
            int[] final_positions = new int[21] {
                99, 143, 195, 255, 323, 399, 483, 575, 675, 783, 899, 1023, 1155, 1295, 1443, 1599, 1763, 1935, 2115, 2303, 2499
            };
            for (int i = 0; i < sizes_mesh.Length; i++)
            {
                string size      = "_" + sizes_mesh[i] + "x" + sizes_mesh[i] + ".txt";
                string file_name = mesh_type + size;

                //Create the mesh environment
                MeshEnvironment env = new MeshEnvironment(_start: 0, _final: final_positions[i], _file_name: file_name, sizes_mesh[i]);
                env.InitEnviroment(type_mesh: mesh_type);

                Console.WriteLine("Init Execution -> " + file_name);

                //-------------------------------------------------------------------

                for (int j = 0; j < num_test; j++)
                {
                    RandomWalkv2 rw2 = new RandomWalkv2();
                    rw2.ExecuteRandomWalk(ref env);

                    AntColonyOptimizationv0 acov0 = new AntColonyOptimizationv0(_random_walk: true);
                    acov0.ExecuteACO(ref env);

                    ////Store variables in a txt
                    Console.WriteLine("Execution {0} of " + file_name, j);
                    StoreVariables_RW2(mesh_type, ref env, ref rw2);
                    StoreVariable_RW2_and_ACOv0(mesh_type, ref env, ref acov0, ref rw2);
                    env.InitPheromones(0);
                }

                Console.WriteLine("End Execution -> " + file_name);
                Console.WriteLine("---------------------------------------------");
            }
        }
        public static void Test_RWv2_ACOv0(string mesh_type)
        {
            int[] sizes_mesh = new int[21] {
                10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50
            };
            int[] final_positions = new int[21] {
                99, 143, 195, 255, 323, 399, 483, 575, 675, 783, 899, 1023, 1155, 1295, 1443, 1599, 1763, 1935, 2115, 2303, 2499
            };

            for (int i = 0; i < sizes_mesh.Length; i++)
            {
                string size      = "_" + sizes_mesh[i] + "x" + sizes_mesh[i] + ".txt";
                string file_name = mesh_type + size;

                Console.WriteLine("Init Execution -> " + file_name);

                //-------------------------------------------------------------------
                //Create the mesh environment
                MeshEnvironment env = new MeshEnvironment(_start: 0, _final: final_positions[i], _file_name: file_name, sizes_mesh[i]);
                env.InitEnviroment(type_mesh: mesh_type);

                //-------------------------------------------------------------------
                for (int j = 0; j < num_test; j++)
                {
                    //............................................................................
                    // ROUTE 1
                    env.FillDistanceMatrix();
                    DijkstraAlgorithm dk1 = new DijkstraAlgorithm();
                    dk1.Execute(ref env);

                    RandomWalkv2 rw1 = new RandomWalkv2();
                    rw1.ExecuteRandomWalk(ref env);

                    AntColonyOptimizationv0 aco1 = new AntColonyOptimizationv0(_random_walk: true);
                    aco1.ExecuteACO(ref env);

                    //............................................................................
                    //Insert the obstacle in a middle zone of the current optimal solution
                    InsertSeveralObstacle(ref env, num_obstacle: 2, num_routes: 2);
                    //............................................................................
                    // ROUTE 2 - REROUTING

                    env.FillDistanceMatrix();
                    DijkstraAlgorithm dk2 = new DijkstraAlgorithm();
                    dk2.Execute(ref env);

                    RandomWalkv2 rw2 = new RandomWalkv2();
                    rw2.ExecuteRandomWalk(ref env);

                    AntColonyOptimizationv0 aco2 = new AntColonyOptimizationv0(_random_walk: true);
                    aco2.ExecuteACO(ref env);

                    //............................................................................
                    ////Store variables in a txt
                    Console.WriteLine("Execution {0} of " + file_name, j);
                    StoreVariable_RWv2_ACOv0(mesh_type, ref env, ref dk1, ref aco1, ref dk2, ref aco2);

                    //............................................................................
                    //Reset environment
                    env.InitPheromones(0);
                    env.ClearObstacles();
                }

                Console.WriteLine("End Execution -> " + file_name);
                Console.WriteLine("---------------------------------------------");
            }
        }
        //-------------------------------------------------------------------
        public void ExecuteACO(ref MeshEnvironment env)
        {
            //Create a list of ants
            colony = CreateColony();

            if (!random_walk)
            {
                //Init pheromone minimum amount
                env.InitPheromones(tau_0);
            }
            //Variables  to control the evaporation
            bool almost_one_route = false;
            bool several_stucks   = false;

            //Variable to control the convergence
            bool converge = false;

            //Variable to take the execution time
            var watch = System.Diagnostics.Stopwatch.StartNew();

            while (!converge)
            {
                foreach (var ant in colony)
                {
                    //The current ant tries to find a route
                    List <int> route = ant.FindRoute(ref env);

                    //If the ant finds a route
                    if (route.Count != 0)
                    {
                        //Reinforce the route
                        Reinforcement(ref env, ref route);

                        //Set the flag to the evaporation in the current episode
                        almost_one_route = true;

                        //Check and set if the best cost changed
                        CheckAndSetBestCost(ref env, ref route);
                    }
                    else
                    {
                        //Control Testing Variables
                        stuck_roads++;

                        //Several stucks
                        if (stuck_roads % 10 == 0)
                        {
                            several_stucks = true;
                        }
                    }
                }

                env.ResetNodes();

                //If at least one ant found a route the evaporation step occurs
                if (almost_one_route || several_stucks)
                {
                    Evaporation(ref env);
                    almost_one_route = false;
                    several_stucks   = false;
                }

                //If a percentage of the ants follow the same path, the convergence variable will be true
                converge = CheckConvergence(ref colony, ref env);

                //Control Testing Variables
                //Episodes
                episode_counter++;
            }

            //Control Testing Variables
            //Execution Time
            watch.Stop();
            execution_time += watch.ElapsedMilliseconds;
        }