static void Main(string[] args) { //double[,] array = new double[,] { {0, 1, 3, 6}, {1, 0, 2, 5}, {3, 2, 0, 4}, {6, 5, 4, 0} }; double[,] array = create_matr(50); matrix_t matr = new matrix_t(); matr.matr = array; matr.m = 49; matr.n = 49; int q = 50; solution_t sol; for (double i = 0.0; i <= 1.01; i += 0.1) { sol = solve(matr, i, 1 - i, 0.5, q, 200); Console.WriteLine("Alpha: {0}\nBetta: {1}\nДлина: {2}\n-----------------------", i, 1 - i, sol.l); } for (int i = 100; i <= 1000; i += 100) { sol = solve(matr, 0.5, 0.5, 0.5, q, i); Console.WriteLine("Время жизни: {0}\nДлина: {1}\n-----------------------", i, sol.l); } Console.Read(); }
static void gogo_ant(ref ant_t ant, matrix_t adj_mat, matrix_t weight, matrix_t d_pheromon, int q) { int N = weight.n; int i = 1; int next = 0; array_t prob = create_array(N); while (i < N) { double sum_weight = 0; for (int j = 0; j < N; j++) { sum_weight += weight.matr[ant.curr_city, j] * ant.Jk.arr[j]; } for (int j = 0; j < N; j++) { prob.arr[j] = weight.matr[ant.curr_city, j] / sum_weight * ant.Jk.arr[j]; } next = choose_next(prob); ant.curr_city = next; ant.Jk.arr[next] = 0; ant.route.arr[i++] = next; } ant.Lk = (int)(length_of_route(adj_mat, ant.route)); add_pheromon(d_pheromon, ant.route, ant.Lk, q); }
static matrix_t create_matrix(int n, int m) { matrix_t matrix = new matrix_t(); matrix.matr = new double[n, m]; matrix.m = m; matrix.n = n; return(matrix); }
static void add_pheromon(matrix_t d_pheromon, array_t route, int Lk, int q) { float d_fer = (float)q / (float)Lk; for (int i = 0; i < route.size - 1; i++) { d_pheromon.matr[(int)route.arr[i], (int)route.arr[i + 1]] += d_fer; } }
static double length_of_route(matrix_t adj_mat, array_t route) { double length = 0; for (int i = 0; i < route.size - 1; i++) { length += adj_mat.matr[(int)route.arr[i], (int)route.arr[i + 1]]; } return(length); }
static void recalc_weight(ref matrix_t weight, matrix_t pheromon, matrix_t visib, double a, double b) { int N = weight.n; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { weight.matr[i, j] = Math.Pow(pheromon.matr[i, j], a) * Math.Pow(visib.matr[i, j], b); } } }
static void recalc_pheromon(ref matrix_t pheromon, double p) { p = 1 - p; int N = pheromon.n; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { pheromon.matr[i, j] = pheromon.matr[i, j] * p; } } }
static solution_t solve(matrix_t adj_mat, double a, double b, double p, int q, int t_max) { int N = adj_mat.n; ant_t[] ants = create_ant_array(N); matrix_t pheromon = create_matrix(N, N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { pheromon.matr[i, j] = 0.5; } } matrix_t visib = create_matrix(N, N); for (int i = 0; i < N; i++) { for (int j = i; j < N; j++) { if (i != j) { visib.matr[i, j] = 1 / adj_mat.matr[i, j]; visib.matr[j, i] = visib.matr[i, j]; } else { visib.matr[i, j] = 1000; } } } matrix_t weight = create_matrix(N, N); recalc_weight(ref weight, pheromon, visib, a, b); int best_l = int.MaxValue; array_t route = create_array(N); for (int t = 0; t < t_max; t++) { for (int k = 0; k < N; k++) { init_ant(ref ants[k]); gogo_ant(ref ants[k], adj_mat, weight, pheromon, q); } int best = -1; for (int i = 0; i < N; i++) { if (ants[i].Lk < best_l) { best = i; best_l = ants[i].Lk; } } if (best != -1) { copy_array(route, ants[best].route); } recalc_pheromon(ref pheromon, p); recalc_weight(ref weight, pheromon, visib, a, b); } solution_t solv = new solution_t(); solv.l = best_l; solv.route = route; return(solv); }