private Ant GetAntWithShortestDistance() { var bestDistance = _ants.First().CalculateTotalTrailDistance(_map); Ant bestAnt = _ants.First(); for (int antId = 1; antId < _ants.Count; antId++) { var antDistance = _ants[antId].CalculateTotalTrailDistance(_map); if (antDistance < bestDistance) { bestAnt = _ants[antId]; bestDistance = antDistance; } } return(bestAnt); }
private double[] CalculateProbabilities(Ant ant, int currentCity) { double sum = 0.0; var tauSigmaProduct = new double[_numberOfCities]; for (int i = 0; i < tauSigmaProduct.Length; i++) { if (i == currentCity) { tauSigmaProduct[i] = 0.0; } else if (ant.VisitedCities[i]) { tauSigmaProduct[i] = 0.0; } else { var tauPow = Math.Pow(_map.Pheromones[currentCity, i], _alpha); var sigmaPow = Math.Pow(1.0 / _map.Distances[currentCity, i], _beta); tauSigmaProduct[i] = tauPow * sigmaPow; if (tauSigmaProduct[i] < 0.0001) { tauSigmaProduct[i] = 0.0001; } else if (tauSigmaProduct[i] > double.MaxValue / (_numberOfCities * 100)) { tauSigmaProduct[i] = double.MaxValue / (_numberOfCities * 100); } } sum += tauSigmaProduct[i]; } var probabilities = new double[_numberOfCities]; for (int i = 0; i < probabilities.Length; i++) { probabilities[i] = tauSigmaProduct[i] / sum; // Houston we have problem when the sum equals zero :/ } return(probabilities); }
private int[] BuildTrail(Ant ant) { var trail = new int[_numberOfCities]; ant.ResetVisited(); var startingCity = _randomizer.Next(0, _numberOfCities); const int lastCityOffset = 1; trail[0] = startingCity; ant.VisitedCities[startingCity] = true; for (int cityId = 0; cityId < _numberOfCities - lastCityOffset; cityId++) { var currentCity = trail[cityId]; var nextCity = GetNextCity(ant, currentCity); trail[cityId + 1] = nextCity; ant.VisitedCities[nextCity] = true; } return(trail); }
public double[] Run(ObjectiveFunction objectiveFunction, int maxIterationCount, out int usedIterationCount, double acceptableEvaluation, out double achievedEvalation, int antCount, int normalPDFCount, double requiredAccuracy ) { if (objectiveFunction == null) { throw new ArgumentNullException("objectiveFunction"); } this.objectiveFunction = objectiveFunction; // Pheromone Maintenance - Initialization CreatePheromoneTrail(normalPDFCount); CreateAntColony(antCount); // Keep track of the global-best ant for elitist purposes. globalBestAnt = antColony[0]; EvaluateAnt(globalBestAnt); // Repeat while the computational budget is not spend and an acceptable solution is not found. int iterationIndex = 0; while ((iterationIndex < maxIterationCount) && !IsAcceptableSolutionFound(acceptableEvaluation)) { // Solution Construction EvaluateAntColony(); // Pheromone Maintenance - Update UpdatePheromoneTrail(iterationIndex + 1, requiredAccuracy); iterationIndex++; } // Return the (global-best) solution. usedIterationCount = iterationIndex; achievedEvalation = (objectiveFunction.Objective == Objective.MINIMIZE) ? globalBestAnt.Evaluation : (1 / globalBestAnt.Evaluation); return(globalBestAnt.Steps); }
public static string CheckIsBestRouteCorrect(Action <Ant, int> MoveAntToNextCity, List <int> bestRouteFound, float bestDistanceFound) { var checkingList = bestRouteFound; checkingList.Add(checkingList.First()); checkingList.RemoveAt(0); var ant = new Ant(checkingList.Last()); for (int i = 0; i < checkingList.Count; i++) { MoveAntToNextCity(ant, checkingList[i]); } if (bestDistanceFound - ant.distance == 0) { return("CORRECT"); } else { throw new Exception("INCORRECT"); } }
/// <summary> /// Evalautes an ant. /// </summary> /// <param name="ant">The ant to evalaute.</param> private void EvaluateAnt(Ant ant) { ant.Evaluation = (Objective == Objective.MINIMIZE) ? objectiveFunction.Evaluate(ant.Steps) : (1 / objectiveFunction.Evaluate(ant.Steps)); }