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
5CParticao::CParticao(void) : totalDireita(0), totalEsquerda(0)
6{
7}
8
12
14{
16 if(clone!=NULL)
17 clone->Copiar(this);
18 else
19 memoriaEsgotada = true;
20 return clone;
21}
22
24{
26 direita.Count(0);
27 esquerda.Count(0);
28 numeros.Count(0);
30
31 // gerar uma instancia provavelmente possivel
32 int soma1, soma2;
33 soma1 = soma2 = 0;
34 for (int i = 0; i < instancia.valor; i++) {
36 if (soma1 < soma2)
37 soma1 += numeros.Last();
38 else soma2 += numeros.Last();
39 }
40 // acertar a paridade, muito embora não se saiba se há ou não solução
41 if ((soma1 + soma2) % 2 == 1)
42 numeros.Last() + 1;
43 // garantir que há uma solução
44 //if (soma1 != soma2)
45 // numeros.Add(abs(soma1 - soma2));
46 numeros.Remove(0);
47 numeros.Sort();
48 tamanhoCodificado = 2; // apenas dois inteiro de 64 bits, para colocar 3 inteiros de 32 bits
49}
50
52{
53 int faltaDistribuir = 0;
54 for (int i = 0; i < numeros.Count(); i++)
56 if (faltaDistribuir < abs(totalEsquerda - totalDireita)) { // ja nao ha hipotese
58 return;
59 }
60
61 if (numeros.Count() > 0) {
66 return;
67 esquerda->esquerda.Push(esquerda->numeros.Pop());
68 esquerda->totalEsquerda+=esquerda->esquerda.Last();
69 direita->direita.Push(direita->numeros.Pop());
70 direita->totalDireita+=direita->direita.Last();
72 }
73}
74
75const char* CParticao::Acao(TProcuraConstrutiva* sucessor) {
77 if (totalEsquerda == suc->totalEsquerda &&
78 totalDireita != suc->totalDireita)
79 return "dir";
80 if (totalEsquerda != suc->totalEsquerda &&
81 totalDireita == suc->totalDireita)
82 return "esq";
83 return "Inv";
84}
85
87{
88 int i, j;
89 NovaLinha();
90 printf("Colocar #%d: %d = %d",
92 for (i = 0; i < numeros.Count(); i++) {
93 if (i % 4 == 0) {
94 NovaLinha();
95 printf("--- ");
96 }
97 printf("%3d ", numeros[i]);
98 if ((i + 1) % 4 == 0)
99 printf(" ---");
100 }
101 if (i % 4 != 0) {
102 while (i++ % 4 != 0)
103 printf(" ");
104 printf(" ---");
105 }
106 for (i = 0; i < esquerda.Count(); i++) {
107 if (i % 4 == 0) {
108 NovaLinha();
109 printf(" ");
110 }
111 printf("%3d ", esquerda[i]);
112 if ((i + 1) % 4 == 0)
113 printf(" <<<");
114 }
115 if (i % 4 != 0) {
116 while (i++ % 4 != 0)
117 printf(" ");
118 printf(" <<<");
119 }
120 for (i = 0; i < direita.Count(); i++) {
121 if (i % 4 == 0) {
122 NovaLinha();
123 printf(">>> ");
124 }
125 printf("%3d ", direita[i]);
126 }
127}
128
129
130// método para lidar com estados repetidos
132{
134 // como a ordem é fixa, um estado fica definido por:
135 // - números que faltam colocar
136 // - valor atual num lado, o menor
137 // - valor atual no outro lado, o maior
140 if (valorMaior < valorMenor) {
144 }
146 estado[0] = porColocar;
147 estado[1] = valorMaior;
148 estado[1] |= (uint64_t)valorMenor << 32;
149}
150
156
#define OBJETO_HASHTABLE
Representa um estado do problema da partição.
Definition Particao.h:13
const char * Acao(TProcuraConstrutiva *sucessor)
Definition Particao.cpp:75
~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:131
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:51
TVector< int > numeros
Definition Particao.h:19
void ResetParametros()
Inicializa os parametros, indicadores e instâncias.
Definition Particao.cpp:151
int totalDireita
Definition Particao.h:20
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Particao.cpp:23
void Debug(void)
Mostra o estado no ecrã, para debug.
Definition Particao.cpp:86
TProcuraConstrutiva * Duplicar(void)
Cria um objecto que é uma cópia deste.
Definition Particao.cpp:13
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:467
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:459
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
Definition TProcura.h:21
Item & Pop()
Definition TVector.h:127
TVector< Item > & Sort(TVector< int > *idxvect=nullptr)
Ordena todo o vetor, opcionalmente devolvendo índices ordenados.
Definition TVector.h:539
TVector< Item > & Remove(Item const &i)
Remove todas as ocorrências de um dado elemento.
Definition TVector.h:707
TVector< Item > & Add(Item a)
Definition TVector.h:115
Item & Last()
Definition TVector.h:157
int Count() const
Definition TVector.h:160
TVector< Item > & Push(Item a)
Definition TVector.h:124
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:114