31 static const char* nomesAlgoritmos[] = {
"MiniMax",
"MiniMax alfa/beta" };
36 parametro[
ALGORITMO] = {
"ALGORITMO",2,1,2,
"Seleção do algoritmo de procura adversa base.", nomesAlgoritmos };
46 {
"ORDENAR_SUCESSORES", 2, 0, 2,
"0 não ordena sucessores, 1 ordena por heurÃstica, 2 usa o melhor valor de procuras anteriores." },
47 {
"PODA_HEURISTICA",0,0,1000,
"0 não existe poda, caso contrário é o número máximo de sucessores a considerar (tem de se ordenar sucessores)." },
48 {
"PODA_CEGA",0,0,10000,
"Igual a PodaHeuristica, mas é efetuado de forma aleátoria, sem calcular a heurÃstica. Utilizar um valor sempre maior que Poda. " }
61 if (nivel == 1 ||
Parar()) {
73 if (sucessores.
Empty())
81 for (
int i = 0; i < sucessores.
Count(); i++) {
87 valorConhecido.
nivel >= nivel)
89 valor = valorConhecido.
valor;
94 valorConhecido = { valor, nivel,
EXATO };
192 if (!
Parar() || nivel == 0) {
229 for (
int i =
qMin.Count() - 1,
peso = 1;
i >= 0;
i--) {
237 for (
int i =
qMax.Count() - 1,
peso = 1;
i >= 0;
i--) {
281 if (nivel == 1 ||
Parar()) {
314 else if (valor >=
beta)
346 return valor.
nivel >= nivel &&
451 (
njogada % 2 == 0 ?
"Brancas" :
"Pretas"),
497 const unsigned char bom[] = { 0xEF,0xBB,0xBF };
505 printf(
"\nErro ao gravar ficheiro %s.",
str);
519 fprintf(
f,
"Jogador;Adversário;Cor;Resultado\n");
554 printf(
" HT: reutilização %.2f vezes ",
taxa);
constexpr int BUFFER_SIZE
@ 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
@ 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).
@ 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.
@ ESTADOS_REPETIDOS
Forma de lidar com estados repetidos (ignorá-los, ascendentes, gerados).
@ IGNORADOS
ignorados os estados gerados repetidos
@ GERADOS
estados são comparados com todos os gerados, e se forem repetidos são removidos
constexpr int TAMANHO_HASHTABLE
@ PASSOS
Exibe passos intermediários.
@ ATIVIDADE
Apenas eventos principais.
@ NADA
Sem informações de debug.
@ CONT_ALGORITMO
Tempo da execução do algoritmo por instância.
@ ALGORITMO
Algoritmo base a executar.
@ SEMENTE
Semente aleatória para inicializar a sequência de números pseudo-aleatórios.
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
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 OrdenarSucessores(TVector< TNo > &sucessores, TVector< int > &id, int nivel)
void TesteEmpirico(TVector< int > instancias, bool mostrarSolucoes=true, char *ficheiro=NULL)
int MiniMax(int nivel=4)
retorna o valor do estado actual, apos procura de profundidade nivel
void RelatorioCSV(TVector< TVector< int > > &torneio, FILE *f)
Gera um relatório CSV com os resultados.
int MaiorAmeaca(TVector< int > &qMin, TVector< int > &qMax, int maxAmeaca) const
Utilitário para calculo de uma heurÃstica standard em jogos simples.
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
bool CorteAlfaBeta(int valor, int &alfa, int &beta)
verifica se há um corte alfa/beta, atualizando alfa e beta
bool ValorEstado(TValorEstado &valor, int operacao)
ler ou gravar o melhor valor conhecido
bool ExisteHeuritica(void)
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
static int infinito
valor de infinito (vitoria/derrota), omissao 1000
static int nivelOK
profundidade máxima no método iterativo
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]
int ExecutaAlgoritmo()
Executa o algoritmo com os parametros atuais.
Representa um estado no espaço de estados.
void DebugCorte(int sucessores=-1, bool duplo=false)
static uint64_t elementosHT[TAMANHO_HASHTABLE][OBJETO_HASHTABLE]
void CalcularHeuristicas(TVector< TNo > &sucessores, TVector< int > *id=NULL, bool sortLB=false)
void NovaLinha(bool tudo=true)
static void LibertarVector(TVector< TNo > &vector, int excepto=-1, int maiorQue=-1)
virtual void SubstituirHT(int indice)
void DebugExpansao(int sucessor, int sucessores, bool duplo=false)
void LimparEstatisticas() override
Chapar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo para...
void DebugIteracao(int iteracao)
static uint64_t estadoCodHT[OBJETO_HASHTABLE]
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 TVector< TVector< int > > configuracoes
Conjuntos de configurações para teste empírico.
static int resultado
Resultado retornado pelo algoritmo na última execução.
void MostrarTorneio(TVector< TVector< int > > &torneio, bool jogo=false)
Mostra os resultados do torneio.
void MostrarConfiguracoes(int detalhe, int atual=-1)
Mostra as configurações disponíveis.
virtual bool Parar(void)
Verifica se a procura deve ser interrompida.
void ConfiguracaoAtual(TVector< int > ¶metros, int operacao)
Grava ou lê a configuração atual.
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
static double Cronometro(enum ECronometro id=CONT_ALGORITMO, bool inicialiar=false)
retorna o tempo em segundos desde que o cronómetro foi inicializado
static double tempo
tempo consumido na última execução.
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 int Heuristica(void)
Função para calcular quanto falta para o final, o valor da heurÃstica.
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.
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 TVector< unsigned char > ramo
static TNo solucao
Estado objetivo encontrado, retornado pela procura (deve ser libertado).
unsigned int rand(int seq)
Retorna o próximo valor pseudo-aleatório.
void srand(unsigned int seed, int seq)
Inicializa a semente da geração pseudo-aleatória.
int valor
valor do parametro
int max
valor máximo que o parametro pode tomar
registo do valor de um estado, em procuras anteriores