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#include "../TVector.h"
4#include "../TProcura.h"
5
6// número de elementos na hashtable com perdas
7constexpr int TAMANHO_HASHTABLE = 1000000;
8
10class CListaNo;
11
18
26
54
55
73
74
89
90
111{
112public:
114 virtual ~TProcuraConstrutiva(void) {}
115
126 int custo = 1;
128 int heuristica = 0;
130 int debugID = 0;
131
// Fim do grupo VariaveisEstado
133
134
168 virtual TNo Duplicar(void) = 0;
169
196 virtual void Copiar(TNo objecto) {}
197
241 void Inicializar(void) override { TProcura::Inicializar(); custo = 0; ramo = {}; }
242
280 virtual void Sucessores(TVector<TNo>& sucessores);
281
304 virtual bool SolucaoCompleta(void) { return false; }
305
306
307 virtual bool Validar(TVector<TString> solucao);
308
312 void ResetParametros() override;
313
// Fim do grupo RedefinicaoMandatoria
315
352 virtual TString Acao(TNo sucessor) { return "ação inválida"; }
353
393 virtual void Codifica(TBits &estado);
394
433 virtual int Heuristica(void);
434
435
// Fim do grupo RedefinicaoSugerida
437
456 virtual bool Acao(TString acao);
457
458
459
478 virtual bool Distinto(TNo estado) { return true; }
479
510
513
525 int ExecutaAlgoritmo();
526
530 int64_t Indicador(int id) override;
531
532
// Fim do grupo RedefinicaoOpcional
534
535
560 int LarguraPrimeiro(int limite = 0);
561
562
576 int CustoUniforme(int limite = 0);
577
591 int ProfundidadePrimeiro(int nivel = 0);
592
// Fim do grupo ProcurasCegas
594
614 int MelhorPrimeiro(int nivel = 0);
615
637 int AStar(int limite = 0);
638
656 int IDAStar(int upperBound = 0);
657
675 int BranchAndBound(int upperBound = 0);
676
// Fim do grupo ProcurasInformadas
678
689 static TNo solucao;
691 static int lowerBound;
693 static int expansoes;
695 static int geracoes;
697 static int custoAcao;
698
702 static constexpr const char* RAMO_ESTADO = " ├■";
703 static constexpr const char* RAMO_ESTADO2 = " ├□";
704 static constexpr const char* RAMO_ESTADO_FIM = " └■";
705 static constexpr const char* RAMO_ESTADO2_FIM = " └□";
706 static constexpr const char* RAMO_NOVO = " ├─";
707 static constexpr const char* RAMO_FIM = " └─";
708 static constexpr const char* RAMO_CONTINUA = " │ ";
709 static constexpr const char* RAMO_VAZIO = " ";
710
// Fim do grupo VariaveisGlobais
712
713 void LimparEstatisticas() override;
714 void ExecucaoTerminada() override;
715
716 int LowerBound() { return custo + Parametro(PESO_ASTAR) * heuristica / 100; } // f(n) = g(n) + W h(n)
717 static void LibertarVector(TVector<TNo>& vector, int excepto = -1, int maiorQue = -1);
718
719 // Chamar sempre que se quer uma nova linha com a árvore em baixo
720 void NovaLinha(bool tudo = true);
721
722
723protected:
724
725 // Métodos para visualizar a procura
726
727 // Método para ser chamado antes de analisar cada sucessor
728 void DebugExpansao(int sucessor, int sucessores, bool minimizar = true);
729 // Método para ser chamado quando não há sucessores ou há um corte de profundidade
730 void DebugCorte(int sucessores = -1, bool duplo = false);
731 // Encontrou uma solução
732 void DebugSolucao(bool continuar = false);
733 // Informação de debug na chamada ao método recursivo
734 void DebugChamada(bool noFolha);
735 // Passo no algoritmo em largura
736 void DebugPasso(CListaNo* lista = NULL);
737 // Mostrar sucessores
739 // uma nova iteração de um algoritmo iterativo
740 void DebugIteracao(int iteracao, const char* simbolo);
741 // informação geral sobre o estado
742 void DebugEstado(bool novaLinha = true) const;
743 void DebugRamo(const char* ramo, const char* folha);
744 void DebugFolha(bool fimLinha, const char* fmt, ...) {
746 if (fimLinha)
747 ramo.Last() = " └─";
748 NovaLinha();
749 }
750 else
751 Debug(PASSOS, false, " ─── ");
752 if (Parametro(NIVEL_DEBUG) >= PASSOS) {
754 va_start(args, fmt);
755 vprintf(fmt, args);
756 va_end(args);
757 }
758 }
759
760 // metodos internos
762 int ObjetivoAlcancado(TNo estado, bool completa = true);
763 int SolucaoEncontrada(bool continuar = false);
764 void CalculaCaminho(bool completa = true); // coloca o caminho desde o estado objetivo
765 void VerificaLimites(int limite, int porProcessar, TVector<TNo>& sucessores);
767 int SolucaoParcial(int i, TVector<TNo>& sucessores, int iAux = -1, TVector<int>* id = NULL);
768 void Explorar();
769 void MostrarCaminho();
770
771 // variáveis da hashtable com perdas, se existir uma colisão, substitui
772 static TBits elementosHT[TAMANHO_HASHTABLE]; // hashtable
773 static int custoHT[TAMANHO_HASHTABLE]; // hashtable / custo do estado que foi gerado
774 static TBits estadoCodHT; // elemento codificado
775 static int colocadosHT; // número de elementos colocados na HT
776 unsigned int Hash(); // retorna um valor hash do estado atual, após codificado
777 void LimparHT();
778 // caso o estado não exista, retorna falso e insere para que não seja gerado novamente
779 // caso exista um elemento, mas gerado com um custo mais alto, considerar que não existe ainda
780 // se existe retorna true
781 bool ExisteHT();
782 virtual void SubstituirHT(int indice);
783};
784
EParametrosConstrutiva
Identifica um parâmetro específico no código.
@ PARAMETROS_CONSTRUTIVA
Marcador para permitir a extensão do enum em subclasses.
@ VER_ACOES
Mostra estado a cada K ações. Se 1, mostra sempre estados e nunca ações.
@ LIMITE
Valor dependente do algoritmo. Exemplo: Profundidade limitada.
@ BARALHAR_SUCESSORES
Baralhar os sucessores ao expandir.
@ PESO_ASTAR
Peso aplicado à heuristica, na soma com o custo para calculo do lower bound.
@ RUIDO_HEURISTICA
Ruído a adicionar à heurística para testes de robustez.
@ ESTADOS_REPETIDOS
Forma de lidar com estados repetidos (ignorá-los, ascendentes, gerados).
EIndicadoresConstrutiva
@ IND_GERACOES
número de estados gerados durante a procura
@ IND_CUSTO
o resultado é o custo da solução atual, sendo um upper bound
@ IND_EXPANSOES
número de expansões efetuadas durante a procura
@ IND_LOWER_BOUND
valor mínimo para a melhor solução, se igual ao custo da solução obtida, então esta é ótima
@ IND_CONSTRUTIVA
Marcador para permitir a extensão do enum em subclasses.
TProcuraConstrutiva * TNo
Representa um nó na árvore de busca, apontando para um estado.
EEstadosRepetidos
Enumerado com os valores possíveis do parâmetro estadosRepetidos.
@ IGNORADOS
ignorados os estados gerados repetidos
@ 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
EAlgoritmo
Algoritmos disponíveis para procura construtiva.
@ A_STAR
Executa a procura A*, algoritmo informado.
@ CUSTO_UNIFORME
Executa a procura por custo uniforme, algoritmo cego.
@ PROFUNDIDADE_PRIMEIRO
Executa a procura em profundidade primeiro, algoritmo cego.
@ LARGURA_PRIMEIRO
Executa a procura em largura primeiro, algoritmo cego.
@ MELHOR_PRIMEIRO
Executa a procura melhor primeiro, algoritmo informado.
@ IDA_STAR
Executa a procura IDA*, algoritmo informado.
@ BRANCH_AND_BOUND
Executa o algoritmo Branch-and-Bound, um algoritmo informado.
constexpr int TAMANHO_HASHTABLE
@ IND_PROCURA
Marcador para permitir a extensão do enum em subclasses.
Definition TProcura.h:48
@ IND_RESULTADO
resultado do algoritmo (>=0 custo da solução, -1 impossível, -2 não resolvido)
Definition TProcura.h:45
@ PASSOS
Exibe passos intermediários.
Definition TProcura.h:93
@ COMPLETO
Mostra toda a execução detalhadamente.
Definition TProcura.h:95
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
Definition TProcura.h:71
@ PARAMETROS_PROCURA
Marcador para permitir a extensão do enum em subclasses.
Definition TProcura.h:75
Lista ordenada de nós para algoritmos de procura informada.
Definition CListaNo.h:21
Representa um estado no espaço de estados.
void DebugCorte(int sucessores=-1, bool duplo=false)
void DebugEstado(bool novaLinha=true) const
void DebugSucessores(TVector< TNo > &sucessores)
void DebugFolha(bool fimLinha, const char *fmt,...)
int SolucaoEncontrada(bool continuar=false)
static TBits elementosHT[TAMANHO_HASHTABLE]
void DebugSolucao(bool continuar=false)
void ExecucaoTerminada() override
Chamar após a execução do algoritmo. Grava o tempo consumido.
void DebugRamo(const char *ramo, const char *folha)
int SolucaoParcial(int i, TVector< TNo > &sucessores, int iAux=-1, TVector< int > *id=NULL)
void CalcularHeuristicas(TVector< TNo > &sucessores, TVector< int > *id=NULL, bool sortLB=false)
void NovaLinha(bool tudo=true)
int ObjetivoAlcancado(int item, TVector< TNo > &lista)
static void LibertarVector(TVector< TNo > &vector, int excepto=-1, int maiorQue=-1)
void DebugPasso(CListaNo *lista=NULL)
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 CalculaCaminho(bool completa=true)
void DebugExpansao(int sucessor, int sucessores, bool minimizar=true)
void DebugChamada(bool noFolha)
void DebugIteracao(int iteracao, const char *simbolo)
void LimparEstatisticas() override
Chamar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo ...
void VerificaLimites(int limite, int porProcessar, TVector< TNo > &sucessores)
static int custoHT[TAMANHO_HASHTABLE]
Classe base para todas as procuras.
Definition TProcura.h:218
virtual void Debug(bool completo=true)
Mostra o estado no ecrã, para debug.
Definition TProcura.cpp:86
int Parametro(int id) const
Definition TProcura.h:607
virtual void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition TProcura.h:248
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:575
Item & Last()
Definition TVector.h:227
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 bool Validar(TVector< TString > solucao)
Verifica a validade de uma solução para a instância atual.
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.
int64_t Indicador(int id) override
Redefinição. Ver TProcura::Indicador().
TVector< TString > Solucao()
retorna uma solução no formato do TResultado, para ser gravada em ficheiro de soluções,...
int ExecutaAlgoritmo()
Executa o algoritmo com os parâmetros atuais.
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.
virtual TString 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.
int debugID
ID do estado, para efeitos de debug.
static constexpr const char * RAMO_ESTADO
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 constexpr const char * RAMO_NOVO
static constexpr const char * RAMO_ESTADO_FIM
static int geracoes
Número de estados gerados.
static TVector< TNo > caminho
Solução retornada pela procura (os estados devem ser libertados).
static constexpr const char * RAMO_ESTADO2
static TVector< const char * > ramo
static int custoAcao
custo da última ação realizada (Acao(TString))
static constexpr const char * RAMO_FIM
static TNo solucao
Estado objetivo encontrado, retornado pela procura (deve ser libertado).
static constexpr const char * RAMO_CONTINUA
static constexpr const char * RAMO_VAZIO
static constexpr const char * RAMO_ESTADO2_FIM