-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunctions.cpp
343 lines (283 loc) · 12.4 KB
/
functions.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include "structures.hpp"
using namespace std;
/// @brief GEra um número aleatório entre 2 valores
/// @param Higher Maior valor possível gerado
/// @param Lower Menor valor possível gerdao
/// @return Valor aleatório entre Higher e Lower
unsigned short int RandomGenerator(unsigned short int Higher, unsigned short int Lower)
{
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(Higher, Lower);
return dis(gen);
}
/// @brief Lê a primeira linha do arquivo input.data e retorna uma variável que representa o tamanho das matrizes contidas nesse arquivo
/// @return O tamanho das matrizes à serem lidas
unsigned short int SizeRecon()
{
unsigned short int ArrayArea = 0;
FILE *LocalPointer;
LocalPointer = fopen("./dataset/input.data", "r");
fscanf(LocalPointer, "%hu", &ArrayArea);
fclose(LocalPointer);
return ArrayArea;
}
/// @brief Lê uma matriz passada como argumento do tamanho passado por argumento
/// @param size
/// @param Matrix
void MatrixScanner(unsigned short int size,MatrixElement *Matrix)
{
unsigned short int i,j;
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
//cout<<((*Matrix[i][j]).Element);
cout<<(*((Matrix+i*size)+j)).Element<<"\t";
}
cout<<"\n";
}
cout<<"\n\n\n";
}
/// @brief //Pede para que o usuário declare duas cordenadas que são armazenadas em i e j
/// @param i Coordenada de deslocamento em linhas sendo 0 o menor valor possível
/// @param j Coordenada de deslocamento em colunas sendo 0 o menor valor possível
void CoordinateDefinition(unsigned short int *i,unsigned short int *j)
{
cout<<"Insert a line (i): ";
cin>>*i;
cout<<"Insert a column (j): ";
cin>>*j;
cout<<"\n";
}
/// @brief //Recebe um vector com valores dos passos dados e retorna um vetor de memória alocada com base no tamanho do vector, contendo os passos do vector:
/// @param Steps Vector que contem coordenadas em i ou em j dos passos realizados
/// @param HowManySteps Número de passos dados na busca realizada em uma matriz
/// @return Um vetor com as mesmas variáveis do vector
unsigned short int* RoadMapDefiner(vector<unsigned short int> Steps,unsigned short int HowManySteps)
{
unsigned short int Counter=0;
unsigned short int *Route = (unsigned short int*)malloc(sizeof(unsigned short int)*(HowManySteps+10));
for(auto index=Steps.begin();index!=Steps.end();index++)
{
Route[Counter] = *index;
Counter+=1;
}
return Route;
}
/// @brief Mostra a ordem e local dos passos realizados por uma busca em uma matriz:
/// @param iRoute Um vetor com coordenadas de deslocamento em i
/// @param jRoute Um vetor com coordenadas de deslocamento j
/// @param size Tamanho da matriz onde a busca foi feita
/// @param HowManySteps Número de passos dados na busca realizada em uma matriz
void MapOfTheJourney(unsigned short int *iRoute,unsigned short int *jRoute,unsigned short int size, unsigned short int HowManySteps)
{
unsigned short int BinaryMatrix[size][size];
for(unsigned short int idxi=0;idxi<size;idxi++)
{
for(unsigned short int idxj=0;idxj<size;idxj++)
{
BinaryMatrix[idxi][idxj]=999;
}
}
for(int index = 0;index<HowManySteps;index++)
{
unsigned short int i = iRoute[index];
unsigned short int j = jRoute[index];
BinaryMatrix[i][j] = index;
}
for(unsigned short int column = 0;column<size;column++)
{
if(column == 0)
cout<<"i / j\t|"<<column;
else
cout<<"|\t|"<<column;
}
cout<<"\n";
for(unsigned short int idxi=0;idxi<size;idxi++)
{
cout<<"\n|"<<idxi<<"|\t";
for(unsigned short int idxj=0;idxj<size;idxj++)
{
if(idxj==0)
cout<<BinaryMatrix[idxi][idxj];
else
cout<<"\t"<<BinaryMatrix[idxi][idxj];
}
cout<<"\n------------------------------------------------------------------------------------";
}
}
/// @brief Mostra os passos da busca local com suas coordenadas e valores e adiciona os dados locais à uma variável de soma global:
/// @param iRoute Um vetor com coordenadas de deslocamento em i
/// @param jRoute Um vetor com coordenadas de deslocamento j
/// @param FinalMatrix Matriz onde a busca está sendo realizada
/// @param HowManySteps Número de passos dados na busca em FinalMatrix
/// @param size Tamanho da matriz
/// @param GlobalSum Soma de todos os valores encontrados na busca realizada em FinalMatrix
void RoadMapViewer(unsigned short int *iRoute,unsigned short int *jRoute, unsigned short int HowManySteps, MatrixElement *FinalMatrix,unsigned short int size, unsigned int *GlobalSum)
{
unsigned short int LocalSumOfSteps = 0;
cout<<"A trajetória realizada com as especificações de pesquisa na matriz foram:"<<"\n";
cout<<" Passos [i] [j] [Valor]"<<"\n";
cout<<"-----------------------------------------\n";
for(unsigned short int index=0;index<HowManySteps;index++)
{
cout<<index<<"º passo";
cout<<"\t | "<<iRoute[index]<<" |"<<" | "<<jRoute[index]<<" | "<< " | "<<(*(FinalMatrix+iRoute[index]*size+jRoute[index])).Element<<" | \n";
LocalSumOfSteps+=(*(FinalMatrix+iRoute[index]*size+jRoute[index])).Element;
}
cout<<"-----------------------------------------\n";
cout<<"A soma local foi:\t"<<LocalSumOfSteps<<"\n\n";
*GlobalSum+=LocalSumOfSteps;
}
/// @brief
/// @param size tamanho da matriz pesquisada
/// @param i distância em relaçao ao deslocamneto em linhas
/// @param j distância em relação ao deslocamento por colunas
/// @param S hipótese que verifica se um movimento para baixo é valido na matriz
/// @param SE hipótese que verifica se um movimento para baixo na diagonal direita da matriz é valido
/// @param SW hipótese que verifica se um movimento para baixo na diagonal esquerda da matriz é valido
/// @param W hipótese que verifica se um movimento para a esquerda na matriz é valido
/// @param E hipótese que verifica se um movimento para a direita na matriz é valido
void CreatingCoordinates(unsigned short int size,unsigned short int i,unsigned short int j, bool *S, bool *SE, bool *SW, bool *W, bool *E)
{
unsigned short int Limit = size-1;
*S = (i+1)<=Limit;
*SE = (((i+1) <= Limit) && ((j+1) <= Limit));
*SW = (((i+1) <= Limit) && ((j-1) > -1));
*W = (j-1)>-1;
*E = (j+1)<=Limit;
}
/// @brief
/// @param FinalMatrix Matriz onde a busca está sendo realizada
/// @param size tamanho da matriz pesquisada
/// @param i distância em relaçao ao deslocamneto em linhas
/// @param j distância em relação ao deslocamento por colunas
/// @param lasti valor em relação ao deslocamento em linhas da última posição na matriz
/// @param lastj valor em relação ao deslocamento em colunas da última posição na matriz
void FivePossibleWays(MatrixElement *FinalMatrix, unsigned short int *i,unsigned short *j,unsigned short int size, unsigned short *lasti, unsigned short *lastj)
{
unsigned short int IndexHigher = 0;
unsigned short int PossibleHigher[5];
unsigned short int Possiblei[5];
unsigned short int Possiblej[5];
unsigned short int Auxiliary = 0;
PossibleHigher[0] = (*(FinalMatrix+(*i+1)*size+(*j))).Element;
PossibleHigher[1] = (*(FinalMatrix+(*i+1)*size+(*j+1))).Element;
PossibleHigher[2] = (*(FinalMatrix+(*i)*size+(*j+1))).Element;
PossibleHigher[3] = (*(FinalMatrix+(*i+1)*size+(*j-1))).Element;
PossibleHigher[4] = (*(FinalMatrix+(*i)*size+(*j-1))).Element;
Possiblei[0] = *i+1;
Possiblei[1] = *i+1;
Possiblei[2] = *i;
Possiblei[3] = *i+1;
Possiblei[4] = *i;
Possiblej[0] = *j;
Possiblej[1] = *j+1;
Possiblej[2] = *j+1;
Possiblej[3] = *j-1;
Possiblej[4] = *j-1;
unsigned short int length = 5;
for(int index = 0;index<length;index++)
{
if(PossibleHigher[index]>Auxiliary && (Possiblei[index]!=*lasti || Possiblej[index]!=*lastj))
IndexHigher = index;
Auxiliary = PossibleHigher[IndexHigher];
}
*lasti = *i;
*lastj = *j;
*i = Possiblei[IndexHigher];
*j = Possiblej[IndexHigher];
}
/// @brief
/// @param FinalMatrix Matriz onde a busca está sendo realizada
/// @param size tamanho da matriz pesquisada
/// @param i distância em relaçao ao deslocamneto em linhas
/// @param j distância em relação ao deslocamento por colunas
/// @param lasti valor em relação ao deslocamento em linhas da última posição na matriz
/// @param lastj valor em relação ao deslocamento em colunas da última posição na matriz
void SouthEastPossibleWays(MatrixElement *FinalMatrix, unsigned short int *i,unsigned short *j,unsigned short int size,unsigned short *lasti, unsigned short *lastj)
{
unsigned short int IndexHigher = 0;
unsigned short int PossibleHigher[3];
unsigned short int Possiblei[3];
unsigned short int Possiblej[3];
unsigned short int Auxiliary = 0;
PossibleHigher[0] = (*(FinalMatrix+(*i+1)*size+(*j))).Element;
PossibleHigher[1] = (*(FinalMatrix+(*i+1)*size+(*j+1))).Element;
PossibleHigher[2] = (*(FinalMatrix+(*i)*size+(*j+1))).Element;
Possiblei[0] = *i+1;
Possiblei[1] = *i+1;
Possiblei[2] = *i;
Possiblej[0] = *j;
Possiblej[1] = *j+1;
Possiblej[2] = *j+1;
unsigned short int length = 3;
for(int index = 0;index<length;index++)
{
if(PossibleHigher[index]>Auxiliary && (Possiblei[index]!=*lasti || Possiblej[index]!=*lastj))
IndexHigher = index;
Auxiliary = PossibleHigher[IndexHigher];
}
*lasti = *i;
*lastj = *j;
*i = Possiblei[IndexHigher];
*j = Possiblej[IndexHigher];
}
/// @brief
/// @param FinalMatrix Matriz onde a busca está sendo realizada
/// @param size tamanho da matriz pesquisada
/// @param i distância em relaçao ao deslocamneto em linhas
/// @param j distância em relação ao deslocamento por colunas
/// @param lasti valor em relação ao deslocamento em linhas da última posição na matriz
/// @param lastj valor em relação ao deslocamento em colunas da última posição na matriz
void SouthWestPossibleWays(MatrixElement *FinalMatrix, unsigned short int *i,unsigned short *j,unsigned short int size, unsigned short *lasti, unsigned short *lastj)
{
unsigned short int IndexHigher = 0;
unsigned short int PossibleHigher[3];
unsigned short int Possiblei[3];
unsigned short int Possiblej[3];
unsigned short int Auxiliary = 0;
PossibleHigher[0] = (*(FinalMatrix+(*i+1)*size+(*j))).Element;
PossibleHigher[1] = (*(FinalMatrix+(*i+1)*size+(*j-1))).Element;
PossibleHigher[2] = (*(FinalMatrix+(*i)*size+(*j-1))).Element;
Possiblei[0] = *i+1;
Possiblei[1] = *i+1;
Possiblei[2] = *i;
Possiblej[0] = *j;
Possiblej[1] = *j-1;
Possiblej[2] = *j-1;
unsigned short int length = 3;
for(int index = 0;index<length;index++)
{
if(PossibleHigher[index]>Auxiliary && (Possiblei[index]!=*lasti || Possiblej[index]!=*lastj))
IndexHigher = index;
Auxiliary = PossibleHigher[IndexHigher];
}
*lasti = *i;
*lastj = *j;
*i = Possiblei[IndexHigher];
*j = Possiblej[IndexHigher];
}
/// @brief Mostra variáveis que englobam todas as pesquisas locais realizadas nas matrizes
/// @param ReadedMatrixes Número de matrizes percorridas
/// @param GlobalSum Soma dos elementos encontrados em todas as pesquisas locais
void JourneyMetrics(unsigned short int ReadedMatrixes, unsigned int GlobalSum)
{
//Ideia de implementação:
// [ ] - Mostrar a média de passos dados por matriz.
// [ ] - Mostrar o número de passos dados no total
// [ ] - Tentar elaborar uma métrica de score ou rankeamento usando
// (Soma total dos elementos)/ (Número de passos dados)
/*
A pergunta que fica após essa métrica é se não existe uma forma melhor de percorrer essa matriz
Ou seja, gerar um valor maior ou menor flexibilizando as regras de caminhamento, ou mudando a
forma com que eles foram realizados.
*/
cout<<"\n------------------------------Resumo de Métricas------------------------------\n";
cout<<"\nSoma total dos elementos:............................................"<<GlobalSum;
cout<<"\nNúmero de matrizes lidas:............................................"<<ReadedMatrixes;
}
#endif