Supra chess engine

O primeiro motor de xadrez Português

Introdução

Supra Chess é o primeiro motor de xadrez português. O código fonte é totalmente original, com copyright ©, aberto, escrito em c++ e está disponível para download no final da página. ↓

 Criador e Programador: Pedro Mourão Soares Correia. 


Novidades

Supra 30.0 disponível  para download em baixo na página↓


A maior atualização da história do Supra. Num match de teste contra a versão anterior (Supra 29.1, 10 minutos por jogo, 50 aberturas jogadas com as duas cores),  Supra 30.0 fez +82 =12 -6 em 100 jogos (88%), cerca de +350 Elo. (Teste com 8 núcleos para o Supra 30.0 e 1 núcleo para o Supra 29.1.)


- Pesquisa até 40 níveis de profundidade

O Supra passa a pesquisar até 40 níveis (meios-lances). Com o multiprocessamento e a pesquisa de quiescência chega muito mais fundo no mesmo tempo, e os 40 níveis permitem tirar todo o partido disso.

- Multiprocessamento (Lazy SMP) **

O Supra pode usar até 8 núcleos do processador (opção Threads; por omissão usa 1). Os threads pesquisam em paralelo e partilham a tabela de hash (e, como opção experimental, os valores de alfa à mesma profundidade). No fim, o Supra escolhe o lance do thread que chegou mais fundo, aceitando ciclos incompletos mas descartando o lance cortado pelo tempo, e as profundidades iniciais são distribuídas de forma equilibrada pelos threads. * **

- Avaliação mais rápida **

Avaliação preguiçosa dos dois lados e memória de avaliações: cerca de 13% mais rápido até à mesma profundidade, com exatamente a mesma pesquisa.

- Pesquisa de quiescência **

Nas folhas da árvore, o Supra analisa as sequências de capturas e promoções até a posição acalmar. Assim deixa de avaliar posições a meio de uma troca, o que elimina muitos erros táticos.

- Janela de quiescência adaptativa * **

No meio-jogo, a quiescência usa uma janela alfa-beta, o que a torna muito mais rápida. Nos finais (menos de 1/3 do material), a janela fecha-se e a quiescência passa a ser exata, para máxima precisão nos finais técnicos. (Ideia do autor, implementada com a ajuda de Claude.)

- Mop-up **

Nos finais contra o rei sozinho, o Supra empurra o rei adversário para a borda e aproxima o seu próprio rei. Agora dá mate com torre com facilidade.

- Tabela de hash (transposições) **

As posições já analisadas ficam guardadas e são reaproveitadas, e a tabela é partilhada por todos os threads. É limpa no início de cada jogo novo.

- Personalidades

Nova opção "Personality", com cinco estilos:

custom: mandam as opções individuais (por omissão);

hyper-romantic: ataque total, aceita sacrificar até uma dama;

romantic: jogo ofensivo, aceita sacrificar até uma torre;

dynamic: o estilo clássico do Supra;

positional: jogo sólido e posicional.

Cada personalidade ajusta sete parâmetros de uma vez (agressividade, ataque ao rei, mobilidade, relevância posicional, quociente material e limite de sacrifício). Inspirado nas ideias de Alexander Shashin.

- Novo livro de aberturas romântico **

Livro interno com 350 posições: todas as linhas do livro anterior e gambitos clássicos como o Gambito de Rei (com o Muzio), o Gambito Evans, o Fried Liver, o Contra-Ataque Traxler, o Ataque Marshall, o Gambito Schliemann, o Gambito Letão, o Gambito de Budapeste, o Contra-Gambito Albin, o Alien Gambit, o Martian Gambit e a Variante Portuguesa da Escandinava. O livro pode ser editado: basta colocar o ficheiro supra_livro.txt na pasta do executável (ou escolher outro com a opção "Book file"). Cada lance pode ter um peso, e o Supra escolhe entre várias opções.

- Opções UCI reorganizadas por assunto: sistema, tempo, livro e memória, pesquisa, avaliação e estilo, interface e testes. As opções "OwnBook" e "Hash" passam a usar os nomes padrão do protocolo UCI.

- Correções

Correção de um erro que, em certos jogos, limitava a pesquisa a profundidades baixas. Melhor comunicação com as GUIs.

Ficha Técnica

Tipo: motor UCI, sem interface gráfica própria. Liga-se a programas de xadrez como o Fritz, o ChessBase, o Arena, o Hiarcs ou o Cute Chess.

Linguagem: C++

Tamanho: Supra 1.0: cerca de 15 000 linhas de código (executável com cerca de 1,5 MB). Supra 30.0: cerca de 539 000 linhas de código (executável com cerca de 12 MB).

Profundidade: até 40 níveis (meios-lances)

Processadores: até 8 núcleos (Lazy SMP)

Criador: Pedro Mourão Soares Correia

Ano de criação: 2010 (Supra 1.0)


 

Algoritmos usados:  

Algoritmo Principal:

  • Algoritmo base * (equivalente a minimax): Algoritmo recursivo que para cada nó, encontra o filho mais forte (min ou max) de acordo com a perspetiva do lado a ser jogado. Este algoritmo Base foi desenhado por mim em 2011 na Versão Supra 2.0. Mais tarde percebi que já havia sido descoberto muito antes!


Algoritmos relacionados ao algoritmo base: 

  • Algoritmo alfa beta: quando Supra analisa os filhos de um determinado nó, ele interrompe a pesquisa sempre que beta <= alfa, pois mesmo que beta ainda possa diminuir mais, não importa, porque não será relevante para crescer alfa. Quando este corte ocorre, significa que o nó em questão não é melhor que o nó mais forte neste nível de profundidade e secção da árvore.
  • Wormhole *: ​​Este algoritmo aplica a mesma condição que o algoritmo alfa beta, mas a estende a todos os níveis anteriores: Por exemplo, no nível deph=5: a condição em vez de "if (beta5 <= alfa4)" é "if (beta5 <= alfa4 || beta5 <= alfa2 || beta5 <= alfa0)". O ganho é avassalador!


Algoritmos de ordenação de dados para acelerar cortes no algoritmo alfa beta: 

  • Internal Iterative Deepening: Este algoritmo faz varreduras completas sucessivas com profundidade crescente a cada varredura. Isso permite agrupar melhor os nós em ordem (aprimorando o corte alfa beta) e gerenciar melhor o tempo gasto em pesquisa. 
  • Killer moves: Permite que Supra analise sempre primeiro o movimento que fez o corte alfa beta na seção anterior no mesmo nível de profundidade. Muitas vezes, mesmo em posições diferentes, o mesmo movimento da peça produz corte alfa beta, se anteriormente também produzia. 
  • Tabela de hash (transposições) **: Guarda o melhor lance e o valor de cada posição analisada. Quando a mesma posição volta a aparecer (por outra ordem de lances), o Supra reaproveita o trabalho já feito.


    Algoritmos de filtragem por condição: 

    • Filtro vertical *: Filtro poderoso de variantes francamente ruins de deph>=3. 
    • Filtro turbo *: Permite que Supra use um método de pesquisa um pouco mais rápido por incrementos escalonados de alfa. 


    Algoritmos de filtragem com pré-pesquisa com menor nível de profundidade: 


    • Null move pruning: O lado a mover não se move e deixa o adversário jogar: se o resultado desta análise (com deph = deph-2) ainda for ruim para o adversário existe um corte total neste nó. 
    • Late move reductions: Este algoritmo faz com que Supra  analise os primeiros filhos de um nó com profundidade normal. Se após a análise destes primeiros (cerca de 5) nós não houver corte alfa beta a pesquisa continua mas agora com uma profundidade menor. Este procedimento economiza muito tempo na pesquisa, pois o corte alfa beta normalmente não é produzido a não ser nos primeiros nós. Se um corte for produzido, Supra terá que reanalisar os nós restantes com profundidade normal. Supra usa uma versão mais radical deste algoritmo e só  varre novamente esse nó com deph normal se esse nó produziu corte alfa beta e não todos os nós indiscriminadamente. Em outras palavras, se o corte alfa beta com menor deph for produzido em um determinado nó (após o 5 inicial), então supra analisa esse nó com deph normal. Se não for confirmado o corte alfa beta, Supra analisa o próximo nó com menor deph e executa o mesmo procedimento. 
    • Principal Variation Search: Supra para cada nó começa com uma varredura com janela de tamanho muito reduzido (<1) se o valor beta não sair da janela a pesquisa com janela ilimitada não é realizada e Supra economiza muito tempo varrendo o ramo desse nó. 


PESQUISA NAS FOLHAS

- Pesquisa de quiescência **

Nas folhas, o Supra continua a analisar só capturas e promoções até a posição acalmar, com "stand pat" (o lado que joga pode não capturar), ordenação MVV-LVA (vítima mais valiosa, atacante menos valioso) e avaliação só de material, o que a torna muito rápida.

- Janela de quiescência adaptativa * **

Janela alfa-beta no meio-jogo (mais rápida) e quiescência exata nos finais (mais precisa).

FINAIS

- Mop-up **

Contra o rei sozinho: o rei adversário é empurrado para a borda e o rei atacante aproxima-se.

MULTIPROCESSAMENTO

- Lazy SMP **

Vários threads pesquisam a mesma posição em paralelo, desfasados nas profundidades, partilhando a tabela de hash e os valores de alfa. Cada um aproveita o trabalho dos outros.

- Melhor thread por profundidade * **

O lance escolhido é o do thread com a pesquisa válida mais profunda. Um ciclo incompleto vale assim que o primeiro lance da raiz termina; o lance cortado pelo tempo é descartado; em empate, ganha quem acabou mais lances da raiz.

- Partilha de alfas por profundidade (opção experimental, desligada por omissão) * **

Os threads que estão na mesma profundidade partilham os valores de alfa e cortam mais cedo.

- Distribuição equilibrada das profundidades * **

Com 4 threads, dois começam ao nível do primeiro e dois um ciclo à frente; com 8, três ao mesmo nível, quatro um ciclo à frente e um dois ciclos à frente.

VELOCIDADE DA AVALIAÇÃO

- Avaliação preguiçosa dos dois lados **

Se o material, só por si, já garante o corte ou a irrelevância da folha, a avaliação completa não é feita.

- Memória de avaliações **

As avaliações repetidas na mesma pesquisa (cerca de 17%) são guardadas e reaproveitadas, com exatamente o mesmo resultado.

AVALIAÇÃO E ESTILO

- Algoritmo de Shashin

Classifica as posições em zonas de ataque (Tal), de equilíbrio (Capablanca) e de defesa (Petrosian), e ajusta os critérios posicionais a cada zona.

- Quociente material *

A vantagem material é avaliada pelo logaritmo da proporção entre o material dos dois lados, e não só pela diferença. Assim, um peão a mais vale mais num final do que no meio-jogo, e o Supra procura trocas quando está à frente e evita-as quando está atrás.

- Personalidades

Cinco estilos de jogo (custom, hyper-romantic, romantic, dynamic e positional) que ajustam de uma vez a agressividade, o ataque ao rei, ataque por xeque ao rei, a mobilidade, a relevância posicional, o quociente material e o limite de sacrifício.

* Algoritmos descobertos por mim, ou redescobertos por mim de forma independente.

** Algoritmos implementados no Supra 30.0 com a preciosa e imprescindível ajuda de Claude, inteligência artificial da Anthropic.



Feedback