// Randomize starting placement private void SelectFirstCity() { Random rand = new Random(); //select _CurrentCity = _CitiesToVisit[rand.Next(0, _CitiesToVisit.Count - 1)]; //place to city _CurrentCity.Receive(this, _CitiesToVisit); }
// calculates decision param for next city private double CalculateVariables(ACOCity to) { if (_CitiesToVisit.Contains(to)) { ACODistance distance = (ACODistance)_CurrentCity.GetDistanceTo(to); double length = distance.LengthDouble; double pheromone = distance.Pheromone; return(Math.Pow(1 / length, Convert.ToDouble(_Props.Beta)) * Math.Pow(pheromone, Convert.ToDouble(_Props.Alpha))); } return(0); }
private void CopyGraph(TSPGraph <ACOCity, ACODistance> graph) { foreach (ACOCity mainCity in graph.GetCities()) { ACOCity copiedCity = (ACOCity)mainCity.Clone(); for (int i = 0; i < graphState.GetCities().Count; i++) { ACODistance dist = (ACODistance)((ACODistance)mainCity.GetDistanceTo(graph.GetCities()[i])).Clone(); copiedCity.Connect(graphState.GetCities()[i], dist); } graphState.AddCity(copiedCity); } }
/// <summary> /// Move Ant to next City /// </summary> /// <returns><c>ACOCity</c> where come.</returns> public ACOCity GoNext() { //if bypass is not over if (!HasFinished()) { //decide wher go next ACOCity cityToGo = MakeDecision(); //leave current _CurrentCity.Release(this, _TabuList); //go to next _CurrentCity = cityToGo; _CurrentCity.Receive(this, _CitiesToVisit); } return(_CurrentCity); }
// ant makes decision using distance, pheromone and random value private ACOCity MakeDecision() { ACOCity cityToGo = null; Random random = new Random(); double randomValue = random.NextDouble(); double currentProb = 0; foreach (KeyValuePair <ACOCity, double> entry in GetProbabilityTable()) { currentProb += entry.Value; if (randomValue <= currentProb) { cityToGo = entry.Key; break; } } return(cityToGo); }
/// <summary> /// Caculates probability of chance to go in mentiond City. /// </summary> /// <param name="to">City to go</param> /// <returns>Probability from 0 to 1</returns> protected double CalculateProbability(ACOCity to) { return(CalculateVariables(to) / CalculateVariables()); }