The code does not work. It is necessary to read the data from the file (a matrix of 256x256) and then apply the ant algorithm (after reading, you need to specify the base for the algorithm, and it breaks on it). If you read a 10x10 matrix, then everything is ok. The matrix looks like this (3x3): 1 5 3 1 8 4 9 8 2 Please tell me why it does not work ...
/* ΠΡΡΠ°Π²ΡΠΈΠ½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ ΠΊΠΎΠΌΠΌΠΈΠ²ΠΎΡΠΆΡΡΠ° */ #include <fstream> #include <locale> #include <stdlib.h> #include <iostream> #include <malloc.h> #include <cmath> using namespace std; #define N_MIN 3 // ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²Π΅ΡΡΠΈΠ½ #define N_MAX 30 // ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²Π΅ΡΡΠΈΠ½ #define ALPHA 1 // Π²Π΅Ρ ΡΠ΅ΡΠΌΠ΅Π½ΡΠ° #define BETTA 3 // ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΡΠ²ΡΠΈΡΡΠΈΠΊΠΈ #define T_MAX 100 // Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈΠΈ #define M 200 // ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΡΡΠ°Π²ΡΠ΅Π² Π² ΠΊΠΎΠ»ΠΎΠ½ΠΈΠΈ #define Q 100 // ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ #define RHO 0.5 // ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΠΈΡΠΏΠ°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΠΎΠΌΠΎΠ½Π° // ΡΡΡΡΠΊΡΡΡΠ° ΠΠ£Π’Π¬ (Π΄Π»ΠΈΠ½Π½Π°, ΠΌΠ°ΡΡΠΈΠ² Π²Π΅ΡΡΠΈΠ½, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²Π΅ΡΡΠΈΠ½) struct WAY_TYPE { int itabu; int length; int *tabu; }; // Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π° ΠΌΡΡΠ°Π²ΡΡ ant Π² Π²Π΅ΡΡΠΈΠ½Ρ to double probability (int to, WAY_TYPE ant, double **pheromone, double **distance, int vertex) { // Π΅ΡΠ»ΠΈ Π²Π΅ΡΡΠΈΠ½Π° ΡΠΆΠ΅ ΠΏΠΎΡΠ΅ΡΠ΅Π½Π°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ 0 for (int i=0; i<ant.itabu; ++i) if (to == ant.tabu[i]) return 0; double sum = 0.0; int from = ant.tabu[ant.itabu-1]; // ΡΡΠΈΡΠ°Π΅ΠΌ ΡΡΠΌΠΌΡ Π² Π·Π½Π°ΠΌΠΈΠ½Π°ΡΠ΅Π»Π΅ for (int j=0; j<vertex; ++j) { int flag = 1; // ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΠΏΠΎΡΠ΅ΡΠ°Π» Π»ΠΈ ΠΌΡΡΠ°Π²Π΅ΠΉ j Π²Π΅ΡΡΠΈΠ½Ρ for (int i=0; i<ant.itabu; ++i) if (j == ant.tabu[i]) flag = 0; // Π΅ΡΠ»ΠΈ Π½Π΅Ρ, ΡΠΎΠ³Π΄Π° ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊ ΠΎΠ±ΡΠ΅ΠΉ ΡΡΠΌΠΌΠ΅ if (flag) sum += pow (pheromone[from][j], ALPHA) * pow (distance[from][j], BETTA); } // Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΠΈ return pow (pheromone[from][to], ALPHA) * pow (distance[from][to], BETTA) / sum; } // ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΏΠΎΠΈΡΠΊΠ° WAY_TYPE AntColonyOptimization (double **distance0, int vertex, int start) { // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΎ Π»ΡΡΡΠ΅ΠΌ ΠΌΠ°ΡΡΡΡΡΠ΅ WAY_TYPE way; way.itabu = 0; way.length = -1; way.tabu = (int *) malloc (sizeof (int) * vertex); // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΎ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΈ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΡΠ΅ΡΠΎΠΌΠΎΠ½Π° double **distance = NULL, **pheromone = NULL; distance = (double **) malloc (sizeof (double *) * vertex); pheromone = (double **) malloc (sizeof (double *) * vertex); for (int i=0; i<vertex; ++i) { distance[i] = (double *) malloc (sizeof (double) * vertex); pheromone[i] = (double *) malloc (sizeof (double) * vertex); for (int j=0; j<vertex; ++j) { pheromone[i][j] = 1.0 / vertex; if (i != j) distance[i][j] = 1.0 / distance0[i][j]; } } // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΡΡΠ°Π²ΡΠ΅Π² WAY_TYPE ants[M]; for (int k=0; k<M; ++k) { ants[k].itabu = 0; ants[k].length = 0.0; ants[k].tabu = (int *) malloc (sizeof (int) * vertex); ants[k].tabu[ants[k].itabu++] = start; } // ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΈΠΊΠ» for (int t=0; t<T_MAX; ++t) { // ΡΠΈΠΊΠ» ΠΏΠΎ ΠΌΡΡΠ°Π²ΡΡΠΌ for (int k=0; k<M; ++k) { // ΠΏΠΎΠΈΡΠΊ ΠΌΠ°ΡΡΡΡΡΠ° Π΄Π»Ρ k-Π³ΠΎ ΠΌΡΡΠ°Π²ΡΡ do { int j_max = -1; double p_max = 0.0; for (int j=0; j<vertex; ++j) { // ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π° Π² Π²Π΅ΡΡΠΈΠ½Ρ j if (ants[k].tabu[ants[k].itabu-1] != j) { double p = probability (j, ants[k], pheromone, distance, vertex); if (p && p >= p_max) { p_max = p; j_max = j; } } } ants[k].length += distance0[ants[k].tabu[ants[k].itabu-1]][j_max]; ants[k].tabu[ants[k].itabu++] = j_max; } while (ants[k].itabu < vertex ); ants[k].length += distance0[ants[k].tabu[ants[k].itabu-1]][start]; ants[k].tabu[ants[k].itabu++] = start; // ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ΅ΡΠΎΠΌΠΎΠ½ Π½Π° ΠΏΡΡΠΈ ΠΌΡΡΠ°Π²ΡΡ for (int i=0; i<ants[k].itabu-1; ++i) { int from = ants[k].tabu[i % ants[k].itabu]; int to = ants[k].tabu[(i+1) % ants[k].itabu]; pheromone[from][to] += Q / ants[k].length; pheromone[to][from] = pheromone[from][to]; } // ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π»ΡΡΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ if (ants[k].length < way.length || way.length < 0) { way.itabu = ants[k].itabu; way.length = ants[k].length; for (int i=0; i<way.itabu; ++i) way.tabu[i] = ants[k].tabu[i]; } // ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΌΡΡΠ°Π²ΡΠ΅Π² ants[k].itabu = 1; ants[k].length = 0.0; } // ΡΠΈΠΊΠ» ΠΏΠΎ ΡΠ΅Π±ΡΠ°ΠΌ for (int i=0; i<vertex; ++i) for (int j=0; j<vertex; ++j) // ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠΎΠΌΠΎΠ½Π° Π΄Π»Ρ ΡΠ΅Π±ΡΠ° (i, j) if (i != j) pheromone[i][j] *= (1 - RHO); } // Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΊΡΠ°ΡΡΠ°ΠΉΡΠΈΠΉ ΠΌΠ°ΡΡΡΡΡ return way; } // ΡΠΎΡΠΊΠ° Π²Ρ
ΠΎΠ΄Π° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ int main (int argc, char *argv[]) { setlocale (LC_ALL, "Russian"); double **D = NULL, *V = NULL; int N = 0, A = 0; // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°ΡΡΠΈΡΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΉ /*while (N < N_MIN || N > N_MAX) { cout << "ΠΠ²Π΅Π΄ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²Π΅ΡΡΠΈΠ½ [" << N_MIN << ", " << N_MAX << "]: "; cin >> N; }*/ ifstream in("vert1.txt"); in >> N; V = (double *) malloc (sizeof (double) * N); for (int i=0; i<N; ++i) in >> V[i]; for (int i = 0; i < N; i++){ cout << V[i] << "\t"; cout << "\n"; } system("pause"); ifstream in2("graph1.txt"); //cout << "ΠΠ²Π΅Π΄ΠΈΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΉ" << endl; D = (double **) malloc (sizeof (double *) * N); for (int i=0; i<N; ++i) { D[i] = (double *) malloc (sizeof (double) * N); for (int j=0; j<N; ++j) in2 >> D[i][j]; } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) cout << D[i][j] << "\t"; cout << "\n"; } in.close(); in2.close(); // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π±Π°Π· Π°Π³Π΅Π½ΡΠΎΠ² while (A < 1 || A > N) { cout << "ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π±Π°Π·Ρ Π΄Π»Ρ Π°Π³Π΅Π½ΡΠ°: "; cin >>A; } for (int i=0; i<N; i++){ if(V[i]==A){ A = i; break; } } // Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌ WAY_TYPE way = AntColonyOptimization (D, N, A); // Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ofstream out("Path.txt"); out << way.length <<' '<<endl; out << V[way.tabu[0]]; for (int i=1; i<way.itabu; ++i) out << " -> " << V[way.tabu[i]]; out.close(); //cout << "ΠΠ»ΠΈΠ½Π° ΠΏΡΡΠΈ: " << way.length << endl; //cout << "ΠΡΡΡ: " << V[way.tabu[0]]; //for (int i=1; i<way.itabu; ++i) cout << " -> " << V[way.tabu[i]]; return 0; }
if (flag) sum += pow (pheromone[from][j], ALPHA) * pow (distance[from][j], BETTA);) from is -1. Therefore, falls. - KoVadim