TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
Puzzle8.cpp
Go to the documentation of this file.
1#include "Puzzle8.h"
2#include <stdio.h>
3#include <string.h>
4
5CPuzzle8::CPuzzle8(void) : zero(0)
6{
7}
8
10{
11}
12
14{
15 CPuzzle8* clone = new CPuzzle8;
16 if (clone != NULL)
17 clone->Copiar(this);
18 else
19 memoriaEsgotada = true;
20 return clone;
21}
22
24{
27
28 // colocar a posição final
29 puzzle.Count(9);
30 for (int i = 0; i < 9; i++)
31 puzzle[i] = i;
32 zero = 0;
33
35 // gerador de instância
36 // efectuar trocas ao acaso
38 for (int i = 0; i < instancia.valor; i++) { // utilizar o ID da instância
41 TNo filho = sucessores.Random();
42 puzzle = ((CPuzzle8*)filho)->puzzle;
43 zero = ((CPuzzle8*)filho)->zero;
45 }
46 }
47 else { // ler instância de ficheiro
50 .readLines();
51 if (linhas.Count() >= 9) {
52 for (int i = 0; i < 9; i++) {
53 puzzle[i] = atoi(*linhas[i]);
54 if (puzzle[i] == 0)
55 zero = i;
56 }
57 }
58 }
59
61}
62
64{
66 for (auto& valor : puzzle)
67 linhas += TString(valor);
69}
70
72{
73 static int direcao[] = { -3,3,-1,1 }; // subir, baixar, esquerda, direita
74
75 for (int i = 0; i < 4; i++) {
76 int novaCasa = zero + direcao[i];
77 if (novaCasa >= 0 && novaCasa < 9 && // dentro do tabuleiro
78 (zero / 3 == novaCasa / 3 || zero % 3 == novaCasa % 3)) // muda apenas na horizontal ou na vertical
79 {
82 return;
83 sucessor->Trocar(zero, novaCasa);
85 }
86 }
88}
89
91{
92 for (int i = 0; i < 9; i++)
93 if (puzzle[i] != i)
94 return false;
95 return true;
96}
97
99{
100 heuristica = 0;
101
102 // distância de manhatan de cada posição à sua possição final
103 for (int i = 1; i < 9; i++) {
104 int posicaoI = 0;
105 while (puzzle[posicaoI] != i)
106 posicaoI++;
107 heuristica += abs(posicaoI % 3 - i % 3) + abs(posicaoI / 3 - i / 3);
108 }
109
111}
112
115 if (zero == suc->zero - 1)
116 return "esq";
117 if (zero == suc->zero + 1)
118 return "dir";
119 if (zero == suc->zero - 3)
120 return "cima";
121 if (zero == suc->zero + 3)
122 return "baixo";
123 return "Inv";
124}
125
126void CPuzzle8::Debug(bool completo)
127{
128 for (int i = 0; i < 3; i++) {
129 NovaLinha();
130 for (int j = 0; j < 3; j++)
131 if (puzzle[i * 3 + j] == 0)
132 printf(" . ");
133 else
134 printf(" %d ", puzzle[i * 3 + j]);
135 }
136}
137
140 CPuzzle8* atual, *arranque;
141 contador.Count(9);
142 contador.Reset(0);
143 arranque = (CPuzzle8*)caminho.First();
144 for (int i = 0, passos = 0, parte = 1; i < caminho.Count(); i++, passos++) {
145 atual = (CPuzzle8*)caminho[i];
146 contador[atual->zero]++;
147 // reportar uma parte, e iniciar outra
148 if (i == caminho.Count()-1 ||
149 contador[((CPuzzle8*)caminho[i + 1])->zero] > 0 ||
150 (i<caminho.Count()-2 && contador[((CPuzzle8*)caminho[i + 2])->zero] > 0))
151 {
152 printf("\nParte %d, ações:", parte);
153 // mostrar ações
154 for (int j = i - passos; j < i; j++)
155 printf(" %s", *(caminho[j]->Acao(caminho[j + 1])));
156
157 for (int i = 0; i < 3; i++) {
158 printf("\n");
159 for (int j = 0; j < 3; j++)
160 if (contador[i * 3 + j]) {
161 if (arranque->puzzle[i * 3 + j] == 0)
162 printf(" . "); // não marcar o próprio zero
163 else
164 printf("(%d)", arranque->puzzle[i * 3 + j]);
165 }
166 else {
167 if (arranque->puzzle[i * 3 + j] == 0)
168 printf(" . ");
169 else
170 printf(" %d ", arranque->puzzle[i * 3 + j]);
171 }
172 }
173
174 arranque = atual;
175 contador.Reset(0);
176 contador[atual->zero]++;
177 passos = 0;
178 parte++;
179 }
180 }
181}
182
183
186 // opções por omissão:
188 // instâncias
189 instancia = { "", 40,1,1000};
190}
191
192
194{
195 CPuzzle8* outro = (CPuzzle8*)estado;
196 if (zero != outro->zero)
197 return true;
198 for (int i = 0; i < 9; i++)
199 if (puzzle[i] != outro->puzzle[i])
200 return true;
201 return false;
202}
203
205{
207 // não há simetrias, simplesmente codificar números de 4 bits (0 a 8)
208 for (int i = 0, index = 0; i < 9; i++, index += 4)
209 estado.SetBits(puzzle[i], index, 4);
210}
@ ESTADOS_REPETIDOS
Forma de lidar com estados repetidos (ignorá-los, ascendentes, gerados).
@ IGNORADOS
ignorados os estados gerados repetidos
@ ASCENDENTES
estados são comparados com ascendentes, e se forem repetidos são removidos
Representa um estado do puzzle 8.
Definition Puzzle8.h:13
~CPuzzle8(void)
Definition Puzzle8.cpp:9
void Codifica(TBits &estado)
Codifica o estado para um vetor de inteiros de 64 bits.
Definition Puzzle8.cpp:204
int zero
Definition Puzzle8.h:21
TString Acao(TProcuraConstrutiva *sucessor)
Definition Puzzle8.cpp:113
void Gravar(void)
Definition Puzzle8.cpp:63
bool SolucaoCompleta(void)
Verifica se o estado actual é objectivo (é uma solução completa)
Definition Puzzle8.cpp:90
void MostrarSolucao(void)
definir para visualizar a solução
Definition Puzzle8.cpp:138
int Heuristica(void)
Função para calcular quanto falta para o final, o valor da heurística.
Definition Puzzle8.cpp:98
void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
Definition Puzzle8.cpp:71
TVector< int > puzzle
Definition Puzzle8.h:19
bool Distinto(TProcuraConstrutiva *estado)
Definition Puzzle8.cpp:193
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Puzzle8.cpp:23
void Debug(bool completo=true) override
Mostra o estado no ecrã, para debug.
Definition Puzzle8.cpp:126
void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
Definition Puzzle8.cpp:184
TProcuraConstrutiva * Duplicar(void)
Cria um objecto que é uma cópia deste.
Definition Puzzle8.cpp:13
void Copiar(TProcuraConstrutiva *objecto)
Definition Puzzle8.h:25
CPuzzle8(void)
Definition Puzzle8.cpp:5
void SetBits(uint64_t value, int bitIndex, int bitCount)
Definition TVector.h:1385
Representa um estado no espaço de estados.
void NovaLinha(bool tudo=true)
static void LibertarVector(TVector< TNo > &vector, int excepto=-1, int maiorQue=-1)
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
Definition TProcura.h:583
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
int Count() const
Definition TVector.h:230
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().
virtual int Heuristica(void)
Função para calcular quanto falta para o final, o valor da heurística.
virtual void Codifica(TBits &estado)
Codifica o estado para um vetor de inteiros de 64 bits.
int heuristica
Estimativa para o custo até um estado objetivo, se disponível.
static TVector< TNo > caminho
Solução retornada pela procura (os estados devem ser libertados).
int valor
valor do parâmetro
Definition TProcura.h:179