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
8
12
14{
16 if (clone != NULL)
17 clone->Copiar(this);
18 else
19 memoriaEsgotada = true;
20 return clone;
21}
22
24{
26 direita = esquerda = numeros = {};
28
29 // gerar uma instancia provavelmente possivel
30 int soma1, soma2;
31 soma1 = soma2 = 0;
32 for (int i = 0; i < instancia.valor; i++) {
33 numeros += (TRand::rand() % (3 * instancia.valor));
34 if (soma1 < soma2)
35 soma1 += numeros.Last();
36 else soma2 += numeros.Last();
37 }
38 // acertar a paridade, muito embora não se saiba se há ou não solução
39 if ((soma1 + soma2) % 2 == 1)
40 numeros.Last() += 1;
41 // garantir que há uma solução
42 //if (soma1 != soma2)
43 // numeros += abs(soma1 - soma2);
44 numeros -= 0;
45 numeros.Sort();
46 tamanhoCodificado = 2; // apenas dois inteiro de 64 bits, para colocar 3 inteiros de 32 bits
47}
48
50{
51 int faltaDistribuir = 0;
52 for (int i = 0; i < numeros.Count(); i++)
54 if (faltaDistribuir < abs(totalEsquerda - totalDireita)) { // ja nao ha hipotese
56 return;
57 }
58
59 if (!numeros.Empty()) {
64 return;
65 esquerda->esquerda += (esquerda->numeros.Pop());
66 esquerda->totalEsquerda += esquerda->esquerda.Last();
67 direita->direita += (direita->numeros.Pop());
68 direita->totalDireita += direita->direita.Last();
70 }
71}
72
73const char* CParticao::Acao(TProcuraConstrutiva* sucessor) {
75 if (totalEsquerda == suc->totalEsquerda &&
76 totalDireita != suc->totalDireita)
77 return "dir";
78 if (totalEsquerda != suc->totalEsquerda &&
79 totalDireita == suc->totalDireita)
80 return "esq";
81 return "Inv";
82}
83
84void CParticao::Debug(bool completo)
85{
86 int i;
87 NovaLinha();
88 printf("Colocar #%d: %d = %d",
90 for (i = 0; i < numeros.Count(); i++) {
91 if (i % 4 == 0) {
92 NovaLinha();
93 printf("--- ");
94 }
95 printf("%3d ", numeros[i]);
96 if ((i + 1) % 4 == 0)
97 printf(" ---");
98 }
99 if (i % 4 != 0) {
100 while (i++ % 4 != 0)
101 printf(" ");
102 printf(" ---");
103 }
104 for (i = 0; i < esquerda.Count(); i++) {
105 if (i % 4 == 0) {
106 NovaLinha();
107 printf(" ");
108 }
109 printf("%3d ", esquerda[i]);
110 if ((i + 1) % 4 == 0)
111 printf(" <<<");
112 }
113 if (i % 4 != 0) {
114 while (i++ % 4 != 0)
115 printf(" ");
116 printf(" <<<");
117 }
118 for (i = 0; i < direita.Count(); i++) {
119 if (i % 4 == 0) {
120 NovaLinha();
121 printf(">>> ");
122 }
123 printf("%3d ", direita[i]);
124 }
125}
126
127
128// método para lidar com estados repetidos
130{
132 // como a ordem é fixa, um estado fica definido por:
133 // - números que faltam colocar
134 // - valor atual num lado, o menor
135 // - valor atual no outro lado, o maior
138 if (valorMaior < valorMenor) {
142 }
144 estado[0] = porColocar;
145 estado[1] = valorMaior;
146 estado[1] |= (uint64_t)valorMenor << 32;
147}
148
154
constexpr int OBJETO_HASHTABLE
Representa um estado do problema da partição.
Definition Particao.h:13
const char * Acao(TProcuraConstrutiva *sucessor)
Definition Particao.cpp:73
~CParticao(void)
Definition Particao.cpp:9
void Copiar(TProcuraConstrutiva *objecto)
Definition Particao.h:24
void Codifica(uint64_t estado[OBJETO_HASHTABLE])
Codifica o estado para um vetor de inteiros de 64 bits.
Definition Particao.cpp:129
TVector< int > direita
Definition Particao.h:19
TVector< int > esquerda
Definition Particao.h:19
void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
Definition Particao.cpp:49
TVector< int > numeros
Definition Particao.h:19
void ResetParametros()
Inicializa os parametros, indicadores e instâncias.
Definition Particao.cpp:149
int totalDireita
Definition Particao.h:20
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Particao.cpp:23
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
Representa um estado no espaço de estados.
void NovaLinha(bool tudo=true)
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
Definition TProcura.h:501
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:493
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
Definition TProcura.h:24
Item & Pop()
Definition TVector.h:190
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 & Last()
Definition TVector.h:224
int Count() const
Definition TVector.h:227
virtual void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
void Inicializar(void) override
Coloca o objecto no estado inicial da procura.
void ResetParametros() override
Redefinição. Ver TProcura::ResetParametros().
static int tamanhoCodificado
Número de inteiros de 64 bits utilizados para codificar um objeto (≤ OBJETO_HASHTABLE).
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