-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathga.h
228 lines (207 loc) · 7.29 KB
/
ga.h
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
/***************************************************************************
* Copyright (C) 2006 by Joan Anglada *
* janglada(@)gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef GA_H
#define GA_H
//number of cities-chromosomelength
#define CHLEGTH 225
//number of individuals
#define NIND 2*CHLEGTH
#include <stdlib.h>
/**
@author joan,,,
*/
using namespace std;
/**
*GA CLASS
*Implementa l'algoritme gen�tic
*/
class GA
{
public:
/**
*Constructor
*Crea una poblacio a l'altzar.
*Crida setCities().
*/
GA();
/**
*Destructor
*No fa res.
*/
~GA();
/**
*
*
* */
void computecityDists();
/**
*Metode no pren cap par�metre.
*Fa un pas en l'evoluci�
*
*/
void evolve();
/**
*Metode que llegeix des de l'arxiu "cities.dat"
*les coordenades de les ciutats
*@see
*/
void setCities();
/**
*Metode que pren un argument i retorna un float.
*@param indx argument enter corresponent a la ciutat desitjada
*@return La coordenada X de la ciutat indx-essima
*/
float getXcity(int indx)
{
return tour[indx][0];
}
/**
*Metode que pren un argument i retorna un float.
*@param indx argument enter corresponent a la ciutat desitjada
*@return La coordenada Y de la ciutat indx-essima
*/
float getYcity(int indx)
{
return tour[indx][1];
}
/**
*Metode que pren un argument i retorna un int.
*@param indx argument enter. Correspon a la ciutat desitjada
*@return Ciutat en la posici� indx-essima del cromosoma que fa el tour m�s curt
*/
int getCity(int indx)
{
return population[minIndex][indx];
}
/**
*Metode que pren un argument i retorna un float.
*@return Longitud del tour m�s curt
*/
float getLength()
{
return lengths[minIndex];
}
/**
*Metode que retorna un int.
*@return El nombre de ciutats
*/
int getNcities()
{
return CHLEGTH;
}
void printBestSolution();
protected:
/**
*Metode que pren un argument. Intercanvia les posicions de dues
*ciutats a l'atzar en el cromosoma indicat.
*@param indx Argument enter. Correspon al l'index del cromosoma desitjat.
*
*/
void citySwap(int indx);
/**
*Metode que pren 3 arguments enters. Intercanvia les posicions de dues ciutats
*a l'atzar en el cromosoma indicat.
*@param indx Argument enter. Correspon al l'index del cromosoma desitjat.
*@param a Enter corresponent a l'index de la ciutat a intercanviar.
*@param b Enter corresponent a l'index de l'altra ciutat a intercanviar.
*/
void citySwap(int a,int b,int indx);
/**
*Metode que pren 2 arguments. Intercanvia les posicions de dues ciutats
*a l'atzar en el cromosoma indicat.
*@param indx Argument enter. Correspon al l'index del cromosoma desitjat.
*@param a Enter corresponent a l'index de la ciutat a intercanviar.
*@param b Enter corresponent a l'index de l'altra ciutat a intercanviar.
*/
void revOrder(int indx,bool isit);
/**
* Metode que inverteix l'ordre d'un tram de cromosoma
* @param indx Index del cromosoma a invertir.
* @param isit Si �s true el tram que invertiex el cromsoma �s igual o menor que 3
*Si isit es false, llavors el tram a invertir potser tan llarg com el nombre de ciutats
*/
void displace(int indx);
/**
* Metode que desordena tots els cromsomes de tots els individus.
*/
void shuffle();
/**
* Metode que copia el millor cromosoma a la posici� indx
* @param indx Index de l'individu.
*/
void copyChromosm(int indx);
/**
* Metode que calcula la distancia entre dues ciutats
* @param a Index d'una de les ciutats
* @param b Index de l'altra ciutat.
* @return Dist�ncia entre les ciutats a i b \f$\sqrt{(x_a-x_b)^2+(y_a-y_b)^2}\f$
*/
float distCities(int a, int b );
/**
* Metode que retorna un float
* @return Nombre a l'atzar entre 0 i 1 uniformement distribuit
*/
float randR()
{
return ( ((double)rand())/((double) RAND_MAX+(double)1) );
}
/**
* Metode que pren un enter i retorna una enter
* @param m Valor maixim de l'enter a retornar
* @return Nombre enter a l'atzar entre 1 i m uniformement distribuit.
*/
int randInt(int m)
{
return (int)(( ((double)rand())/((double) RAND_MAX+(double)1) )*m);
}
/**
* Metode que pren un enter.
* @param indx Index de l'individu el cromosoma del qual sera canviat per un cromosoma a l'atzar.
*/
void rnewgene(int indx);
/**
*Matriu que guarda les coordenades de les ciutats
*
*/
float tour[CHLEGTH][2];
/**
*Vector que guarda les longituds del tour de cada cdromosoma
*
*/
float lengths[NIND];
float probs[NIND];
/**
*Matriu que guarda els cromsomes
*Cada fila �s un cromosoma (individu) diferent
*/
int population[NIND][CHLEGTH];
/**
*Enter que guarda la posici� (index) del millor cromosoma
*
*/
int minIndex;
/**
*Enter que guarda la posici� (index) del pitjor cromosoma. Serveix per a normalitzar les probabilitats
*@see evolve()
*/
int maxIndex;
float cityDitsts[CHLEGTH][CHLEGTH];
};
#endif