Ejemplo n.º 1
0
 public void reset()
 {
     currentCity = VisitedCities[0];
     VisitedCities.Clear();
     VisitedCities.Add(currentCity);
     VisitedRoads.Clear();
 }
Ejemplo n.º 2
0
        private int ChooseNextCityToVisit(PheromoneLookup pheromoneLookup, RouteEvaluator routeEvaluator, Graph graph)
        {
            int           currentCity       = CurrentRoute.Last();
            List <double> componentProducts = new List <double>();
            List <int>    citiesBeingConsideredToTravelTo = new List <int>();

            for (int cityToConsiderTravellingTo = 1; cityToConsiderTravellingTo <= graph.GraphOfNodes.Count; cityToConsiderTravellingTo++)
            {
                if (VisitedCities.Contains(cityToConsiderTravellingTo))
                {
                    continue;
                }
                citiesBeingConsideredToTravelTo.Add(cityToConsiderTravellingTo);

                double pheremoneOnEdge    = pheromoneLookup.GetPheromoneLevelForEdge(new int[] { currentCity, cityToConsiderTravellingTo });
                double pheremoneComponent = Math.Pow(pheromoneLookup.GetPheromoneLevelForEdge(new int[] { currentCity, cityToConsiderTravellingTo }), ACOConstants.ALPHA_PHEROMONE_IMPORTANCE);
                double edgeComponent      = Math.Pow(routeEvaluator.CalculateCostOfEdge(new int[] { currentCity, cityToConsiderTravellingTo }, graph), ACOConstants.BETA_EDGE_IMPORTANCE);

                componentProducts.Add(pheremoneComponent * edgeComponent);
            }

            componentProducts = SumComponentProductsCumulatively(componentProducts);

            int cityToMoveTo = PickCityBasedOnComponents(componentProducts, citiesBeingConsideredToTravelTo);

            return(cityToMoveTo);
        }
Ejemplo n.º 3
0
            //Methods
            public void goToNextCity()
            {
                if (IsFinished)
                {
                    return;
                }

                #region вибір можливих доріг
                List <Road> roads = currentCity.Roads.ToList();

                //відкидаємо ті шо в списку табу
                foreach (City vCity in VisitedCities.FindAll(c => c != currentCity))
                {
                    roads.RemoveAll(r => r.A == vCity || r.B == vCity);
                }
                #endregion

                if (roads.Count == 0)
                {
                    return;
                }

                #region Determine next road / city
                //Get sum of road probabilities
                double sumMovementProbability = 0;
                foreach (Road r in roads)
                {
                    sumMovementProbability += r.MovementProbablity;
                }                                                   //r.movementprobability = Math.Pow(pheromone, alpha) * Math.Pow((1.0 / distance), beta); сумуємосумуу

                //Get relative probably of taking a road
                Road theRoad = null;
                while (theRoad == null)
                {
                    foreach (Road r in roads)
                    {
                        double probability = r.MovementProbablity / sumMovementProbability; // ймовірність = ймовірність по дорогі/суму ймовірностей
                        double randVal     = rand.NextDouble();                             // випадкове значення, якщо менше ймовірності = знайшли нашу дорогу

                        if (randVal < probability)
                        {
                            theRoad = r;
                            break;
                        }
                    }
                }
                #endregion

                if (theRoad.A == currentCity)
                {
                    currentCity = theRoad.B;
                }
                else
                {
                    currentCity = theRoad.A;
                }

                VisitedCities.Add(currentCity);
                VisitedRoads.Add(theRoad);
            }
Ejemplo n.º 4
0
        // Trash programming right here
        private int InitialiseFirstCity(Graph graph)
        {
            int randomStartCity = random.Next(1, graph.GraphOfNodes.Count + 1);

            CurrentRoute.Add(randomStartCity);
            VisitedCities.Add(randomStartCity);

            return(randomStartCity);
        }
Ejemplo n.º 5
0
            public void reset()
            {
                //Go back to original city
                currentCity = VisitedCities[0];

                //Clear visited
                VisitedCities.Clear();
                VisitedCities.Add(currentCity);
                VisitedRoads.Clear();
            }
Ejemplo n.º 6
0
        public Route WalkRoute(PheromoneLookup pheromoneLookup, RouteEvaluator routeEvaluator, Graph graph)
        {
            int startEndCity = InitialiseFirstCity(graph);

            while (CurrentRoute.Count <= graph.GraphOfNodes.Count - 1)
            {
                int city = ChooseNextCityToVisit(pheromoneLookup, routeEvaluator, graph);
                CurrentRoute.Add(city);
                VisitedCities.Add(city);
            }

            CurrentRoute.Add(startEndCity);

            AntRoute = new Route(CurrentRoute.ToArray(), double.MaxValue);
            return(AntRoute);
        }
Ejemplo n.º 7
0
 public void ClearRoutes()
 {
     VisitedCities.Clear();
     CurrentRoute.Clear();
 }
Ejemplo n.º 8
0
            //Methods
            public void goToNextCity()
            {
                //Check finished state
                if (IsFinished)
                {
                    return;
                }

                #region Get possible roads
                //Get current cities roads
                List <Road> roads = currentCity.Roads.ToList();

                //Remove visited cities
                foreach (City vCity in VisitedCities.FindAll(c => c != currentCity))
                {
                    roads.RemoveAll(r => r.A == vCity || r.B == vCity);
                }
                #endregion

                //Check if no roads (all cities visited)
                if (roads.Count == 0)
                {
                    //isFinished = true;
                    return;
                }

                #region Determine next road / city
                //Get sum of road probabilities
                double sumMovementProbability = 0;
                foreach (Road r in roads)
                {
                    sumMovementProbability += r.MovementProbablity;
                }

                //Get relative probably of taking a road
                Road theRoad = null;
                while (theRoad == null)
                {
                    foreach (Road r in roads)
                    {
                        //Compute relative probability
                        double probability = r.MovementProbablity / sumMovementProbability;
                        double randVal     = rand.NextDouble();

                        //Compare to random number
                        if (randVal < probability)
                        {
                            theRoad = r;
                            break;
                        }
                    }
                }
                #endregion

                //Go to next city
                if (theRoad.A == currentCity)
                {
                    currentCity = theRoad.B;
                }
                else
                {
                    currentCity = theRoad.A;
                }

                //Add to visited List
                VisitedCities.Add(currentCity);
                VisitedRoads.Add(theRoad);
            }