TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
TCodificacaoInteira.cpp
Go to the documentation of this file.
2
3int TCodificacaoInteira::nElementos = 0; // número de elementos na permutação
4TVector<int> TCodificacaoInteira::maxValor; // valor máximo para cada elemento
5
10
13 for (int i = 0; i < nElementos; i++)
15 custo = -1;
16}
17
18void TCodificacaoInteira::Debug(bool completo) {
19 for (int i = 0; i < nElementos; i++)
20 printf("%d ", estado[i]);
21}
22
24
26 // parâmetros da codificação inteira
27 parametro += {
28 { "TIPO_CRUZAR", 1, 0, 10, "Cruzamento: N - N-pontos, 0 - uniforme", {
29 "uniforme","1-ponto","2-pontos","3-pontos","4-pontos",
30 "5-pontos","6-pontos","7-pontos","8-pontos","9-pontos","10-pontos" } },
31 { "TIPO_MUTAR", 0,0,100, "Mutação: 0 - aplica um vizinho aleatório (seja 1 só elemento ou segmento), 1 a 100, probabilidade de mutação de cada elemento, em percentagem (1 a 100)" },
32 { "TIPO_VIZINHO", 1,1,6, "Vizinhança: vários métodos para vizinhanças de inteiros", {
33 "incDecValor",
34 "incDecPot2",
35 "trocaValor",
36 "inserir",
37 "trocaPar",
38 "inverterSegmento" } },
39 { "LIMITE_VIZINHOS", 0,0,1000,
40"LIMITE_VIZINHOS, conforme a vizinhança, se 0 não há limite\n\
41- incDecPot2 + trocaValor - limita a diferença máxima de valores\n\
42- inserir + trocaPar + inverterSegmento - limita a distância entre pares" },
43 { "TIPO_DISTANCIA", 1,1,3, "Distância: vários métodso para distâncias de inteiros", {
44 "Hamming", // número de posições com valores diferentes
45 "Euclidiana", // distância euclidiana (raiz quadrada da soma dos quadrados das diferenças)
46 "Manhattan" // distância Manhattan (soma das diferenças absolutas)
47 } }
48 };
49}
50
54 if (pontos > nElementos / 2)
55 pontos = nElementos / 2;
56 while (divisoes.Count() < pontos) {
59 }
60 if (divisoes.Empty()) { // cruzamento uniforme
61 Debug(EXTRA_DEBUG, false, " cruzamento uniforme");
62 for (int i = 0; i < nElementos; i++)
63 estado[i] = ((TCodificacaoInteira*)(TRand::rand() % 2 == 0 ? a : b))->estado[i];
64 }
65 else { // cruzamento em N pontos
66 bool copiaPai = true;
67 int i = 0;
69 Debug(EXTRA_DEBUG, false, " cruzamento %d-ponto(s): ", divisoes.Count());
70 for (auto ponto : divisoes)
71 Debug(EXTRA_DEBUG, false, "%d ", ponto);
72 }
73 divisoes += nElementos; // ponto final
74 for(auto ponto : divisoes) {
75 while (i < ponto) {
76 estado[i] = ((TCodificacaoInteira*)(copiaPai ? a : b))->estado[i];
77 i++;
78 }
80 }
81 }
82 custo = -1;
83
85}
86
87
89 // inverter segmento de N bits
92 Debug(EXTRA_DEBUG, false, " vizinhança %s (limite %d)",
93 parametro[TIPO_VIZINHO_CI].nomeValores[tipo - 1], limiteVizinhanca);
94
95 if (tipo >= vizIncDecValorCI && tipo <= vizTrocaValorCI) {
96 // alterar valor de um elemento
97 for (int i = 0; i < nElementos; i++) {
98 int j = 0;
99 while (abs(j) <= maxValor[i] && (!limiteVizinhanca || abs(j) <= limiteVizinhanca)) {
100 // incrementar j (+1, -1, +2, -2, +4, -4, etc no caso de potências, e incremental c.c.)
101 if (j <= 0)
102 j = -j + (tipo == vizIncDecPot2CI ? (j == 0 ? 1 : -j) : 1);
103 else
104 j = -j;
105 if (tipo == vizIncDecValorCI && j > 1)
106 break; // apenas incrementa/decrementa 1
107 if (estado[i] + j < 0 || estado[i] + j >= maxValor[i])
108 continue; // valor inválido
110 if (vizinho != NULL) {
111 vizinho->estado[i] += j;
112 vizinho->custo = -1;
113 vizinhos += vizinho;
114 }
115 else
116 memoriaEsgotada = true;
117 }
118 }
119 }
120 else if (tipo >= vizInserirCI && tipo <= vizInverterSegmentoCI) {
121 // alterar posição de elementos
122 for (int i = 0; i < nElementos; i++) // elemento i
123 for (int j = 0; j < nElementos; j++) // elemento j ou local j
124 if (i != j && (!limiteVizinhanca || abs(i - j) <= limiteVizinhanca)) {
126 if (vizinho != NULL) {
127 if (tipo == vizInserirCI) {
128 int valor = vizinho->estado[i];
129 vizinho->estado.Delete(i);
130 vizinho->estado.Insert(j < i ? j : j - 1, valor);
131 if (maxValor[i] != maxValor[j]) {
132 // garantir que os valores estão dentro dos limites
133 for (int k = (i < j ? i : j); k < (i < j ? j : i); k++)
134 vizinho->estado[k] %= maxValor[k];
135 }
136 }
137 else if (tipo == vizTrocaParCI && i < j) { // trocaPar
138 int valor = vizinho->estado[i];
139 vizinho->estado[i] = vizinho->estado[j];
140 vizinho->estado[j] = valor;
141 if (maxValor[i] != maxValor[j]) {
142 // garantir que os valores estão dentro dos limites
143 vizinho->estado[i] %= maxValor[i];
144 vizinho->estado[j] %= maxValor[j];
145 }
146 }
147 else if (tipo == vizInverterSegmentoCI && i < j) { // inverterSegmento
148 int ii = i, jj = j;
149 while (ii < jj) {
150 int valor = vizinho->estado[ii];
151 vizinho->estado[ii] = vizinho->estado[jj];
152 vizinho->estado[jj] = valor;
153 if (maxValor[ii] != maxValor[jj]) {
154 // garantir que os valores estão dentro dos limites
155 vizinho->estado[ii] %= maxValor[ii];
156 vizinho->estado[jj] %= maxValor[jj];
157 }
158 ii++;
159 jj--;
160 }
161 }
162
163 vizinho->custo = -1;
164 vizinhos += vizinho;
165 }
166 else
167 memoriaEsgotada = true;
168 }
169 }
171}
172
174 // mutação com probabilidade p de trocar cada bit
177 if (p == 0) {
178 // um vizinho aleatório
180 int i = TRand::rand() % nElementos;
181 int j = TRand::rand() % nElementos;
182 Debug(EXTRA_DEBUG, false, " mutar vizinho %s (%d,%d)",
183 parametro[TIPO_VIZINHO_CI].nomeValores[tipo - 1], i, j);
184 if (tipo == vizIncDecValorCI) {
185 estado[i] += (TRand::rand() % 2 == 0 ? 1 : -1);
186 }
187 else if (tipo == vizIncDecValorCI) {
188 do {
189 j = 1 << (TRand::rand() % 10); // potência de 2 até 512
190 } while (j >= maxValor[i]);
191 estado[i] += (TRand::rand() % 2 == 0 ? j : -j);
192 }
193 else if (tipo == vizTrocaValorCI) {
194 estado[i] = TRand::rand() % maxValor[i];
195 }
196 else if (tipo == vizInserirCI) {
197 int valor = estado[i];
198 estado.Delete(i);
199 estado.Insert(j < i ? j : j - 1, valor);
200 }
201 else if (tipo == vizTrocaParCI) {
202 int valor = estado[i];
203 estado[i] = estado[j];
204 estado[j] = valor;
205 }
206 else if (tipo == vizInverterSegmentoCI) {
207 while (i < j) {
208 int valor = estado[i];
209 estado[i] = estado[j];
210 estado[j] = valor;
211 i++;
212 j--;
213 }
214 }
215 // garantir que os valores estão dentro dos limites
216 for (int i = 0; i < nElementos; i++)
217 estado[i] = (estado[i] + maxValor[i]) % maxValor[i];
218 custo = -1;
219 }
220 else {
221 Debug(EXTRA_DEBUG, false, " mutar prob p(%d) limiteVizinhanca %d",
223 // cada elemento com probabilidade p
224 for (int i = 0; i < nElementos; i++)
225 if (TRand::rand() % 100 < (unsigned)p) {
226 if (limiteVizinhanca) {
228 estado[i] = (estado[i] + maxValor[i]) % maxValor[i]; // garantir positivo
229 }
230 else
231 estado[i] += TRand::rand() % maxValor[i];
232 }
233 custo = -1;
234 }
235}
236
238 int dist = 0;
241 if (tipo == distEuclidianaCI) {
242 int64_t d = 0;
243 for (int i = 0; i < nElementos; i++) {
244 int64_t dif = estado[i] - obj.estado[i];
245 d += dif * dif;
246 }
247 dist = (int)d;
248 }
249 else if (tipo == distManhattanCI) {
250 for (int i = 0; i < nElementos; i++)
251 dist += abs(estado[i] - obj.estado[i]);
252 }
253 else // Hamming
254 for (int i = 0; i < nElementos; i++)
255 dist += (estado[i] != obj.estado[i]);
256 return dist;
257}
@ LIMITE_VIZINHOS_CI
@ TIPO_DISTANCIA_CI
@ TIPO_VIZINHO_CI
@ TIPO_CRUZAR_CI
@ TIPO_MUTAR_CI
ETiposDistanciaInteira
@ distEuclidianaCI
@ distManhattanCI
ETiposVizinhancaInteira
@ vizInverterSegmentoCI
@ vizIncDecPot2CI
@ vizTrocaValorCI
@ vizInserirCI
@ vizTrocaParCI
@ vizIncDecValorCI
@ EXTRA_DEBUG
Nível extra para debug muito detalhado (uso interno).
Definition TProcura.h:96
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
Definition TProcura.h:71
void Debug(bool completo=true) override
Mostra o estado no ecrã, para debug.
void Cruzamento(TPonto a, TPonto b)
static TVector< int > maxValor
void Vizinhanca(TVector< TPonto > &vizinhos)
void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
void Copiar(TPonto objecto)
Fica com uma cópia do objecto.
TPonto Duplicar(void)=0
Cria um objecto que é uma cópia deste.
virtual void Cruzamento(TPonto a, TPonto b)
int custo
Custo total, atualizada após Avaliar()
virtual void Vizinhanca(TVector< TPonto > &vizinhos)
void ResetParametros() override
Inicializa os parâmetros, indicadores e instâncias.
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
Definition TProcura.h:583
int Parametro(int id) const
Definition TProcura.h:607
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:575
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
Definition TProcura.h:567
TVector< Item > & BeASet()
Converte o vetor num conjunto: remove duplicados e ordena.
Definition TVector.h:845
TVector< Item > & Insert(TVector< Item > &v, int index=0)
Insere um vetor de itens na posição indicada.
Definition TVector.h:985
TVector< Item > & Delete(int i)
Remove o elemento na posição i deslocando os seguintes.
Definition TVector.h:826
int Count() const
Definition TVector.h:230
unsigned int rand(int seq)
Retorna o próximo valor pseudo-aleatório.
Definition TRand.cpp:46