private void finishPath(Ant ant) { while (ant.pathSoFar.Count < Cities.Length) { for (int i = 0; i < Cities.Length; i++) { if (!ant.citiesVisited[i]) { ant.visitCity(i); } } } }
public void doCircut(Ant ant) { ant.visitCity(rand.Next(0, Cities.Length)); for (int i = 0; i < Cities.Length - 1; i++) { if (rand.NextDouble() < RANDOM_CHANCE) { int t = rand.Next(Cities.Length - ant.getCurrentCity()); // random town int j = -1; for (int k = 0; k < Cities.Length; k++) { if (!ant.citiesVisited[k]) { j++; } if (j == t) { ant.visitCity(k); break; } } } double[] probs = new double[Cities.Length]; double denom = 0.0; for (int j = 0; j < Cities.Length; j++) { if (ant.citiesVisited[j]) { probs[j] = 0.0; } else { probs[j] = getProbability(ant.getCurrentCity(), j); } denom += probs[j]; } if (denom == 0) { ant = new Ant(Cities.Length); doCircut(ant); if (ant.pathSoFar.Count < Cities.Length) { finishPath(ant); return; } return; } for (int j = 0; j < Cities.Length; j++) { probs[j] /= denom; } double r = rand.NextDouble(); double total = 0.0; for (int j = 0; j < Cities.Length; j++) { total += probs[j]; if (total >= r) { ant.visitCity(j); break; } } } if (ant.pathSoFar.Count < Cities.Length) { finishPath(ant); return; } }