TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
TProcuraConstrutiva.h
Go to the documentation of this file.
1#pragma once
2
3#define _CRT_SECURE_NO_WARNINGS
4
5#include "../TVector.h"
6#include "../TProcura.h"
7
8// número de elementos na hashtable com perdas
9#define TAMANHO_HASHTABLE 1000000
10// tamanho máximo de um objecto, em unidades de 64 bits
11#define OBJETO_HASHTABLE 5
12
14
21
29
57
58
76
77
92
93
114{
115public:
117 virtual ~TProcuraConstrutiva(void) {}
118
129 int custo;
132
// Fim do grupo VariaveisEstado
134
135
169 virtual TNo Duplicar(void) = 0;
170
197 virtual void Copiar(TNo objecto) { }
198
242 void Inicializar(void) override { TProcura::Inicializar(); custo = 0; }
243
281 virtual void Sucessores(TVector<TNo>& sucessores);
282
305 virtual bool SolucaoCompleta(void) { return false; }
306
310 void ResetParametros() override;
311
// Fim do grupo RedefinicaoMandatoria
313
350 virtual const char* Acao(TNo sucessor) { return "ação inválida"; }
351
391 virtual void Codifica(uint64_t estado[OBJETO_HASHTABLE]);
392
431 virtual int Heuristica(void);
432
433
// Fim do grupo RedefinicaoSugerida
435
454 virtual bool Acao(const char* acao);
455
456
457
476 virtual bool Distinto(TNo estado) { return true; }
477
508
520 int ExecutaAlgoritmo();
521
525 int Indicador(int id) override;
526
527
// Fim do grupo RedefinicaoOpcional
529
530
555 int LarguraPrimeiro(int limite = 0);
556
557
571 int CustoUniforme(int limite = 0);
572
586 int ProfundidadePrimeiro(int nivel = 0);
587
// Fim do grupo ProcurasCegas
589
609 int MelhorPrimeiro(int nivel = 0);
610
632 int AStar(int limite = 0);
633
651 int IDAStar(int upperBound = 0);
652
670 int BranchAndBound(int upperBound = 0);
671
// Fim do grupo ProcurasInformadas
673
684 static TNo solucao;
686 static int lowerBound;
690 static int expansoes;
692 static int geracoes;
693
697 static int espacosRamo;
698
// Fim do grupo VariaveisGlobais
700
701 void LimparEstatisticas(clock_t &inicio) override;
702 void ExecucaoTerminada(clock_t inicio) override;
703
704 int LowerBound() { return custo + Parametro(pesoAStar) * heuristica / 100; } // f(n) = g(n) + W h(n)
705 static void LibertarVector(TVector<TNo>& vector, int excepto = -1, int maiorQue = -1);
706
707 // Chamar sempre que se quer uma nova linha com a árvore em baixo
708 void NovaLinha(bool tudo = true);
709
710
711protected:
712
713 // Métodos para visualizar a procura
714
715 // Método para ser chamado antes de analisar cada sucessor
716 void DebugExpansao(int sucessor, int sucessores, bool duplo = false);
717 // Método para ser chamado quando não há sucessores ou há um corte de profundidade
718 void DebugCorte(int sucessores = -1, bool duplo = false);
719 // Encontrou uma solução
720 void DebugSolucao(bool continuar = false);
721 // Informação de debug na chamada ao método recursivo
722 void DebugChamada(void);
723 // Passo no algoritmo em largura
724 void DebugPasso(void);
725 // Mostrar sucessores
727 // uma nova iteração de um algoritmo iterativo
728 void DebugIteracao(int iteracao);
729 // informação geral sobre o estado
730 void DebugEstado(int id = -1, int pai = -1);
731 void DebugRamo(char ramo, char folha);
732
733 // metodos internos
735 int ObjetivoAlcancado(TNo estado, bool completa = true);
736 int SolucaoEncontrada(bool continuar = false);
737 void CalculaCaminho(bool completa = true); // coloca o caminho desde o estado objetivo
741 void Explorar();
742 void MostrarCaminho();
743
744 // variáveis da hashtable com perdas, se existir uma colisão, substitui
746 static int custoHT[TAMANHO_HASHTABLE]; // hashtable / custo do estado que foi gerado
747 static uint64_t estadoCodHT[OBJETO_HASHTABLE]; // elemento codificado
748 static int colocadosHT; // número de elementos colocados na HT
749 unsigned int Hash(); // retorna um valor hash do estado atual, após codificado
750 void LimparHT();
751 // caso o estado não exista, retorna falso e insere para que não seja gerado novamente
752 // caso exista um elemento, mas gerado com um custo mais alto, considerar que não existe ainda
753 // se existe retorna true
754 bool ExisteHT();
755 virtual void SubstituirHT(int indice);
756};
757
EParametrosConstrutiva
Identifica um parâmetro específico no código.
@ limite
Valor dependente do algoritmo. Exemplo: Profundidade limitada.
@ ruidoHeur
Ruído a adicionar à heurística para testes de robustez.
@ pesoAStar
Peso aplicado à heuristica, na soma com o custo para calculo do lower bound.
@ estadosRepetidos
Forma de lidar com estados repetidos (ignorá-los, ascendentes, gerados).
@ verAcoes
Mostra estado a cada K ações. Se 1, mostra sempre estados e nunca ações.
@ parametrosConstrutivas
Marcador para permitir a extensão do enum em subclasses.
@ baralharSuc
Baralhar os sucessores ao expandir.
EIndicadoresConstrutiva
@ indExpansoes
número de expansões efetuadas durante a procura
@ indCusto
o resultado é o custo da solução atual, sendo um upper bound
@ indGeracoes
número de estados gerados durante a procura
@ indConstrutiva
Marcador para permitir a extensão do enum em subclasses.
@ indLowerBound
valor mínimo para a melhor solução, se igual ao custo da solução obtida, então esta é ótima
TProcuraConstrutiva * TNo
Representa um nó na árvore de busca, apontando para um estado.
EEstadosRepetidos
Enumerado com os valores possíveis do parametro estadosRepetidos.
@ ascendentes
estados são comparados com ascendentes, e se forem repetidos são removidos
@ gerados
estados são comparados com todos os gerados, e se forem repetidos são removidos
@ ignorados
ignorados os estados gerados repetidos
EAlgoritmo
Algoritmos disponíveis para procura construtiva.
@ melhorPrimeiro
Executa a procura melhor primeiro, algoritmo informado.
@ custoUniforme
Executa a procura por custo uniforme, algoritmo cego.
@ larguraPrimeiro
Executa a procura em largura primeiro, algoritmo cego.
@ aStar
Executa a procura A*, algoritmo informado.
@ idAStar
Executa a procura IDA*, algoritmo informado.
@ profundidadePrimeiro
Executa a procura em profundidade primeiro, algoritmo cego.
@ branchAndBound
Executa o algoritmo Branch-and-Bound, um algoritmo informado.
#define TAMANHO_HASHTABLE
#define OBJETO_HASHTABLE
@ indResultado
resultado do algoritmo
Definition TProcura.h:17
@ indProcura
Marcador para permitir a extensão do enum em subclasses.
Definition TProcura.h:20
@ parametrosProcura
Marcador para permitir a extensão do enum em subclasses.
Definition TProcura.h:47
Representa um estado no espaço de estados.
void DebugCorte(int sucessores=-1, bool duplo=false)
void DebugSucessores(TVector< TNo > &sucessores)
void DebugRamo(char ramo, char folha)
int SolucaoEncontrada(bool continuar=false)
void DebugEstado(int id=-1, int pai=-1)
void DebugSolucao(bool continuar=false)
void ExecucaoTerminada(clock_t inicio) override
Chamar após a execução do algoritmo. Grava o tempo consumido.
static uint64_t elementosHT[TAMANHO_HASHTABLE][OBJETO_HASHTABLE]
void CalcularHeuristicas(TVector< TNo > &sucessores, TVector< int > *id=NULL, bool sortLB=false)
int SolucaoParcial(int i, TVector< TNo > &sucessores)
void NovaLinha(bool tudo=true)
int ObjetivoAlcancado(int item, TVector< TNo > &lista)
static void LibertarVector(TVector< TNo > &vector, int excepto=-1, int maiorQue=-1)
virtual void SubstituirHT(int indice)
void Explorar()
definir para explorar manualmente os dados (não definido em TProcura, apenas em TProcuraConstrutiva)
virtual ~TProcuraConstrutiva(void)
void LimparEstatisticas(clock_t &inicio) override
Chapar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo para...
void CalculaCaminho(bool completa=true)
void DebugExpansao(int sucessor, int sucessores, bool duplo=false)
void DebugIteracao(int iteracao)
void VerificaLimites(int limite, int porProcessar, TVector< TNo > &sucessores)
static int custoHT[TAMANHO_HASHTABLE]
static uint64_t estadoCodHT[OBJETO_HASHTABLE]
Classe base para todas as procuras.
Definition TProcura.h:152
virtual void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition TProcura.h:182
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:459
int Parametro(int id)
Definition TProcura.h:479
int CustoUniforme(int limite=0)
Executa a procura por custo uniforme, algoritmo cego.
int ProfundidadePrimeiro(int nivel=0)
Executa a procura em profundidade primeiro, algoritmo cego.
int LarguraPrimeiro(int limite=0)
Executa a procura em largura primeiro, algoritmo cego.
int AStar(int limite=0)
Executa a procura A*, algoritmo informado.
int IDAStar(int upperBound=0)
Executa a procura IDA*, algoritmo informado.
int MelhorPrimeiro(int nivel=0)
Executa a procura melhor primeiro, algoritmo informado.
int BranchAndBound(int upperBound=0)
Executa o algoritmo Branch-and-Bound, um algoritmo informado.
virtual void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
virtual bool SolucaoCompleta(void)
Verifica se o estado actual é objectivo (é uma solução completa)
void Inicializar(void) override
Coloca o objecto no estado inicial da procura.
void ResetParametros() override
Redefinição. Ver TProcura::ResetParametros().
virtual void Copiar(TNo objecto)
Fica com uma cópia do objecto.
virtual TNo Duplicar(void)=0
Cria um objecto que é uma cópia deste.
virtual bool Distinto(TNo estado)
Verifica se o estado actual distinto do fornecido.
void MostrarSolucao(void)
Mostrar solução, seja um caminho ou o próprio estado.
int Indicador(int id) override
Redefinição. Ver TProcura::Indicador().
int ExecutaAlgoritmo()
Executa o algoritmo com os parametros atuais.
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.
virtual const char * Acao(TNo sucessor)
Retorna a ação (movimento, passo, jogada, lance, etc.) que gerou o sucessor.
int heuristica
Estimativa para o custo até um estado objetivo, se disponível.
int custo
Custo total acumulado desde o estado inicial.
TNo pai
Ponteiro para o estado pai, na árvore de procura.
static int expansoes
Número de expansões efetuadas.
static int lowerBound
Valor mínimo que a solução pode apresentar, obtido pela procura.
static int tamanhoCodificado
Número de inteiros de 64 bits utilizados para codificar um objeto (≤ OBJETO_HASHTABLE).
static int geracoes
Número de estados gerados.
static TVector< TNo > caminho
Solução retornada pela procura (os estados devem ser libertados).
static TVector< unsigned char > ramo
static TNo solucao
Estado objetivo encontrado, retornado pela procura (deve ser libertado).