TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
Particao.cpp
Go to the documentation of this file.
1#include "Particao.h"
2#include <stdio.h>
3#include <string.h>
4
5TVector<int> CParticaoCB::numeros; // número de elementos a particionar
6
8{
9}
10
12{
13}
14
16{
18 direita = esquerda = numeros = {};
20 solCompleta = {};
21
22 // gerar uma instancia provavelmente possivel
23 int soma1, soma2;
24 soma1 = soma2 = 0;
25 for (int i = 0; i < instancia.valor; i++) {
26 numeros += (TRand::rand() % (3 * instancia.valor));
27 if (soma1 < soma2)
28 soma1 += numeros.Last();
29 else soma2 += numeros.Last();
30 }
31 // acertar a paridade, muito embora não se saiba se há ou não solução
32 if ((soma1 + soma2) % 2 == 1)
33 numeros.Last() += 1;
34 // garantir que há uma solução
35 //if (soma1 != soma2)
36 // numeros += abs(soma1 - soma2);
37 numeros -= 0;
38 numeros.Sort();
40}
41
42void CParticao::Debug(bool completo)
43{
44 int i, j;
45 printf("\nColocar #%d: %d = %d",
47 if (!solCompleta.Empty()) {
48 for (i = 0, j = 0; i < solCompleta.Count(); i++) {
49 if (solCompleta[i]) { // esquerda
50 if (j++ % 4 == 0) {
51 printf("\n ");
52 }
53 printf("%3d ", numeros[i]);
54 if (j % 4 == 0)
55 printf(" <<<");
56 }
57 }
58 if (j % 4 != 0) {
59 while (j++ % 4 != 0)
60 printf(" ");
61 printf(" <<<");
62 }
63 for (i = 0, j = 0; i < solCompleta.Count(); i++) {
64 if (!solCompleta[i]) { // direita
65 if (j++ % 4 == 0) {
66 printf("\n>>> ");
67 }
68 printf("%3d ", numeros[i]);
69 }
70 }
71 }
72 else {
73 for (i = 0; i < numeros.Count(); i++) {
74 if (i % 4 == 0) {
75 printf("\n--- ");
76 }
77 printf("%3d ", numeros[i]);
78 if ((i + 1) % 4 == 0)
79 printf(" ---");
80 }
81 if (i % 4 != 0) {
82 while (i++ % 4 != 0)
83 printf(" ");
84 printf(" ---");
85 }
86 for (i = 0; i < esquerda.Count(); i++) {
87 if (i % 4 == 0) {
88 printf("\n ");
89 }
90 printf("%3d ", esquerda[i]);
91 if ((i + 1) % 4 == 0)
92 printf(" <<<");
93 }
94 if (i % 4 != 0) {
95 while (i++ % 4 != 0)
96 printf(" ");
97 printf(" <<<");
98 }
99 for (i = 0; i < direita.Count(); i++) {
100 if (i % 4 == 0) {
101 printf("\n>>> ");
102 }
103 printf("%3d ", direita[i]);
104 }
105 }
106}
107
108void CParticao::TesteManual(const char* nome)
109{
110 instancia = { NULL, 10,2,1000, NULL, NULL };
112}
113
114// métodos melhorativos
118 for (int i = 0; i < solCompleta.Count(); i++)
119 solCompleta[i] = TRand::rand() % 2;
120}
121
125 for (int i = 0; i < solCompleta.Count(); i++)
126 if (solCompleta[i])
128 else
131}
132
134 // trocar cada valor
135 for (int i = 0; i < solCompleta.Count(); i++) {
137 vizinho->solCompleta[i] = !solCompleta[i];
138 vizinhos += vizinho;
139 }
141}
142
144 // coloca um valor aleatório, com probabilidade de nova mudança em 75%
145 do {
147 } while (TRand::rand() % 4);
148}
149
151 // divisao tem de ter elementos de um e de outro
152 int divisao = 1 + TRand::rand() % solCompleta.Count() - 2;
153 for (int i = 0; i < divisao; i++)
154 solCompleta[i] = ((CParticao*)a)->solCompleta[i];
155 for (int i = divisao; i < solCompleta.Count(); i++)
156 solCompleta[i] = ((CParticao*)b)->solCompleta[i];
158}
159
161 int diferentes = 0; // número de posições distintas
162 for (int i = 0; i < solCompleta.Count(); i++)
163 if (solCompleta[i] != ((CParticao*)a)->solCompleta[i])
164 diferentes++;
165 return diferentes;
166}
167
170 nElementos = instancia.valor; // número de elementos a particionar
171
172 numeros = {};
173
174 // gerar uma instancia provavelmente possivel
175 int soma1, soma2;
176 soma1 = soma2 = 0;
177 for (int i = 0; i < instancia.valor; i++) {
178 numeros += (TRand::rand() % (3 * instancia.valor));
179 if (soma1 < soma2)
180 soma1 += (int)estado.Last();
181 else soma2 += (int)estado.Last();
182 }
183 // acertar a paridade, muito embora não se saiba se há ou não solução
184 if ((soma1 + soma2) % 2 == 1)
185 numeros.Last() += 1;
186 // garantir que há uma solução
187 //if (soma1 != soma2)
188 // estado += abs(soma1 - soma2);
189 numeros -= 0;
190 numeros.Sort();
192 NovaSolucao();
193}
194
196 int totalEsquerda, totalDireita;
197 custo = 0;
199 totalEsquerda = totalDireita = 0;
200 for (int i = 0; i < nElementos; i++)
201 if (Bit(i))
202 totalEsquerda += numeros[i];
203 else
204 totalDireita += numeros[i];
205 return custo = abs(totalEsquerda - totalDireita);
206}
207
208void CParticaoCB::Debug(bool completo)
209{
210 int i, esq = 0, dir = 0;
212
213 if(!completo) {
215 return;
216 }
217
218 for (i = 0; i < nElementos; i++)
219 if (Bit(i)) {
220 esq += numeros[i];
221 nEsq += numeros[i];
222 }
223 else {
224 dir += numeros[i];
225 nDir += numeros[i];
226 }
227 printf("\nColocar #%d:",
228 nElementos);
229 printf("\n-------------------||-------------------");
230 while (!nEsq.Empty() || !nDir.Empty()) {
231 printf("\n");
232 for(int j=0;j<4;j++) {
233 if (!nEsq.Empty())
234 printf("%3d ", nEsq.Pop());
235 else
236 printf(" ");
237 }
238 printf(" <<||>> ");
239 for (int j = 0; j < 4; j++) {
240 if (!nDir.Empty())
241 printf("%3d ", nDir.Pop());
242 else
243 printf(" ");
244 }
245 }
246 printf("\n-------------------||-------------------");
247 printf("\n %3d <<||>> %3d \n", esq, dir);
248}
int Avaliar(void)
Definition Particao.cpp:195
static TVector< int > numeros
Definition Particao.h:70
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Particao.cpp:168
void Debug(bool completo) override
Mostra o estado no ecrã, para debug.
Definition Particao.cpp:208
Representa um estado do problema da partição.
Definition Particao.h:13
TVector< bool > solCompleta
Definition Particao.h:26
void Mutar(void)
Definition Particao.cpp:143
~CParticao(void)
Definition Particao.cpp:9
int Distancia(TPonto a)
Definition Particao.cpp:160
int Avaliar(void)
Definition Particao.cpp:122
void Vizinhanca(TVector< TPonto > &vizinhos)
Definition Particao.cpp:133
TVector< int > direita
Definition Particao.h:19
TVector< int > esquerda
Definition Particao.h:19
void Cruzamento(TPonto a, TPonto b)
Definition Particao.cpp:150
TVector< int > numeros
Definition Particao.h:19
void NovaSolucao(void)
Definition Particao.cpp:115
int totalDireita
Definition Particao.h:20
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Particao.cpp:23
void TesteManual(const char *nome)
Inicializa a interação com o utilizador.
Definition Particao.cpp:108
TProcuraConstrutiva * Duplicar(void)
Cria um objecto que é uma cópia deste.
Definition Particao.cpp:13
void Debug(bool completo=true) override
Mostra o estado no ecrã, para debug.
Definition Particao.cpp:84
int totalEsquerda
Definition Particao.h:20
CParticao(void)
Definition Particao.cpp:5
void Debug(bool completo=true) override
Mostra o estado no ecrã, para debug.
TVector< uint64_t > estado
virtual void Cruzamento(TPonto a, TPonto b)
void Inicializar(void)
Inicializar a instância. No final, chamar NovaSolucao() para inicializar o estado.
virtual int Avaliar(void)
int custo
Custo total, atualizada após Avaliar()
virtual void Vizinhanca(TVector< TPonto > &vizinhos)
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:493
virtual void TesteManual(const char *nome)
Inicializa a interação com o utilizador.
Definition TProcura.cpp:110
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
Definition TProcura.h:24
bool Empty() const
Definition TVector.h:230
TVector< Item > & Sort(TVector< int > *idxvect=nullptr)
Ordena todo o vetor, opcionalmente devolvendo índices ordenados.
Definition TVector.h:597
Item & Random()
Definition TVector.h:250
Item & Last()
Definition TVector.h:224
int Count() const
Definition TVector.h:227
int custo
Custo total acumulado desde o estado inicial.
unsigned int rand(int seq)
Retorna o próximo valor pseudo-aleatório.
Definition TRand.cpp:46
int valor
valor do parametro
Definition TProcura.h:139