43 "Profundidade Primeiro",
51 {
"VER_ACOES", 4, 1, 100,
"Mostra estado a cada K ações. Se 1 mostra sempre estados e nunca ações." },
52 {
"LIMITE",0,-1,1000000,
53"Valor dependente do algoritmo. \n\
54Largura: 0 sem limite, >0 número máximo de estados gerados não expandidos. \n\
55Profundidade: >0 limite de profundidade, =0 iterativo, <0 sem limite." },
56 {
"ESTADOS_REPETIDOS", 1,1,3,
"Forma de lidar com os estados repetidos (ignorá-los, ascendentes, gerados).", {
60 {
"PESO_ASTAR", 100, 0, 10000,
61 "Peso aplicado à heuristica, na soma com o custo para calculo do lower bound. No A*, se peso 0, fica custo uniforme, h(n) não conta, se peso 100 fica A* normal, se superior a 100 aproxima-se do melhor primeiro.",
63 {
"RUIDO_HEURISTICA",0,-100,100,
"Ruído a adicionar à heurística, para testes de robustez. Se K positivo, adicionar entre 0 e K-1, se negativo, o valor a adicionar pode ser positivo ou negativo.",
65 {
"BARALHAR_SUCESSORES",0,0,1,
"Baralhar os sucessores ao expandir." }
73 {
"IND_EXPANSOES",
"número de expansões efetuadas",
IND_EXPANSOES },
74 {
"IND_GERACOES",
"número de estados gerados",
IND_GERACOES },
75 {
"IND_LOWER_BOUND",
"valor mínimo para a melhor solução, se igual ao custo da solução obtida, então esta é ótima",
IND_LOWER_BOUND }
166 if (
Debug(
PASSOS,
false,
"\n │ Ação inválida: %s (custo atual: %d de %d ações válidas)",
179 if (
Debug(
PASSOS,
false,
"\n │ Solução não completa (custo atual: %d de %d ações válidas)",
213 if (
lista.Last()->SolucaoCompleta()) {
293 if (
lista.Estado()->SolucaoCompleta())
351 DebugFolha(
false,
"%-2s%-2s", Icon(EIcon::FOLHA), Icon(EIcon::LIMITE));
366 DebugFolha(
false,
"%-2s%d → %-2s", Icon(EIcon::SUCESSO),
custo, Icon(EIcon::UB));
399 printf(
"\n══ %-2s Solução ══", Icon(EIcon::SOL));
400 for (
int i = 0;
i <
caminho.Count() - 1;
i++) {
406 printf(
" (%-2sg:%d) %-2s", Icon(EIcon::VALOR),
caminho[
i]->
custo, Icon(EIcon::ACCAO));
414 printf(
" (%-2sg:%d) %-2s", Icon(EIcon::VALOR),
caminho[
i]->
custo, Icon(EIcon::ACCAO));
418 printf(
"Caminho vazio.");
422 printf(
" (%-2sg:%d) ", Icon(EIcon::VALOR),
caminho.Last()->custo);
423 if (
caminho.Last()->SolucaoCompleta())
424 printf(
"%-2s", Icon(EIcon::SUCESSO));
426 printf(
"%-2s", Icon(EIcon::INSUC));
451 for (
int i = 0;
i <
id.Count();
i++) {
460 DebugFolha(
false,
"%-2s&-2s", Icon(EIcon::FOLHA), Icon(EIcon::LIMITE));
498 for (
int i = 0;
i <
id.Count();
i++) {
508 DebugFolha(
false,
"%-2s%d → %-2s", Icon(EIcon::FOLHA), atual, Icon(EIcon::LB));
549 for (
int i = 0;
i <
id.Count();
i++) {
555 DebugFolha(
true,
"%-2s%-2s", Icon(EIcon::FOLHA), Icon(EIcon::UB));
559 for (
int j =
i;
j <
id.Count();
j++)
601 if (
lista.Estado()->SolucaoCompleta())
660 printf(
"%-2s%-2s %d ", Icon(EIcon::CORTE), Icon(EIcon::ID),
debugID);
669 printf(
" %-2s Solução encontrada! %-2sg:%d",
670 Icon(EIcon::SUCESSO), Icon(EIcon::VALOR),
custo);
699 printf(
" %-2s%s", Icon(EIcon::ACCAO), *
pai->
Acao(
this));
711 printf(
"%s",
ramo[
i]);
734 int atual =
lista->atual;
739 lista->atual = atual;
791 Debug(
PASSOS,
false,
"\n ├─────────── %-2s%s %d %-2s%s ──────────── ",
804 printf(
"%-2s%d ", Icon(EIcon::ID),
debugID);
806 printf(
"%-2sg:%d ", Icon(EIcon::VALOR),
custo);
808 printf(
"%-2sh:%d ", Icon(EIcon::SUCESSO),
heuristica);
811 printf(
"%-2s ", Icon(EIcon::IND));
897 printf(
"\n%-2sSucessor [1-%d, ação(ões), exe]: ", Icon(EIcon::EXP),
sucessores.Count());
930 for (
int i = 0;
i <
acoes.Count();
i++) {
939 if (
i <
acoes.Count() - 1) {
959 }
while (
opcao != 0);
979 printf(
"HT: utilização %d%%, reuso: %.2f vezes",
constexpr int BUFFER_SIZE
@ 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.
@ RUIDO_HEURISTICA
Ruído a adicionar à heurística para testes de robustez.
@ ESTADOS_REPETIDOS
Forma de lidar com estados repetidos (ignorá-los, ascendentes, gerados).
@ 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
@ 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
@ PROFUNDIDADE_PRIMEIRO
Executa a procura em profundidade 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
constexpr int RES_NAO_RESOLVIDO
@ PASSOS
Exibe passos intermediários.
@ ATIVIDADE
Apenas eventos principais.
@ COMPLETO
Mostra toda a execução detalhadamente.
@ NADA
Sem informações de debug.
@ DETALHE
Debug detalhada sobre estados e decisões.
constexpr int RES_IMPOSSIVEL
@ CONT_ALGORITMO
Tempo da execução do algoritmo por instância.
@ ALGORITMO
Algoritmo base a executar.
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
TVector< int > _TV(const char *str)
Lista ordenada de nós para algoritmos de procura informada.
unsigned int Hash() const
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)
TProcuraConstrutiva(void)
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)
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]
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
static void MostraCaixa(TVector< TString > titulo, ECaixaParte parte, TVector< int > largura, bool aberta=true, int identacao=0)
virtual void Debug(bool completo=true)
Mostra o estado no ecrã, para debug.
int Parametro(int id) const
static int Dominio(int &variavel, int min=INT_MIN, int max=INT_MAX)
Limita o domínio de um parâmetro inteiro.
static int resultado
Resultado retornado pelo algoritmo na última execução.
virtual int64_t Indicador(int id)
Retorna um indicador, após a execução do algoritmo.
static TString NovoTexto(TString prompt)
static int iteracoes
Número total de iterações realizadas na última execução.
virtual void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
virtual bool Parar(void)
Verifica se a procura deve ser interrompida.
static TString MostraTempo(double segundos)
Mostra tempo num formato humano.
virtual void ExecucaoTerminada()
Chamar após a execução do algoritmo. Grava o tempo consumido.
static void Mensagem(TString titulo, const char *fmt,...)
static TVector< TIndicador > indicador
Indicadores que podem ser calculados após a execução, quer com informação da instãncia,...
static TVector< int > indAtivo
static double Cronometro(enum ECronometro id=CONT_ALGORITMO, bool inicializar=false)
retorna o tempo em segundos desde que o cronómetro foi inicializado
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
virtual void LimparEstatisticas()
Chamar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo ...
static double tempo
tempo consumido na última execução.
static void MostraConjunto(TVector< int > valores, const char *etiqueta)
TVector< Item > & Sort(TVector< int > *idxvect=nullptr)
Ordena todo o vetor, opcionalmente devolvendo índices ordenados.
TVector< Item > & Add(Item a)
TVector< Item > & Push(Item a)
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.
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 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.
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
unsigned int rand(int seq)
Retorna o próximo valor pseudo-aleatório.