using System;using System.Collections.Generic;
using System.Linq;
namespace AntColony
{
class Ant
{
private int _numCities;
private int[][] _distances;
private int[] _path;
public Ant(int numCities, int[][] distances)
{
_numCities = numCities;
_distances = distances;
_path = new int[_numCities];
}
public int[] FindPath(int startCity)
{
// Initialize ant's path
for (int i = 0; i < _numCities; i++)
{
_path[i] = -1;
}
_path[0] = startCity;
// Traverse the cities
for (int i = 1; i < _numCities; i++)
{
int nextCity = SelectNextCity(_path, i);
_path[i] = nextCity;
}
return _path;
}
private int SelectNextCity(int[] path, int currentIndex)
{
double[] probabilities = new double[_numCities];
double sum = 0;
// Calculate the probabilities for each city
for (int i = 0; i < _numCities; i++)
{
if (path.Contains(i))
{
probabilities[i] = 0;
}
else
{
double pheromoneLevel = Math.Pow(1.0 / _distances[path[currentIndex - 1]][i], 2);
probabilities[i] = pheromoneLevel;
sum += pheromoneLevel;
}
}
// Select the next city based on the probabilities
double rnd = new Random().NextDouble() * sum;
sum = 0;
for (int i = 0; i < _numCities; i++)
{
if (!path.Contains(i))
{
sum += probabilities[i];
if (sum >= rnd)
{
return i;
}
}
}
// If no city was selected, select a random one
return Enumerable.Range(0, _numCities).Where(i => !path.Contains(i)).First();
}
}
class AntColony
{
private int _numAnts;
private int _numCities;
private int[][] _distances;
private double[][] _pheromones;
private int[] _bestPath;
private int _bestPathLength;
public AntColony(int numAnts, int numCities, int[][] distances)
{
_numAnts = numAnts;
_numCities = numCities;
_distances = distances;
// Create the ant population
_ants = new Ant[_numAnts];
for (int i = 0; i < _numAnts; i++)
{
_ants[i] = new Ant(_numCities);
}
// Create the pheromone matrix
_pheromones = new double[_numCities][];
for (int i = 0; i < _numCities; i++)
{
_pheromones[i] = new double[_numCities];
}
// Initialize the pheromone matrix with some small values
for (int i = 0; i < _numCities; i++)
{
for (int j = 0; j < _numCities; j++)
{
_pheromones[i][j] = 0.01;
}
}
// Initialize the best tour and its length
_bestTour = new int[_numCities];
_bestTourLength = double.MaxValue;
}
}
}