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