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 // colocar a posição final
28 puzzle.Count(9);
29 for (int i = 0; i < 9; i++)
30 puzzle[i] = i;
31 zero=0;
32 // efectuar trocas ao acaso
34 for (int i = 0; i < instancia.valor; i++) { // utilizar o ID da instância
37 TNo filho = sucessores.Random();
38 puzzle = ((CPuzzle8*)filho)->puzzle;
39 zero = ((CPuzzle8*)filho)->zero;
41 }
43 tamanhoCodificado = 1; // apenas um inteiro de 64 bits é suficiente para 4*9 bits
44}
45
47{
48 static int direcao[] = { -3,3,-1,1 }; // subir, baixar, esquerda, direita
49
50 for (int i = 0; i < 4; i++) {
51 int novaCasa = zero + direcao[i];
52 if (novaCasa >= 0 && novaCasa < 9 && // dentro do tabuleiro
53 (zero / 3 == novaCasa / 3 || zero % 3 == novaCasa % 3)) // muda apenas na horizontal ou na vertical
54 {
57 return;
58 sucessor->Trocar(zero, novaCasa);
60 }
61 }
63}
64
66{
67 for (int i = 0; i < 9; i++)
68 if (puzzle[i] != i)
69 return false;
70 return true;
71}
72
74{
75 int resultado = 0;
77
78 // distância de manhatan de cada posição à sua possição final
79 for (int i = 1; i < 9; i++) {
80 int posicaoI = 0;
81 while (puzzle[posicaoI] != i)
82 posicaoI++;
83 resultado += abs(posicaoI % 3 - i % 3) + abs(posicaoI / 3 - i / 3);
84 }
85
86 return resultado;
87}
88
89const char* CPuzzle8::Acao(TProcuraConstrutiva* sucessor) {
91 if (zero == suc->zero - 1)
92 return "esq";
93 if (zero == suc->zero + 1)
94 return "dir";
95 if (zero == suc->zero - 3)
96 return "cima";
97 if (zero == suc->zero + 3)
98 return "baixo";
99 return "Inv";
100}
101
103{
104 for (int i = 0; i < 3; i++) {
105 NovaLinha();
106 for (int j = 0; j < 3; j++)
107 if (puzzle[i * 3 + j] == 0)
108 printf(" . ");
109 else
110 printf(" %d ", puzzle[i * 3 + j]);
111 }
112}
113
116 CPuzzle8* atual, *arranque;
117 contador.Count(9);
118 contador.Reset(0);
119 arranque = (CPuzzle8*)caminho.First();
120 for (int i = 0, passos = 0, parte = 1; i < caminho.Count(); i++, passos++) {
121 atual = (CPuzzle8*)caminho[i];
122 contador[atual->zero]++;
123 // reportar uma parte, e iniciar outra
124 if (i == caminho.Count()-1 ||
125 contador[((CPuzzle8*)caminho[i + 1])->zero] > 0 ||
126 i<caminho.Count()-2 && contador[((CPuzzle8*)caminho[i + 2])->zero] > 0)
127 {
128 printf("\nParte %d, ações:", parte);
129 // mostrar ações
130 for (int j = i - passos; j < i; j++)
131 printf(" %s", caminho[j]->Acao(caminho[j + 1]));
132
133 for (int i = 0; i < 3; i++) {
134 printf("\n");
135 for (int j = 0; j < 3; j++)
136 if (contador[i * 3 + j]) {
137 if (arranque->puzzle[i * 3 + j] == 0)
138 printf(" . "); // não marcar o próprio zero
139 else
140 printf("(%d)", arranque->puzzle[i * 3 + j]);
141 }
142 else {
143 if (arranque->puzzle[i * 3 + j] == 0)
144 printf(" . ");
145 else
146 printf(" %d ", arranque->puzzle[i * 3 + j]);
147 }
148 }
149
150 arranque = atual;
151 contador.Reset(0);
152 contador[atual->zero]++;
153 passos = 0;
154 parte++;
155 }
156 }
157}
158
159
162 // opções de omissão:
164 // instâncias
165 instancia = { NULL, 40,1,1000, NULL, NULL };
166}
167
168
170{
171 CPuzzle8* outro = (CPuzzle8*)estado;
172 if (zero != outro->zero)
173 return true;
174 for (int i = 0; i < 9; i++)
175 if (puzzle[i] != outro->puzzle[i])
176 return true;
177 return false;
178}
179
181{
183 // não há simetrias, simplesmente codificar números de 4 bits (0 a 8)
184 for (int i = 0, index = 0; i < 9; i++, index += 4)
185 estado[index >> 6] |= (uint64_t)puzzle[i] << (index & 63);
186}
@ estadosRepetidos
Forma de lidar com estados repetidos (ignorá-los, ascendentes, gerados).
@ ascendentes
estados são comparados com ascendentes, e se forem repetidos são removidos
@ ignorados
ignorados os estados gerados repetidos
#define OBJETO_HASHTABLE
@ passos
Exibe passos intermediários.
Definition TProcura.h:65
Representa um estado do puzzle 8.
Definition Puzzle8.h:13
~CPuzzle8(void)
Definition Puzzle8.cpp:9
int zero
Definition Puzzle8.h:21
bool SolucaoCompleta(void)
Verifica se o estado actual é objectivo (é uma solução completa)
Definition Puzzle8.cpp:65
void MostrarSolucao(void)
definir para visualizar a solução
Definition Puzzle8.cpp:114
int Heuristica(void)
Função para calcular quanto falta para o final, o valor da heurística.
Definition Puzzle8.cpp:73
void Codifica(uint64_t estado[OBJETO_HASHTABLE])
Codifica o estado para um vetor de inteiros de 64 bits.
Definition Puzzle8.cpp:180
void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
Definition Puzzle8.cpp:46
const char * Acao(TProcuraConstrutiva *sucessor)
Definition Puzzle8.cpp:89
TVector< int > puzzle
Definition Puzzle8.h:19
void Debug(void)
Mostra o estado no ecrã, para debug.
Definition Puzzle8.cpp:102
bool Distinto(TProcuraConstrutiva *estado)
Definition Puzzle8.cpp:169
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Puzzle8.cpp:23
void ResetParametros()
Inicializa os parametros, indicadores e instâncias.
Definition Puzzle8.cpp:160
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
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: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
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
Definition TProcura.h:451
int Parametro(int id)
Definition TProcura.h:479
int Count() const
Definition TVector.h:160
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(uint64_t estado[OBJETO_HASHTABLE])
Codifica o estado para um vetor de inteiros de 64 bits.
static int tamanhoCodificado
Número de inteiros de 64 bits utilizados para codificar um objeto (≤ OBJETO_HASHTABLE).
static TVector< TNo > caminho
Solução retornada pela procura (os estados devem ser libertados).
int valor
valor do parametro
Definition TProcura.h:114