public void reset() { currentCity = VisitedCities[0]; VisitedCities.Clear(); VisitedCities.Add(currentCity); VisitedRoads.Clear(); }
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); }
//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); }
// 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); }
public void reset() { //Go back to original city currentCity = VisitedCities[0]; //Clear visited VisitedCities.Clear(); VisitedCities.Add(currentCity); VisitedRoads.Clear(); }
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); }
public void ClearRoutes() { VisitedCities.Clear(); CurrentRoute.Clear(); }
//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); }