1
+ #include < vector>
2
+ #include < random>
3
+ #include < time.h>
4
+ #include < math.h>
5
+ #include < algorithm>
6
+
7
+ #include " tsp.hpp"
8
+
9
+ using namespace std ;
10
+
11
+ void ACOTSP::Simulate ()
12
+ {
13
+ // Crea un vector de vectores para guardar los caminos de las hormigas;
14
+ // Cada vector de este vector corresponder a una hormiga y su ruta:
15
+ int ant, step, city, i, j;
16
+ // vector<double> pathsProbability = {};
17
+ srand (time (NULL ));
18
+ for (i = 1 ; i <= antsAmount; i++)
19
+ {
20
+ // Coloca la hormiga en una ciudad aleatoria:
21
+ int firstCity = rand () % (cities) + 1 ;
22
+ vector<int > path = {};
23
+ path.push_back (firstCity);
24
+ for (int x = 1 ; x < cities; x++)
25
+ path.push_back (-1 );
26
+ paths.push_back (path);
27
+ }
28
+
29
+ // Vector con todas las ciudades que se pueden
30
+
31
+ // Para cada hormiga, se sigue el camino:
32
+ srand (time (NULL ));
33
+ for (ant = 0 ; ant < antsAmount; ant++)
34
+ {
35
+ // cout<<"HORMIGA "<<ant+1<<endl;
36
+ // pathsProbability.clear();
37
+ // Da un paso para cada hormiga:
38
+ vector<int > transitedCities = {};
39
+ transitedCities.clear ();
40
+ int controlCities[200 ];
41
+ srand (time (NULL ));
42
+ for (step = 0 ; step < cities-1 ; step++)
43
+ {
44
+ // cout<<"PASO "<<step+1<<endl;
45
+ // Se encuentran las probabilidades para todos los
46
+ // los caminos que puede tomar:
47
+ // * Calcula la sumatoria de probabilidades del denominador
48
+ // * de la fórmula de probabilidad de algoritmo de hormigas:
49
+ // * <INSERTE FÓRMULA AQUÍ>;
50
+ // Encuentra el cociente con todos los caminos:
51
+ double sum = 0 ;
52
+ double pheromone, visibility, numerator, probability;
53
+ int actualCity = paths[ant][step];
54
+ // cout<<"Actual: "<<actualCity<<endl;
55
+ vector<double > pathsProbability = {};
56
+ pathsProbability.clear ();
57
+ // int a = 0;
58
+ for (city = 0 ; city < cities; city++)
59
+ {
60
+ if ((std::find (transitedCities.begin (), transitedCities.end (), city) != transitedCities.end ()))
61
+ {
62
+ // cout<<" 1. Existe: "<<city<<"; ";
63
+ }
64
+ else
65
+ {
66
+ // a++;
67
+ pheromone = roadsPheromone[actualCity][city];
68
+ visibility = visibilityRoads[actualCity][city];
69
+ sum += (pow (pheromone, pheromoneImportance)*(pow (visibility, visibilityImportance)));
70
+ // cout<<"a";
71
+ }
72
+ // cout<<"a: "<<a<<endl;
73
+ }
74
+
75
+ // Encuentra la probabilidad para cada camino:
76
+ for (int path = 0 ; path < cities; path++)
77
+ {
78
+ if ((std::find (transitedCities.begin (), transitedCities.end (), path) != transitedCities.end ()))
79
+ {
80
+ // cout<<" 2. Existe: "<<city<<"; ";
81
+ }
82
+ else
83
+ {
84
+ pheromone = roadsPheromone[path][actualCity];
85
+ visibility = visibilityRoads[path][actualCity];
86
+ numerator = (pow (pheromone, pheromoneImportance)*(pow (visibility, visibilityImportance)));
87
+ probability = numerator / sum;
88
+ pathsProbability.push_back (probability);
89
+ }
90
+ }
91
+ double suma = 0 ;
92
+ for (int ix = 0 ; ix < pathsProbability.size (); ix++)
93
+ {
94
+ // cout<<"["<<pathsProbability[ix]<<"]";
95
+ suma += pathsProbability[ix];
96
+ }
97
+ // cout<<"AW:"<<suma<<endl;
98
+
99
+ // Decide qué camino tomar:
100
+ // Calcula un aleatorio entre 0 y 1; y en base a la sumatoria
101
+ // de caminos con base en la probabilidad de cada uno; se queda
102
+ // con uno de estos caminos (que suman 1 de probabilidad):
103
+ double random = ((double ) rand () / (RAND_MAX));
104
+ // cout<<endl<<random<<endl;
105
+ sum = 0 ;
106
+ int nextCity = actualCity;
107
+ // Se asegura de que la siguiente ciudad no sea la actual:
108
+ vector<int > availableCities = {};
109
+ for (city = 0 ; city < cities; city++)
110
+ {
111
+ // Si la ciudad ya fue transitada, no la toma:
112
+ if (!(std::find (transitedCities.begin (), transitedCities.end (), city) != transitedCities.end ()))
113
+ {
114
+ availableCities.push_back (city);
115
+ // cout<<city<<" -> ";
116
+ }
117
+ }
118
+ // cout<<endl;
119
+
120
+ double nextPoint = 0 ;
121
+ while (nextCity == actualCity)
122
+ {
123
+ sum = 0 ;
124
+ for (city = 0 ; city < availableCities.size (); city++)
125
+ {
126
+ // Si tiene que pasar por una ciudad por la que no ha transitado:
127
+ // if ((std::find(transitedCities.begin(), transitedCities.end(), city) != transitedCities.end()))
128
+ // {
129
+ // break;
130
+ // }
131
+ // Si el aleatorio está en el rango permitido de este camino:
132
+ nextPoint = sum + pathsProbability[city];
133
+ // cout<<"if "<<random<<" >= ("<<sum<<") && "<<random<<" < ("<<nextPoint<<")"<<endl;
134
+ if (double (random ) >= double (sum) && double (random ) < double (sum + pathsProbability[city]))
135
+ {
136
+ // Encontró el próximo camino:
137
+ // cout<<"Próxima ciudad: "<<availableCities[city]<<endl;
138
+ nextCity = availableCities[city];
139
+
140
+ // Agrega la ciudad a la lista de las transitadas:
141
+ transitedCities.push_back (nextCity);
142
+ break ;
143
+ }
144
+ // Probabilidad acumulada de los caminos:
145
+ sum += pathsProbability[city];
146
+ }
147
+ }
148
+
149
+ paths[ant][step+1 ] = nextCity;
150
+ // cout<<"["<<paths[ant][step+1]<<"]";
151
+ // pathsProbability.clear();*/
152
+ }
153
+ // cout<<"\n";
154
+ // pathsProbability.clear();
155
+ }
156
+
157
+ for (ant = 0 ; ant < antsAmount; ant++)
158
+ {
159
+ cout<<" \n Hormiga 0" <<ant+1 <<" : " <<endl;
160
+ for (city = 0 ; city < cities; city++)
161
+ {
162
+ cout<<" " <<paths[ant][city]<<" =>" ;
163
+ }
164
+ cout<<endl;
165
+ }
166
+ cout<<" \n\n " ;
167
+ }
0 commit comments