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
30 // gerador de instância
31 // gerar uma instancia provavelmente possivel
33 soma = 0;
34 for (int i = 0; i < instancia.valor; i++) {
36 soma += (int)numeros.Last();
37 }
38 // acertar a paridade, muito embora não se saiba se há ou não solução
39 if (soma % 2 == 1)
40 numeros.Last() += 1;
41
42 }
43 else {
44 for (auto& linha : TString().printf("%s%d.txt", *ficheiroInstancia, instancia.valor).readLines())
45 numeros += atoi(linha);
46 }
47
48 numeros.Sort();
49}
50
52{
54 for (auto& valor : numeros)
55 linhas += TString(valor);
57}
58
60{
62 for (int i = 0; i < numeros.Count(); i++)
64 if (faltaDistribuir < abs(totalEsquerda - totalDireita)) { // ja nao ha hipotese
66 return;
67 }
68
69 if (!numeros.Empty()) {
74 return;
75 esquerda->esquerda += (esquerda->numeros.Pop());
76 esquerda->totalEsquerda += esquerda->esquerda.Last();
77 direita->direita += (direita->numeros.Pop());
78 direita->totalDireita += direita->direita.Last();
80 }
81}
82
85 if (totalEsquerda == suc->totalEsquerda &&
86 totalDireita != suc->totalDireita)
87 return "dir";
88 if (totalEsquerda != suc->totalEsquerda &&
89 totalDireita == suc->totalDireita)
90 return "esq";
91 return "Inv";
92}
93
94void CParticao::Debug(bool completo)
95{
97 int i, col;
98 int64_t total = 0;
99 for (auto numero : numeros)
100 total += numero;
101 str.printf("📦%" PRId64 " → ◀️%" PRId64 " = ▶️%" PRId64,
103 NovaLinha();
104 // apenas no modo completo mostra tudo
107 return;
108 }
109 MostraCaixa(str, ECaixaParte::Topo, 70, true, -2);
110 NovaLinha();
111 MostraCaixa("📦", ECaixaParte::Separador, 1, true, -2);
112 col = 2;
113 for (i = 0; i < numeros.Count(); i++) {
114 col += printf(" %d", numeros[i]);
115 if (col > 60 && i < numeros.Count() - 1) {
116 col = 2;
117 NovaLinha();
118 MostraCaixa("📦", ECaixaParte::Separador, 1, true, -2);
119 }
120 }
121 NovaLinha();
122 MostraCaixa("◀️", ECaixaParte::Separador, 1, true, -2);
123 col = 2;
124 for (i = 0; i < esquerda.Count(); i++) {
125 col += printf(" %d", esquerda[i]);
126 if (col > 60 && i < numeros.Count() - 1) {
127 col = 2;
128 NovaLinha();
129 MostraCaixa("◀️", ECaixaParte::Separador, 1, true, -2);
130 }
131 }
132 NovaLinha();
133 MostraCaixa("▶️", ECaixaParte::Separador, 1, true, -2);
134 col = 2;
135 for (i = 0; i < direita.Count(); i++) {
136 col += printf(" %d", direita[i]);
137 if (col > 60 && i < numeros.Count() - 1) {
138 col = 2;
139 NovaLinha();
140 MostraCaixa("▶️", ECaixaParte::Separador, 1, true, -2);
141 }
142 }
143 NovaLinha();
144 MostraCaixa("", ECaixaParte::Fundo, 70, true, -2);
145}
146
147
148// método para lidar com estados repetidos
150{
152 estado.Count(3);
153 // como a ordem é fixa, um estado fica definido por:
154 // - números que faltam colocar
155 // - valor atual num lado, o menor
156 // - valor atual no outro lado, o maior
159 if (valorMaior < valorMenor) {
163 }
165 estado[0] = porColocar;
166 estado[1] = valorMaior;
167 estado[2] = valorMenor;
168}
169
171{
173 instancia = { "", 10,2,1000};
174}
175
@ 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
Representa um estado do problema da partição.
Definition Particao.h:13
int64_t totalDireita
Definition Particao.h:20
~CParticao(void)
Definition Particao.cpp:9
int64_t totalEsquerda
Definition Particao.h:20
void Copiar(TProcuraConstrutiva *objecto)
Definition Particao.h:24
void Codifica(TBits &estado)
Codifica o estado para um vetor de inteiros de 64 bits.
Definition Particao.cpp:149
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:59
TVector< int > numeros
Definition Particao.h:19
void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
Definition Particao.cpp:170
void Gravar(void)
Definition Particao.cpp:51
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
TString Acao(TProcuraConstrutiva *sucessor)
Definition Particao.cpp:83
void Debug(bool completo=true) override
Mostra o estado no ecrã, para debug.
Definition Particao.cpp:94
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:583
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
static TString ficheiroInstancia
prefixo do nome ficheiro de uma instância - editado pelo utilizador Caso não seja nulo,...
Definition TProcura.h:562
static TString ficheiroGravar
prefixo do nome do ficheiro para gravar a instância para ficheiro (terá sido gerada)
Definition TProcura.h:564
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
bool Empty() const
Definition TVector.h:1184
TVector< TString > readLines()
Definition TVector.h:1229
TString & writeLines(const TVector< TString > &lines, bool append=false)
Definition TVector.h:1248
Item & Pop()
Definition TVector.h:193
TVector< Item > & Sort(TVector< int > *idxvect=nullptr)
Ordena todo o vetor, opcionalmente devolvendo índices ordenados.
Definition TVector.h:606
Item & Last()
Definition TVector.h:227
int Count() const
Definition TVector.h:230
virtual bool Empty() const
Definition TVector.h:233
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().
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