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
24 soma = 0;
25 for (int i = 0; i < instancia.valor; i++) {
27 soma += (int)numeros.Last();
28 }
29 // acertar a paridade, muito embora não se saiba se há ou não solução
30 if (soma % 2 == 1)
31 numeros.Last() += 1;
32 numeros.Sort();
34}
35
36void CParticao::Debug(bool completo)
37{
38 int i, j;
39 printf("\nColocar #%d: %d = %d",
41 if (!solCompleta.Empty()) {
42 for (i = 0, j = 0; i < solCompleta.Count(); i++) {
43 if (solCompleta[i]) { // esquerda
44 if (j++ % 4 == 0) {
45 printf("\n ");
46 }
47 printf("%3d ", numeros[i]);
48 if (j % 4 == 0)
49 printf(" <<<");
50 }
51 }
52 if (j % 4 != 0) {
53 while (j++ % 4 != 0)
54 printf(" ");
55 printf(" <<<");
56 }
57 for (i = 0, j = 0; i < solCompleta.Count(); i++) {
58 if (!solCompleta[i]) { // direita
59 if (j++ % 4 == 0) {
60 printf("\n>>> ");
61 }
62 printf("%3d ", numeros[i]);
63 }
64 }
65 }
66 else {
67 for (i = 0; i < numeros.Count(); i++) {
68 if (i % 4 == 0) {
69 printf("\n--- ");
70 }
71 printf("%3d ", numeros[i]);
72 if ((i + 1) % 4 == 0)
73 printf(" ---");
74 }
75 if (i % 4 != 0) {
76 while (i++ % 4 != 0)
77 printf(" ");
78 printf(" ---");
79 }
80 for (i = 0; i < esquerda.Count(); i++) {
81 if (i % 4 == 0) {
82 printf("\n ");
83 }
84 printf("%3d ", esquerda[i]);
85 if ((i + 1) % 4 == 0)
86 printf(" <<<");
87 }
88 if (i % 4 != 0) {
89 while (i++ % 4 != 0)
90 printf(" ");
91 printf(" <<<");
92 }
93 for (i = 0; i < direita.Count(); i++) {
94 if (i % 4 == 0) {
95 printf("\n>>> ");
96 }
97 printf("%3d ", direita[i]);
98 }
99 }
100}
101
102void CParticao::TesteManual(const char* nome)
103{
104 instancia = { "", 10,2,1000};
106}
107
108// métodos melhorativos
112 for (int i = 0; i < solCompleta.Count(); i++)
113 solCompleta[i] = TRand::rand() % 2;
114}
115
119 for (int i = 0; i < solCompleta.Count(); i++)
120 if (solCompleta[i])
122 else
125}
126
128 // trocar cada valor
129 for (int i = 0; i < solCompleta.Count(); i++) {
131 vizinho->solCompleta[i] = !solCompleta[i];
132 vizinhos += vizinho;
133 }
135}
136
138 // coloca um valor aleatório, com probabilidade de nova mudança em 75%
139 do {
141 } while (TRand::rand() % 4);
142}
143
145 // divisao tem de ter elementos de um e de outro
146 int divisao = 1 + TRand::rand() % solCompleta.Count() - 2;
147 for (int i = 0; i < divisao; i++)
148 solCompleta[i] = ((CParticao*)a)->solCompleta[i];
149 for (int i = divisao; i < solCompleta.Count(); i++)
150 solCompleta[i] = ((CParticao*)b)->solCompleta[i];
152}
153
155 int diferentes = 0; // número de posições distintas
156 for (int i = 0; i < solCompleta.Count(); i++)
157 if (solCompleta[i] != ((CParticao*)a)->solCompleta[i])
158 diferentes++;
159 return diferentes;
160}
161
164 nElementos = instancia.valor; // número de elementos a particionar
165 numeros = {};
166
167 // gerar uma instancia provavelmente possivel
169 soma = 0;
170 for (int i = 0; i < instancia.valor; i++) {
172 soma += (int)numeros.Last();
173 }
174 // acertar a paridade, muito embora não se saiba se há ou não solução
175 if (soma % 2 == 1)
176 numeros.Last() += 1;
177 numeros.Sort();
179 NovaSolucao();
180}
181
183 int64_t total[2] = {0,0};
184 custo = 0;
186 for (int i = 0; i < nElementos; i++)
187 total[Bit(i)] += numeros[i];
188 return custo = abs(total[0] - total[1]);
189}
190
191void CParticaoCB::Debug(bool completo)
192{
193 int i, esq = 0, dir = 0;
195
196 if(!completo) {
198 return;
199 }
200
201 for (i = 0; i < nElementos; i++)
202 if (Bit(i)) {
203 esq += numeros[i];
204 nEsq += numeros[i];
205 }
206 else {
207 dir += numeros[i];
208 nDir += numeros[i];
209 }
210/*
211 printf("\nColocar #%d:",
212 nElementos);
213 printf("\n-------------------||-------------------");
214 while (!nEsq.Empty() || !nDir.Empty()) {
215 printf("\n");
216 for(int j=0;j<4;j++) {
217 if (!nEsq.Empty())
218 printf("%3d ", nEsq.Pop());
219 else
220 printf(" ");
221 }
222 printf(" <<||>> ");
223 for (int j = 0; j < 4; j++) {
224 if (!nDir.Empty())
225 printf("%3d ", nDir.Pop());
226 else
227 printf(" ");
228 }
229 }
230 printf("\n-------------------||-------------------");
231 printf("\n %3d <<||>> %3d \n", esq, dir);
232*/
233 TString str;
234 int col, total = esq+dir;
235 str.printf("📦%d → ◀️%d = ▶️%d", total, esq, dir);
236 printf("\n%s", debugPrefixo);
237 // apenas no modo completo mostra tudo
240 return;
241 }
242 MostraCaixa(str, ECaixaParte::Topo, 70, true, -2);
243 printf("\n%s", debugPrefixo);
244 MostraCaixa("◀️", ECaixaParte::Separador, 1, true, -2);
245 col = 2;
246 for (i = 0; i < nEsq.Count(); i++) {
247 col += printf(" %d", nEsq[i]);
248 if (col > 60 && i < numeros.Count() - 1) {
249 col = 2;
250 printf("\n%s", debugPrefixo);
251 MostraCaixa("◀️", ECaixaParte::Separador, 1, true, -2);
252 }
253 }
254 printf("\n%s", debugPrefixo);
255 MostraCaixa("▶️", ECaixaParte::Separador, 1, true, -2);
256 col = 2;
257 for (i = 0; i < nDir.Count(); i++) {
258 col += printf(" %d", nDir[i]);
259 if (col > 60 && i < numeros.Count() - 1) {
260 col = 2;
261 printf("\n%s", debugPrefixo);
262 MostraCaixa("▶️", ECaixaParte::Separador, 1, true, -2);
263 }
264 }
265 printf("\n%s", debugPrefixo);
266 MostraCaixa("", ECaixaParte::Fundo, 70, true, -2);
267}
@ COMPLETO
Mostra toda a execução detalhadamente.
Definition TProcura.h:95
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
Definition TProcura.h:71
int Avaliar(void)
Definition Particao.cpp:182
static TVector< int > numeros
Definition Particao.h:70
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Particao.cpp:162
void Debug(bool completo) override
Mostra o estado no ecrã, para debug.
Definition Particao.cpp:191
Representa um estado do problema da partição.
Definition Particao.h:13
int64_t totalDireita
Definition Particao.h:20
TVector< bool > solCompleta
Definition Particao.h:26
void Mutar(void)
Definition Particao.cpp:137
~CParticao(void)
Definition Particao.cpp:9
int Distancia(TPonto a)
Definition Particao.cpp:154
int64_t totalEsquerda
Definition Particao.h:20
int Avaliar(void)
Definition Particao.cpp:116
void Vizinhanca(TVector< TPonto > &vizinhos)
Definition Particao.cpp:127
TVector< int > direita
Definition Particao.h:19
TVector< int > esquerda
Definition Particao.h:19
void Cruzamento(TPonto a, TPonto b)
Definition Particao.cpp:144
TVector< int > numeros
Definition Particao.h:19
void NovaSolucao(void)
Definition Particao.cpp:109
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Particao.cpp:23
void TesteManual(const char *nome)
Definition Particao.cpp:102
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:94
CParticao(void)
Definition Particao.cpp:5
void Debug(bool completo=true) override
Mostra o estado no ecrã, para debug.
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 const char * debugPrefixo
Utilizar como prefixo em cada linha no método Debug() do estado.
static void MostraCaixa(TVector< TString > titulo, ECaixaParte parte, TVector< int > largura, bool aberta=true, int identacao=0)
Definition TProcura.cpp:368
int Parametro(int id) const
Definition TProcura.h:607
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:575
virtual void TesteManual(TString nome)
Inicializa a interação com o utilizador.
Definition TProcura.cpp:103
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
Definition TProcura.h:22
TString & printf(const char *fmt,...)
Definition TVector.h:1150
TVector< Item > & Sort(TVector< int > *idxvect=nullptr)
Ordena todo o vetor, opcionalmente devolvendo índices ordenados.
Definition TVector.h:606
Item & Random()
Definition TVector.h:253
Item & Last()
Definition TVector.h:227
int Count() const
Definition TVector.h:230
virtual bool Empty() const
Definition TVector.h:233
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 parâmetro
Definition TProcura.h:179