// 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());
 }