TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
Aspirador.cpp
Go to the documentation of this file.
1#include "Aspirador.h"
2#include <stdio.h>
3#include <string.h>
4
5
9
13
15{
17 if(clone!=NULL)
18 clone->Copiar(this);
19 else
20 memoriaEsgotada = true;
21 return clone;
22}
23
25{
28 for (int i = 0; i < salas.Count(); i++)
29 salas[i] = (TRand::rand() % 2 ? '.' : '*');
31 tamanhoCodificado = 1; // dá já para bastantes salas
32}
33
39
41{
43 if (aspirador > 0) { // esquerda
46 }
47 if (aspirador < salas.Count() - 1) { // direita
49 sucessor->aspirador++;
50 }
51 // limpar
53 sucessor->salas[aspirador] = '.';
55 return;
57}
58
59const char* CAspirador::Acao(TProcuraConstrutiva* sucessor) {
61 if (aspirador == suc->aspirador && suc->salas[aspirador] == '.')
62 return "asp";
63 if (aspirador - 1 == suc->aspirador)
64 return "esq";
65 if (aspirador + 1 == suc->aspirador)
66 return "dir";
67 return "Inválida";
68}
69
71{
72 NovaLinha();
73 for (int i = 0; i < salas.Count(); i++) {
74 printf("%c%c%c",
75 aspirador == i ? '[' : ' ',
76 salas[i],
77 aspirador == i ? ']' : ' ');
78 if ((i + 1) < salas.Count() && (i + 1) % 10 == 0)
79 NovaLinha();
80 }
81}
82
84{
85 for (int i = 0; i < salas.Count(); i++)
86 if (salas[i] == '*')
87 return false;
88 return true;
89}
90
92 return aspirador != ((CAspirador*)estado)->aspirador ||
93 !salas.Equal(((CAspirador*)estado)->salas);
94}
95
96// o problema é simples, é possível uma heurística perfeita:
97// dá sempre o custo até à solução objetivo ótimo
99 // o aspirador tem de se mover para a salas mais extremas, e limpar todas as casas sujas
100 int sujas = 0, max = -1, min = -1;
101 for (int i = 0; i < salas.Count(); i++)
102 if (salas[i] == '*') {
103 sujas++;
104 if (min < 0 || i < min)
105 min = i;
106 if (max < 0 || i > max)
107 max = i;
108 }
109 if (sujas == 0)
110 return heuristica = 0;
111 return heuristica = sujas + // movimentos a aspirar as casas sujas
112 (abs(aspirador - min) < abs(aspirador-max) ? // ver qual o extermo mais próximo
113 abs(aspirador - min) : // movimentos a ir para o extermo mais próximo
114 abs(aspirador-max)) +
115 max - min; // após estar nesse extremo, ainda vai ao outro extremo
116}
117
118
119// método para lidar com estados repetidos
121{
122 int i, index;
124 // não há simetrias, simplesmente codificar as salas, seguida do aspirador
125 for (i = 0, index = 0; i < salas.Count(); i++, index++)
126 estado[index >> 6] |= (uint64_t)(salas[i] == '*' ? 1 : 0) << (index & 63);
127 // assumir que o aspirador cabe no resto dos elementos (número de salas pequeno)
128 estado[index >> 6] |= (uint64_t)(aspirador + 1) << (index & 63);
129 // aspirador+1 para evitar o estado com tudo a zero
130}
#define OBJETO_HASHTABLE
Representa um estado no problema do Aspirador.
Definition Aspirador.h:13
void Debug(void)
Mostra o estado no ecrã, para debug.
Definition Aspirador.cpp:70
void Copiar(TProcuraConstrutiva *objecto)
Definition Aspirador.h:24
TProcuraConstrutiva * Duplicar(void)
Cria um objecto que é uma cópia deste.
Definition Aspirador.cpp:14
CAspirador(void)
Definition Aspirador.cpp:6
const char * Acao(TProcuraConstrutiva *sucessor)
Definition Aspirador.cpp:59
int aspirador
Definition Aspirador.h:20
void ResetParametros()
Inicializa os parametros, indicadores e instâncias.
Definition Aspirador.cpp:34
bool SolucaoCompleta(void)
Verifica se o estado actual é objectivo (é uma solução completa)
Definition Aspirador.cpp:83
void Codifica(uint64_t estado[OBJETO_HASHTABLE])
Codifica o estado para um vetor de inteiros de 64 bits.
bool Distinto(TNo estado)
Verifica se o estado actual distinto do fornecido.
Definition Aspirador.cpp:91
~CAspirador(void)
Definition Aspirador.cpp:10
TVector< char > salas
Definition Aspirador.h:19
void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
Definition Aspirador.cpp:40
int Heuristica(void)
Função para calcular quanto falta para o final, o valor da heurística.
Definition Aspirador.cpp:98
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Aspirador.cpp:24
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
bool Equal(const TVector< Item > &v) const
Verifica se dois vetores-conjunto são iguais.
Definition TVector.h:879
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 void Codifica(uint64_t estado[OBJETO_HASHTABLE])
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 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