Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
 }