Skip to content

Commit e77019b

Browse files
committed
ACOSTP b.0.0.0
Ayúdame, diosito :'c
0 parents  commit e77019b

14 files changed

+631
-0
lines changed

.vscode/c_cpp_properties.json

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"configurations": [
3+
{
4+
"name": "Win32",
5+
"includePath": [
6+
"${workspaceFolder}/**"
7+
],
8+
"defines": [
9+
"_DEBUG",
10+
"UNICODE",
11+
"_UNICODE"
12+
],
13+
"windowsSdkVersion": "10.0.16299.0",
14+
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe",
15+
"cStandard": "c17",
16+
"cppStandard": "c++17",
17+
"intelliSenseMode": "windows-msvc-x64"
18+
}
19+
],
20+
"version": 4
21+
}

.vscode/launch.json

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": []
7+
}

.vscode/settings.json

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"C_Cpp.errorSquiggles": "Enabled",
3+
"files.associations": {
4+
"istream": "cpp",
5+
"iostream": "cpp",
6+
"xstring": "cpp",
7+
"vector": "cpp"
8+
}
9+
}

.vscode/tasks.json

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"tasks": [
3+
{
4+
"type": "cppbuild",
5+
"label": "C/C++: cl.exe compilar archivo activo",
6+
"command": "cl.exe",
7+
"args": [
8+
"/Zi",
9+
"/EHsc",
10+
"/nologo",
11+
"/Fe${fileDirname}\\${fileBasenameNoExtension}.exe",
12+
"${file}"
13+
],
14+
"options": {
15+
"cwd": "${fileDirname}"
16+
},
17+
"problemMatcher": [
18+
"$msCompile"
19+
],
20+
"group": {
21+
"kind": "build",
22+
"isDefault": true
23+
},
24+
"detail": "Tarea generada por el depurador."
25+
}
26+
],
27+
"version": "2.0.0"
28+
}

algorithm.cpp

+167
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
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<<"\nHormiga 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+
}

instances/tsp127.csv

+127
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
9860,14152,
2+
9396,14616,
3+
11252,14848,
4+
11020,13456,
5+
9512,15776,
6+
10788,13804,
7+
10208,14384,
8+
11600,13456,
9+
11252,14036,
10+
10672,15080,
11+
11136,14152,
12+
9860,13108,
13+
10092,14964,
14+
9512,13340,
15+
10556,13688,
16+
9628,14036,
17+
10904,13108,
18+
11368,12644,
19+
11252,13340,
20+
10672,13340,
21+
11020,13108,
22+
11020,13340,
23+
11136,13572,
24+
11020,13688,
25+
8468,11136,
26+
8932,12064,
27+
9512,12412,
28+
7772,11020,
29+
8352,10672,
30+
9164,12876,
31+
9744,12528,
32+
8352,10324,
33+
8236,11020,
34+
8468,12876,
35+
8700,14036,
36+
8932,13688,
37+
9048,13804,
38+
8468,12296,
39+
8352,12644,
40+
8236,13572,
41+
9164,13340,
42+
8004,12760,
43+
8584,13108,
44+
7772,14732,
45+
7540,15080,
46+
7424,17516,
47+
8352,17052,
48+
7540,16820,
49+
7888,17168,
50+
9744,15196,
51+
9164,14964,
52+
9744,16240,
53+
7888,16936,
54+
8236,15428,
55+
9512,17400,
56+
9164,16008,
57+
8700,15312,
58+
11716,16008,
59+
12992,14964,
60+
12412,14964,
61+
12296,15312,
62+
12528,15196,
63+
15312,6612,
64+
11716,16124,
65+
11600,19720,
66+
10324,17516,
67+
12412,13340,
68+
12876,12180,
69+
13688,10904,
70+
13688,11716,
71+
13688,12528,
72+
11484,13224,
73+
12296,12760,
74+
12064,12528,
75+
12644,10556,
76+
11832,11252,
77+
11368,12296,
78+
11136,11020,
79+
10556,11948,
80+
10324,11716,
81+
11484,9512,
82+
11484,7540,
83+
11020,7424,
84+
11484,9744,
85+
16936,12180,
86+
17052,12064,
87+
16936,11832,
88+
17052,11600,
89+
13804,18792,
90+
12064,14964,
91+
12180,15544,
92+
14152,18908,
93+
5104,14616,
94+
6496,17168,
95+
5684,13224,
96+
15660,10788,
97+
5336,10324,
98+
812,6264,
99+
14384,20184,
100+
11252,15776,
101+
9744,3132,
102+
10904,3480,
103+
7308,14848,
104+
16472,16472,
105+
10440,14036,
106+
10672,13804,
107+
1160,18560,
108+
10788,13572,
109+
15660,11368,
110+
15544,12760,
111+
5336,18908,
112+
6264,19140,
113+
11832,17516,
114+
10672,14152,
115+
10208,15196,
116+
12180,14848,
117+
11020,10208,
118+
7656,17052,
119+
16240,8352,
120+
10440,14732,
121+
9164,15544,
122+
8004,11020,
123+
5684,11948,
124+
9512,16472,
125+
13688,17516,
126+
11484,8468,
127+
3248,14152,

0 commit comments

Comments
 (0)