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
6CAspirador::CAspirador(void) : aspirador(0)
7{}
8
11
13{
15 if (clone != NULL)
16 clone->Copiar(this);
17 else
18 memoriaEsgotada = true;
19 return clone;
20}
21
23{
26 for (int i = 0; i < salas.Count(); i++)
27 salas[i] = (TRand::rand() % 2 ? '.' : '*');
29}
30
36
38{
40 if (aspirador > 0) { // esquerda
43 }
44 if (aspirador < salas.Count() - 1) { // direita
46 sucessor->aspirador++;
47 }
48 // limpar
50 sucessor->salas[aspirador] = '.';
52 return;
54}
55
58 if (aspirador == suc->aspirador && suc->salas[aspirador] == '.')
59 return "asp";
60 if (aspirador - 1 == suc->aspirador)
61 return "esq";
62 if (aspirador + 1 == suc->aspirador)
63 return "dir";
64 return "Inválida";
65}
66
67void CAspirador::Debug(bool completo)
68{
69 NovaLinha();
70 for (int i = 0; i < salas.Count(); i++) {
71 printf("%c%c%c",
72 aspirador == i ? '[' : ' ',
73 salas[i],
74 aspirador == i ? ']' : ' ');
75 if ((i + 1) < salas.Count() && (i + 1) % 10 == 0)
76 NovaLinha();
77 }
78}
79
81{
82 for (int i = 0; i < salas.Count(); i++)
83 if (salas[i] == '*')
84 return false;
85 return true;
86}
87
89 return aspirador != ((CAspirador*)estado)->aspirador ||
90 !salas.Equal(((CAspirador*)estado)->salas);
91}
92
93// o problema é simples, é possível uma heurística perfeita:
94// dá sempre o custo até à solução objetivo ótimo
96 // o aspirador tem de se mover para a salas mais extremas, e limpar todas as casas sujas
97 int sujas = 0, max = -1, min = -1;
98 for (int i = 0; i < salas.Count(); i++)
99 if (salas[i] == '*') {
100 sujas++;
101 if (min < 0 || i < min)
102 min = i;
103 if (max < 0 || i > max)
104 max = i;
105 }
106 if (sujas == 0)
107 heuristica = 0;
108 else
109 heuristica = sujas + // movimentos a aspirar as casas sujas
110 (abs(aspirador - min) < abs(aspirador - max) ? // ver qual o extremo mais próximo
111 abs(aspirador - min) : // movimentos a ir para o extremo mais próximo
112 abs(aspirador - max)) +
113 max - min; // após estar nesse extremo, ainda vai ao outro extremo
115}
116
117
118// método para lidar com estados repetidos
120{
121 int i, index;
123 // não há simetrias, simplesmente codificar as salas, seguida do aspirador
124 for (i = 0, index = 0; i < salas.Count(); i++, index++)
125 estado.SetBit(index, salas[i] == '*');
126 // assumir que o aspirador cabe no resto dos elementos (número de salas pequeno)
127 estado.SetBits(aspirador + 1, index, 8);
128 // aspirador+1 para evitar o estado com tudo a zero
129}
Representa um estado no problema do Aspirador.
Definition Aspirador.h:13
TString Acao(TProcuraConstrutiva *sucessor)
Definition Aspirador.cpp:56
void Copiar(TProcuraConstrutiva *objecto)
Definition Aspirador.h:24
TProcuraConstrutiva * Duplicar(void)
Cria um objecto que é uma cópia deste.
Definition Aspirador.cpp:12
CAspirador(void)
Definition Aspirador.cpp:6
int aspirador
Definition Aspirador.h:20
void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
Definition Aspirador.cpp:31
bool SolucaoCompleta(void)
Verifica se o estado actual é objectivo (é uma solução completa)
Definition Aspirador.cpp:80
bool Distinto(TNo estado)
Verifica se o estado actual distinto do fornecido.
Definition Aspirador.cpp:88
~CAspirador(void)
Definition Aspirador.cpp:9
void Debug(bool completo=true) override
Mostra o estado no ecrã, para debug.
Definition Aspirador.cpp:67
TVector< char > salas
Definition Aspirador.h:19
void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
Definition Aspirador.cpp:37
void Codifica(TBits &estado)
Codifica o estado para um vetor de inteiros de 64 bits.
int Heuristica(void)
Função para calcular quanto falta para o final, o valor da heurística.
Definition Aspirador.cpp:95
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Aspirador.cpp:22
void SetBits(uint64_t value, int bitIndex, int bitCount)
Definition TVector.h:1385
void SetBit(int index, bool value)
Definition TVector.h:1368
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 int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:575
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
Definition TProcura.h:22
bool Equal(const TVector< Item > &v) const
Verifica se dois vetores-conjunto são iguais.
Definition TVector.h:946
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.
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