TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
TProcuraAdversa.h
Go to the documentation of this file.
1#pragma once
2#include "../Construtiva/TProcuraConstrutiva.h"
3
21
30
34typedef struct SValorEstado {
35 int valor;
36 int nivel; // 0 - valor heurístico, -1 - inválido
39
43typedef struct SResultadoJogo {
44 int instancia = 0; // no caso no jogo ter instâncias
45 int brancas = 0; // configuração a jogar de brancas
46 int pretas = 0; // configuração a jogar de pretas
47 int resultado = 0; // -1 derrota, 0 empate, 1 vitória
48 int nJogadas = 0; // número de jogadas efetuadas
49 double tempoBrancas = 0.0; // tempo total de jogo das brancas
50 double tempoPretas = 0.0; // tempo total de jogo das pretas
51 TString jogo = ""; // todos os lances do jogo
53
54
63{
64public:
65 TProcuraAdversa(void);
66 ~TProcuraAdversa(void);
67
71 static int infinito;
73 static bool completo;
75 static int nivelOK;
78
79
81 void ResetParametros();
82
83 // Retorna verdade caso o estado actual seja um estado objectivo, ou seja, jogo final (atualizar resultadoCompleto)
84 bool SolucaoCompleta(void) = 0;
85
87 int MiniMax(int nivel = 4);
88
90 int MiniMaxAlfaBeta(int nivel = 4, int alfa = -infinito, int beta = +infinito);
91
92 // Utilizar para executar testes empíricos
93 // Utiliza as configurações existentes, ou parâmetros atuais
94 // Efetua um torneio entre configurações
100
102 bool Validar(TVector<TString> solucao) override;
103 TString Jogar(TString jogo, int configID);
106 void JogoTerminado(TString &jogo);
107
109 int ExecutaAlgoritmo();
110
112 int Heuristica(void);
113
114 // @brief chamar em CSubProblema::Heuristica() para verificar se a heurística já existe, ou precisa de ser calculada
115 bool ExisteHeuritica(void);
116
118
119
128
129protected:
131 int NoFolha(bool nivel);
132
134 bool CorteAlfaBeta(int valor, int& alfa, int& beta);
135
137 int MetodoIterativo(int alfaBeta);
138
140 int Pontos(int resultado) { return resultado < 0 ? -1 : (resultado > 0 ? 1 : 0); }
141
150 int inst, int brancas, int pretas, TVector<TVector<int>>* torneio = NULL);
151
158
160
161 // hashtable
162 void SubstituirHT(int indice); // necessário redefinir para invalidar valorHT
163 bool ExisteHT(); // necessário redefinir par não remover estados (reutilizar o valor)
164 static TValorEstado valorHT[TAMANHO_HASHTABLE]; // hashtable / valor e nível obtido
165 // índice obtido na HT, se positivo
168 bool ValorEstado(TValorEstado& valor, int operacao);
170 bool Utilizavel(TValorEstado& valor, int nivel, int alfa, int beta);
171
172 static int reutilizadoAvaliacao; // número de vezes que uma avaliação é reutilizada
173
174 void DebugChamada(bool noFolha, int alfa = 0, int beta = 0);
175
176};
struct SResultadoJogo TResultadoJogo
registo do valor de um estado, em procuras anteriores
EParametrosAdversa
Identifica um parâmetro específico no código.
@ PARAMETROS_ADVERSA
marcador para permitir a extensão do enum em subclasses.
@ HEUR_BASE
valor base para diferença entre ameaças de K e K-1 (100 não há diferença, 200 é o valor por omissão)
@ PODA_HEURISTICA
permite cortar sucessores, mas calcula a heurística a todos, de modo a mantendo os melhores
@ ORDENAR_SUCESSORES
opção de ordenar sucessores por heurística, ou por último valor registado
@ PODA_CEGA
corta os sucessores, mesmo sem calcular a heurística, por ordem aleatória
struct SValorEstado TValorEstado
registo do valor de um estado, em procuras anteriores
ETipoValor
tipo de valor resultante do minimax com cortes alfa/beta
@ EXATO
o valor foi calculado sem cortes, ou seja, não sofreu influência de alfa ou beta;
@ LOWER_BOUND
o valor foi afetado por um corte de beta (ou seja, ele é pelo menos esse valor, mas pode ser maior);
@ UPPER_BOUND
o valor foi afetado por um corte de alfa (ou seja, ele é no máximo esse valor, mas pode ser menor).
@ PARAMETROS_CONSTRUTIVA
Marcador para permitir a extensão do enum em subclasses.
constexpr int TAMANHO_HASHTABLE
Representa um estado no espaço de estados.
int NoFolha(bool nivel)
fim da procura, por corte de nível (ou não haver sucessores), retornar heurística
void PontuacaoJogos(TVector< TString > &jogos)
bool Validar(TVector< TString > solucao) override
Verifica a validade de uma solução para a instância atual.
bool SolucaoCompleta(void)=0
Verifica se o estado actual é objectivo (é uma solução completa)
int Pontos(int resultado)
converte -infinito, 0, +infinito em -1 (vitória preta), 1 (vitória branca), 0 empate
void OrdenarSucessores(TVector< TNo > &sucessores, TVector< int > &id, int nivel)
void TesteValidacao(TVector< int > instancias, TVector< int > impossiveis, TVector< int > referencias, TString fichSolucoes, TString fichResultados="") override
Executa testes de validação, executando cada solução na instância respetiva, e verificando a sua vali...
void TesteEmpiricoTrabalhador(TVector< int > instancias, TString ficheiro="") override
Teste empírico com modo mestre-escravo (este é o escravo)
int MiniMax(int nivel=4)
retorna o valor do estado actual, apos procura de profundidade nivel
int MaiorAmeaca(TVector< int > &qMin, TVector< int > &qMax, int maxAmeaca) const
Utilitário para calculo de uma heurística standard em jogos simples.
void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
static bool completo
controlo para indicar se a procura foi realizada de forma completa (c.c. foi cortada)
bool minimizar
o jogador actual deve minimizar o custo (ou maximizar caso tenha o valor falso)
int Heuristica(void)
chamar após calcular a heurística (grava o valor, dependendo da parametrização)
int MetodoIterativo(int alfaBeta)
iteração, aumentando o nível progressivamente
void TesteEmpirico(TVector< int > instancias, TString ficheiro="") override
Executa testes empíricos, em todas as configurações guardadas, nas instâncias selecionadas.
bool CorteAlfaBeta(int valor, int &alfa, int &beta)
verifica se há um corte alfa/beta, atualizando alfa e beta
bool RelatorioCSV(TVector< TResultadoJogo > &resultados, TString ficheiro)
Gera um relatório CSV com os resultados.
void JogoTerminado(TString &jogo)
bool ValorEstado(TValorEstado &valor, int operacao)
ler ou gravar o melhor valor conhecido
bool ExisteHeuritica(void)
void ExecutaTarefa(TVector< TResultadoJogo > &resultados, int inst, int brancas, int pretas, TVector< TVector< int > > *torneio=NULL)
Executa uma tarefa num teste empírico.
void ResetParametros()
Método para inicializar os parâmetros (redefinir se forem adicionados parâmetros específicos)
void SubstituirHT(int indice)
static int reutilizadoAvaliacao
bool Utilizavel(TValorEstado &valor, int nivel, int alfa, int beta)
ver se o valor obtido é utilizável no contexto atual
void TesteEmpiricoGestor(TVector< int > instancias, TString ficheiro="") override
Teste empírico com modo mestre-escravo (este é o mestre)
static int infinito
valor de infinito (vitoria/derrota), omissao 1000
TString Jogar(TString jogo, int configID)
static int nivelOK
profundidade máxima no método iterativo
void DebugChamada(bool noFolha, int alfa=0, int beta=0)
int MiniMaxAlfaBeta(int nivel=4, int alfa=-infinito, int beta=+infinito)
retorna o valor do estado actual, apos procura de profundidade nivel. Idêntico a MiniMax
static TValorEstado valorHT[TAMANHO_HASHTABLE]
static int resultadoCompleto
resultado após SolucaoCompleta() retornar true (-1 vitória minimizar, 0 empate, 1 vitória maximizar)
bool CoerenciaJogo(TVector< TString > &jogos, TVector< TString > &anterior)
int ExecutaAlgoritmo()
Executa o algoritmo com os parametros atuais.
Representa um estado no espaço de estados.
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:575
static TNo solucao
Estado objetivo encontrado, retornado pela procura (deve ser libertado).
registo do valor de um estado, em procuras anteriores
registo do valor de um estado, em procuras anteriores
ETipoValor tipo