O Crafty não é mais que um hobby antigo meu, da época do Blitz e do Cray Blitz que o seguiu. As pessoas me perguntam como eu continuo fazendo isto, e esta é uma questão que geralmente me deixa sem palavras.
Talvez a pergunta mais comum que me fazem é "esta versão do Crafty é alguma versão 'emburrecida' do que você joga no ICC ou que você usa em eventos de xadrez de computador?" A resposta é um sonoro NÃO. A versão atual é exatamente o que está rodando no ICC com este número de versão. Note que uma nova versão pode, ocasionalmente, introduzir fraquezas ou bugs medonhos que não estavam persente na versão "gold" anterior. Por isto, você deve ser cuidadoso para fazer cópias de sua versão "favorita" antes de tentar a última e melhor. Se você não estiver satisfeito com a nova versão, pode voltar para o que você acredita ser uma versão melhor.
Se você está procurando pelo programa de xadrez mais forte disponível, provavelmente deve procurar o Fritz, Rebel, Tiger, e as outras opções comerciais. Lá você vai encontrar oponentes fortes com interfaces buriladas que foram testados de forma sistemática e cuidadosa. Se você está procurando por um programa que joga um bom xadrez, tem um razoável conjunto de funções para o teu uso, está disponível na forma de código fonte, e um em que o autor aceita feedback, código ou sugestões, então você está no lugar certo. Eu aceito comentários e sugestões, bem como feedback de idéias que você mesmo tentou e que parece funcionar.
O Crafty é um programa de xadrez que está no estado-da-arte, e usa todos os algoritmos de busca que você provavelmente já ouviu, pesquisa negascout, ordenamento de lances killer/history, ordenamento de lances quiescentes e "poda" SEE (Static Exchange Evaluation), tabelas hash (transposição/refutação) bem como caches de avaliações, extensões seletivas, pesquisa recursiva de lances nulos, e muitas funcionalidades que tem sido u sada e ainda são usadas na maioria dos programas de xadrez por computador. Se não está no Crafty, então ou está na lista "to do", ou foi tentado, deixou a desejar, e foi descartado.
O Conhecimento em Xadrez está crescendo, e sugestões (ou mesmo código melhorado, real) são bem-vindas. Este é o melhor lugar para contribuir com idéias, por que o conhecimento pode ser usado para suplantar a pesquisa e fazer com que ele jogue melhor. A avaliação é provavelmente o lugar mais fácil para começar a estudar o Crafty por causa dos comentários e a simplicidade do uso dos bitmaps, desde que você "entre" neles.
Meu objetivo ao fazer isto é um exercício em eficiência no xadrez de computador. Eu não posso começar a contar o número de pessoas que conheço que iniciaram do zero a escrever um programa de xadrez. Maior ainda é o grupo que começou do zero, e desistiu antes de terminar, por causa do tamanho básico do projeto.
O Crafty oferece a todo mundo um ponto de início bem limpo, se você é fascinado pela implementação de tabuleiro de xadrez de bitmap (como eu sou). O código de pesquisa e quiescência é razoavelmente direto, bem como a avaliação.
Ele oferece um excelente ponto de início, assim, se você está interessado em tentar uma nova extensão de pesquisa, pode começar os testes amanhã, em vez de no próximo ano, por que você começa com um mecanismo de xadrez plenamente funcional que não é uma aplicação "de brinquedo", mas um jogador de xadrez funcional e "perigoso". Ele oferece um início rápido, apesar de que você pode certamente substituir o mesmo peça por peça até que ele seja "seu", se você quiser. Ele também oferece um conjunto bastante completo de comandos e uma interface para uma GUI bem como suporte para jogar em servidores de xadrez, de forma que o teste e depuração de suas novas idéias é bastante simplificado.
Se você gostaria de ter mais informações, verifique o documento read.me e o crafty.FAQ que são distribuídos com o Crafty. Estes contém novidades e instruções específicas para perguntas feitas frequentemente, como "onde eu consigo obter arquivos de tablebase e como eu uso os mesmos?"
Quando você executa o Crafty, irá imediatamente ser recebido pela string de
prompt "white(1): " e o Crafty irá aguardar por comandos. Este prompt
significa que é a vez das brancas jogarem, e que é o lance no. 1 para as
brancas. Você pode usar qualquer um dos comandos da lista alfabética de
comandos abaixo para modificar o jogo ao seu gosto (controle de tempo, tamanho
da tabela de hash, aleatoriedade do livro, etc.) e então tem duas escolhas. Se
você quiser jogar com as brancas, basta entrar seu lance, e o Crafty vai ler o
mesmo e fazer um lance em resposta. Você então receberá o prompt
"white(2): " e é novamente sua vez. Se você preferir jogar com as pretas,
basta entrar "move" ou "go" no prompt e o Crafty fará o lance para aquele
lado em vez de aceitar um lance seu. Após ele fazer o lance das brancas, você
verá então o prompt "black(1): " indicando que é agora a vez do primeiro
lance das pretas. Você pode entrar um lance, ou pode mais uma vez entrar
"move" ou "go" e o Crafty irá novamente fazer o lance do lado atual,
trocar os lados, e oferecer o prompt para você, para o que deve ser feito a
seguir.
Se você usa sempre um conjunto de comandos para configurar o Crafty para que o
mesmo jogue do jeito que você quer, pode colocar estes comandos em um arquivo
de início chamado .craftyrc (Unix) ou crafty.rc (DOS/Windows). O formato
deste arquivo é exatamente como você iria escrever os comandos no teclado, com
a exigência que a última linha do arquivo deve ser "exit", sozinho na linha.
Usando isto, cada vez que você começar o Crafty, ele irá primeiro executar os
comandos deste arquivo antes de oferecer o prompt para seus comandos.
Enquanto o Crafty está em execução, você pode controlar o que ele apresenta, mas aqui estão alguns exemplos para explicar o que ele está dizendo e por quê:
depth time score variation (1)
book moves {d4, c3, Nc3, d3, b3, c4, g3, b4, Be2, Bb5}
book 0.0s 70% d4
White(3): d4
time used: 0.01
Esta é a saída normal para aqueles casos em que o Crafty está usando o livro.
As linhas de lances do livro dão o conjunto de lances de livro que fazem o
primeiro corte de seleção (veja a explicação sobre seleção de livro dada mais
adiante), seguida pelo lance realmente jogado, neste caso, d4.
Se o Crafty estiver fora do livro, então a saída parece um pouco diferente, como pode ser visto abaixo:
depth time score variation (1)
4-> 0.81 2.09 6. dxe4 Bxe4 7. Rad8 Qf2 8. Qb5
5 1.37 2.41 6. dxe4 Bxe4 7. Ne5 Qf4 8. Bxe4+ Qxe4 9. f5
5-> 1.88 2.41 6. dxe4 Bxe4 7. Ne5 Qf4 8. Bxe4+ Qxe4 9. f5
6 7.38 -- 6. dxe4
6 11.90 1.97 6. dxe4 Bxe4 7. Rab8 Qf2 8. Qc7 Nc5 9. Qe5
6 12.92 ++ 6. Ne5
6 13.71 2.23 6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4
6-> 15.59 2.23 6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4
time: 15.60 cpu:99% mat:1 n:246565 nps:15927
ext-> checks:4706 recaps:1336 pawns:0 1rep:301
nodes full:45951 quiescence:200614 evals:104657
endgame tablebase-> probes done: 0 successful: 0
Vamos examinar isto uma linha por vez. As linhas que tem algo como 4-> na
coluna depth são escritas quando uma iteração (depth ou profundidade) é
terminada completamente. As colunas time (tempo) e score (pontuação) devem
ser óbvias quanto ao seu significado bm como é a PV, a seqüência de lances
que levaram a este escore. Uma nota sobre a coluna "score". Como na versão
18, o Crafty mostra o escore com + para valores bons para as brancas, -
para valores bons para as pretas, não importando qual lado está jogando no
momento. Toda a saída agora segue esta convenção, para jogar, para o modo de
análise, para a anotação de jogos, para "cochichar"/sapear nos servidores de
xadrez, e assim por diante. Isto é diferente de outras máquinas de xadrez, mas
assim que você se acostuma, se torna muito menos confuso quando você lembra
que escores negativos são bom para as pretas e ruins para as brancas, e
vice-versa.
A linha que tem um -- na coluna de escore significa que quando foi iniciado
o nível 6, dxe4 acabou tornando-se pior que o pensado (note que o escore
caiu de 2.411 na última pesquisa para 1.972 para este lance nesta pesquisa).
Para resolver isto, o Crafty diminui o limite inferior de pesquisa (alpha) e
refaz a pesquisa do lance para encontrar o escore. A linha com ++ significa
que este lance (Ne5) é melhor que o melhor lance até agora, de forma que o
Crafty aumenta o limite superior da pesquia (beta) e refaz a pesquisa deste
lance para encontrar o novo escore.
A primeira linha de estatística dá o tempo total que tomou esta pesquisa, a
percentagem de cpu que deve ficar em torno de 98-100%, a menos que sua máquina
esteja sobrecarregada ou a menos que o Crafty esteja em um final que tem
muitos contatos com bancos de dados de finais. Se este valor cair abaixo de
98%, isto significa que o Crafty não está conseguindo usar toda a CPU e deverá
estar jogando mais fraco que o normal. O mat:1 é simplesmente o escore
material real, já que os escores posicionais do Crafty são geralmente
superiores que um peão.
alarm on|of
analyze
Este comando é útil para um jogo, por que se obtém feedback instantâneo quando
você tenta fazer um lance. Se você tentar um lance diferente do que você
acabou de entrar, use o comando back para voltar um lance, ou use
"back <n>" para voltar <n> lances. Note que um lance é um movimento do
último jogador, e não um movimento dos dois lados. Para desfazer os dois
últimos lances (um das pretas, e outro das brancas), use
"back 2".
annotate|annotateh <filename> <colors|name> <moves> <margin> <time>
O comando annotate produz um arquivo com a extensão .can acrescentado ao
nome original. Este arquivo conterá informações em ASCII puro para o passo de
anotação. "annotateh" produz um arquivo HTML (com a extensão .html). Este
inclui a saída normal, mais um bonito tabuleiro gráfico de bitmap para cada
posição que o Crafty tem "algo a dizer".
<filename> é o nome do arquivo que tem os lances do jogo. Deve ser um arquivo
compatível com o PGN, apesar de o Crafty poder ler praticamente qualquer
arquivo com lances de xadrez e converter o mesmo para PGN usando os comandos
"read" e "savegame" para fazer a conversão.
<colors|name> indica qual lado o Crafty irá anotar. As escolhas válidas são
w, b e wb/bw para só as brancas, só as pretas, e as duas,
respectivamente. O Crafty irá examinar e produzir os resultados somente para a
cor indicada, fazendo os lances para o outro lado silenciosamente conforme são
lidos.
Alternativamente, pode-se especificar o nome do jogador (útil se você quer anotar vários jogos em um grande arquivo PGN, por exemplo, e se você alternou as cores de forma que você não pode escolher a correta facilmente). O Crafty irá então descobrir qual lado deve ser anotado em cada jogo. Note que o nome é sensível a caso, mas você só precisa informar uma string que seja única no campo nome. Por exemplo, se um nome é "Anatoly Karpov", e o outro é "unknown", então especificar "Karpov" para o nome deve ser suficiente. Se a mesma "string" aparece nos dois nomes, o Crafty irá reclamar.
<moves> indica os lances que devem ser anotados. Se for um único número
inteiro, a anotação começa com este número de lance (para a cor dada acima) e
egue para o resto do jogo. Se um intervalo é informado, como (20-33), então
só os lances 20-33 inclusive serão anotados. Para anotar o jogo todo, pode-se
usar 1-999.
<margin> dá uma "janela" de escore que controla quando o Crafty irá produzir comentários (veja abaixo). Quanto maior é este número, menos anotações o Crafty irá produzir. Um número negativo irá resultar em uma anotação para cada lance selecionado.
<time> indica o limite de tempo para cada pesquisa. Como cada lance selecionado pede duas pesquisas, você pode pegar o número de lances, dobrar este número e multiplicar por <time> para determinar quanto tempo o processo de anotação vai levar. Este tempo é dado em segundos.
Como isto funciona? Suponha que você use o comando
"annotate game1 w 1-999 1.000 30". Este comando pede ao Crafty para ler o
arquivo "game1", e anotar os lances das brancas em todo o jogo. A margem é 1
peão e o tempo de pesquisa está limitado a 30 segundos. A saída do comando
annotate é encontrada em <filename>.can, neste caso, game1.can.
O Crafty primeiro pesquisa o lance que foi feito no jogo para determinar seu escore. O Crafty então examina a mesma posição, mas tenta todos os lances legais. Se o escore para o melhor lance encontrado nesta pesquisa é maior que o escore do lance jogado mais a margem, então um comentário é acrescentado no arquivo de saída. Este arquivo de saída é bastante curto, com todos os lances do jogo (mais quaisquer tags PGN do original, para identificação), mais os breves comentários. Uma anotação se parece com isto:
{real_value (depth:best_value PV moves)}
real_value é o escore do lance que foi jogado, depth é a profundidade que
o Crafty pesquisou para produzir o best_value e PV para o que ele pensa que
seja a melhor seqüência de lances para os dois lados. Se você mudar <margin>
para 1.000, você está pedindo ao Crafty para só anotar os lances que perdem um
peão ou mais, ou lances que perderam um peão ou mais. Se você mudar <margin>
para .300, você está pedindo anotações para qualquer lance que faça o escore
cair cerca de 1/3 de peão abaixo do valor do melhor lance que o Crafty
encontrou.
Se você tiver outros lances que gostaria de ter analizados durante este
processo de anotação, no ponto que o lance pode ser jogado, acrescente no
arquivo PGN um comentário de anális, entre () ou {}. O Crafty irá produzir
análises para este lance também. Se mais que um lance aparecer dentro de um
único conjunto de delimitadores, somente o primeiro será analizado. Para
forçar o Crafty a analizar mais que um lance, entre então desta forma, ou
parecido: (move1)(move2) como se fossem dois comentários separados.
ANSI on|off
black|whitewhite, nada acontece. Se é a vez das
brancas jogar e você entrar black, então imediatamente passa a ser a vez das
pretas, com a mesma posição. Usado raramente.
bookcrafty.rc/.craftyrc) para direcionar o Crafty para diretórios
específicos para os arquivos de book (bookpath=/a/b/c), as tablebases
(tbpath=/i/j/k), e os arquivos de log (logpath=/x/y/z). Note que estes
comandos pode ser usados somente na linha de comando, por que devem ser
executados antes que o engine seja inicializado. Colocar os mesmos no arquivo
crafty.rc/.craftyrc irá produzir mensagens de erro sem afetar como os
arquivos são abertos.
Se você precisar especificar múltiplos diretórios (tbpath somente) você pode
fazê-lo usando "tbpath=path1:path2:paht3:etc" ou então usar a opção mais
Unix-lik "tbpath-(path1:path2:path3:etc)". Os diretórios são separados por
":" (dois-pontos) e tudo é sensível ao caso como normal. Para usuários
DOS/Windows, o separador pode ser um ponto-e-vírgula (;) ou uma vírgula
(,) para evitar a ambiguidade na designação de drive.
cache=NN pode ser um inteiro simples,
representando o número de bytes a usar ou pode ser especificado como nK ou
nM, representando n * 1024 ou n * 1024 * 1024 bytes. Esta opção deve
estar em múltiplos do tamanho dos "pedaços" do banco de dados, que podem
variar. O uso da forma nM garante que você terá um número razoável.
clock <ctime> <otime><ctime> é o tempo
(em minutos ou no formato hh:mm) queo o Crafty tem até o próximo controle de
tempo, e <otime> é o tempo restante no relógio do oponente. Este comando
pode ser usado a qualquer momento, mas irá afetar somente o tempo por lance
após o Crafty fazer o lance atual e começar a pensar sobre o que o
oponente poderá fazer a seguir.
computer
display
Este comando também é usado para apresentar as várias peças/casas, escrevendo
"display <piece>" onde <piece> é substituído por pawn (peão), knight
(cavalo), bishop (bispo), rook (torre), queen (dama), ou king (Rei). O
tabuleiro é orientado da mesma forma que o tabuleiro apresentado com uma
correspondência um-a-um entre as casas. Talvez útil por curiosidade, mas para
nada mais. Estes valores não pdoem ser modificados pelo usuário.
A versão final deste comando é usada para controlar que tipo de saída será vista quando o crafty estiver executando. Atualmente as seguintes opções estão disponíveis:
display time
display changes
display variation
display stats
display extstats
display movenum12. ... Nxe4 13. Bxe4 h6 em vez de simplesmente
Nxe4 Bxe4 h6. É bastante útil quando estiver jogando em um servidor e
"cochichando" ou "sapeando" análises. Também é útil quando o Crafty é
executado de dentro de um programa de banco de dados, já que o número dos
lances estarão sincronizados com o jogo.
display moves
display generalclearing hash tables" ou outras
coisas como "Mate in n moves").
Se for colocado um "no" em frente de qualquer destas opções, a mesma irá
desabilitar aquele tipo particular de saída.
drawDrawScore(). Se o valor de pesquisa não for maior que este resultado,
então o Crafty irá aceitar a oferta de empate. Se o valor de pesquisa for
acima do valor teórico de um empate, o Crafty irá recusar o empate. Note que o
Crafty irá oferecer empate baseado em análises internas. Quando ele oferece um
empate, você pode responder com "draw" apesar do jogo realmente não terminar
enquanto você não sair do Crafty.
drawscore NN. Se
você quer que o Crafty evite empates, passe este número para um valor
negativo. Por exemplo, -50 diz que uma repetição (empate) é o mesmo que
estar 1/2 peão atrás. Configurar ele para +100 fará com que ele tente de
todas as formas empatar, pois vai lhe parecer que estará ganhando um peão
quando estiver fazendo isto. Note que é perigoso (de qualquer forma) deixar
como -50, por que um final de Rei e Peão é muito provavelmente uma
derrota... e a repetição é melhor.
echo <text>
editedit", você vai estar no modo
"edit.white", onde qualquer combinação de peças/casas que for entrada irá
acrescentar a peça indicada na casa informada. A combinação peça/casa é
informada, por exemplo, como "qa3", ou "bc4". Estas combinações colocam
uma dama branca em a3 e um bispo branco em c4. Uma vez que todas as peças
brancas sejam informadas, entrar um "c" muda para o modo "edit.black", onde
as combinações peça/casa são agora para as peças pretas. Escrever um caracter
"." sai do modo de edição. Para limpar o tabuleiro inicial, use o caracter
"#".
Aqui está um exemplo para configurar a posição inicial original, após as
brancas terem jogado 1.e4, mas nenhum outro lance foi feito.
edit # ra1 nb1 bc1 qd1 ke1 bf1 ng1 rh1 pa2 pb2 pc2 pd2 pe4 pf2 pg2 ph2 c ra8 nb8 bc8 qd8 ke8 bf8 ng8 rh8 pa7 pb7 pc7 pd7 pe7 pf7 pg7 ph7 .
Note que a entrada é em formato livre, assim, as peças/casas podem ser
entradas uma por linha ou todas em uma linha. O mesmo para os caracteres
especiais #, c, e .. Note também que não há forma de informar o estado
de roque aqui. É muito melhor usar o comando "setboard" que usa uma sintaxe
semelhante à FEN e permite que se informe a situação dos dois roques e da
tomada /en passant/.
egtbtbpath" (se for fornecido) para localizar e registrar
todos os bancos de dados que foram copiados. Ele irá reportar a maior classe
encontrada, com em "5 piece tablebase files found" se você fizer o download
de pelo menos um arquivo de 5 peças. Se você usar este comando para habilitar
bancos de dados, também deve considerar usar o comando "cache" para
especificar o tamanho de cache egtb.
end|quitcrafty c". Ele irá imediatamente ler os
lances do último jogo, mas você terá de acertar os controles de tempo e o
tempo restante você mesmo.
evaluation option <value>
A opção "asymmetry" é usada para fazer com que o Crafty avalie a segurança do
Rei de forma diferente para cada lado. "evaluation asymmetry 25" irá
aumentar os escores de segurança do rei somente para o oponente, significando
que ele dará menos atenção à segurança do seu próprio Rei do que à do seu
oponente. Isto fará com que jogue mais agressivamente. "`evaluation asymmetry
-25`" irá reduzir o escore de segurança do Rei para o oponente em 25%, fazendo
com que tome mais cuidado sobre a segurança do próprio Rei que do seu
oponente. Isto fará com que jogue mais defensivamente.
A opção "bscale" irá ajustar os escores dos peões bloqueados. O valor padrão
é 100. Aumentar este valor fará com que o Crafty goste menos ainda de posições
com peões bloqueados, o que irá levar a posições mais abertas. Note que isto
irá afetar os lances somente depois que o livro de aberturas tiver sido
seguido, o que significa que a posição pode estar bloqueada antes que o termo
da avaliação tenha alguma chance de afetar o jogo.
A opção "kscale" irá ajustar todos os escores de segurança do rei baseado no
'valor' entrado. Por exemplo, "evaluation kscale 50" irá reduzir todos os
escores de segurança do Rei para 50% do seu valor normal. "`evaluation kscale
133`" irá aumentar todos os escores de segurança do Rei para 133% do seu valor
normal.
A opção "tropism" é usada para mudar os escores de tropismo do Rei. Isto irá
atrair as peças em direção aos Reis. Um valor de 100 significa não alterar.
Outros valores são tratados como uma porcentagem (como uma escala) para
aumentar (>100) ou diminuir (<100) os escores de tropismo do Rei.
Quando você usa este comando, verá algo assim:
modified king-safety values:
white: 0 4 16 26 39 45 58 77 87 90 93 96 100 103 106 109
112 116 119 122 125 128 128 128 128 128 128 128 128 128 128 128
black: 0 5 20 32 48 56 72 96 108 112 116 120 124 128 132 136
140 144 148 152 156 160 160 160 160 160 160 160 160 160 160 160
Estes valores repersentam a avaliação da segurança do Rei à medida que o Rei
fica mais e mais exposto. Este é sempre baseado no quão rápido que "crafty"
estará no lado que faz o lance quando a pesquisa inicia. Nos dados acima, era
a vez das brancas fazerem o lance, significando que parece que o crafty irá
jogar com as pretas. Note que os números de segurança do Rei branco sofreram
uma modificação de escala de 20% para fazer com que o mesmo fique um pouco
mais cuidadoso com o seu próprio Rei. Se você escrever "go" nesta posição,
os escores serão revertidos, já que os escores do Crafty sempre são deixados
sozinhos (com a opção asymmetry) e os escores do oponente são escalados para
baixo, como indicado.
Você verá números similares (mas não conjuntos preto e branco) que representam os escores atuais produzidos pelo tropismo do Rei. Note que as peças interagem para escolher qual elemento deste vetor é usado, mas, em geral, quanto mais peças estão próximas do Rei, maior é o elemento deste array.
A opção "pscale" é usada para colocar uma escala no escore da estrutura de
peões da mesma forma que outras opções de escala. 100 é o valor padrão.
Valores menores que 100 irão reduzir este termo, e valores maiores que 100
irão aumentar os mesmos.
A opção "ppscale" é usada para colocar uma escala no escore dos peões
passados da mesma forma que as outras opções de escala. 100 é o valor padrão.
Valores inferiores a 100 irão reduzir este termo, valores superiores a 100
irão inflacionar o mesmo. Este fator afeta principalmente peões passaos e
peões passados protegidos. O escore normal de peões computa o valor de um peão
passado. Este termo é então usado para fazer escala dos termos que modificam
este valor, como dois peões passados conectados na 6a, ou um peão passado com
o suporte do Rei em um final.
extensions type valueEstas extensões estão atualmente limitadas ao máximo de uma ply de extensões em qualquer ponto da árvore. Ou seja, não importa quais os valores que você escolhe, eles não podem exceder uma ply atualmente.
incheck - Este é o total a extender quando o lado a fazer lances faz um
lance que deixa o oponente em xeque. Note que o Crafty extende no ply quando o
xeque é feito, não na próxima ply onde o lado oponente está em xeque.
onerep - Esta é a extensão 'uma-resposta-ao-xeque', e é feita no ponto em
que um lado está em xeque e tem exatamente um lance legal para escapar do
xeque.
pushpp - Esta é a extensão usada para avançar certos peões passados no
final do jogo.
recapture - Esta é a extensão recapture, e é aplicada quando o lance atual
recaptura uma peça de valor iqual aquela que fez uma captura no ply anterior.
Por exemplo, BxN, PxB. Note que isto só pode ser aplicado uma vez a cada duas
plias, de forma que BxN, BxB, NxB, NxN não é visto como três recapturas.
mate - Esta é a extensão de ameaça de mate e é aplicada quando uma
pesquisa de lance nulo retorna -MATED, que sifnifica que não fazer nada faz
com que o lado que tem a vez fique em mate. O oponente deve ter alguma ameaça
séria de mate nesta posição.
flag on|offon) ou para ignorar
isto (off) se desejado.
force [move][move] é informado, e é um lance legal, o Crafty irá desfazer o seu último
lance e fazer este lance. Isto não muda o lado que tem de jogar, mas muda a
posição do tabuleiro, obviamente. Se [move] não for informado, o Crafty irá
pedir a você por um lance a ser jogado.
help[help], então você
pode usar o comando help seguido pelo comando específico para obter ajuda
mais detalhada.
history
hash=x e hashp=xhash modifica o tamanho da tabela de
transposição/refutação, enquanto que hashp modifica o tamanho da tabela de
has de estrutura de peões/segurança do Rei. Os tamanhos podem ser informados
como um dos seguintes tipos de valores: nnnK, onde nnn é um inteiro indicando
quantos Kbytes o Crafty deve usar para sua tabela de hash; nnnM, onde nnn é um
inteiro indicando quantos Mbytes o Crafty deve usar.
A tabela de transposição/refutação é a mais crítica das duas, por que ela
afeta diretamente a eficiência das buscas, particularmente nos finais. Por
esta razão ela deve ser maximizada. O tamanho mais efetivo para esta tabela é
3/4 de sua memória disponível. Se você não sabe como descobrir este valor, mas
sabe que tem 16 Mbytes, por exemplo, então você pode usar hash=16M que o
Crafty irá arredondar a mesma para 12M, que é 3/4 de um tamanho de potência de
dois. Se você estudar os tamanhos possíveis, vai encontrar que 3M, 6M, 12M, 24M,
48M, e assim por diante. Qualquer coisa até, mas não incluindo, o próximo
tamanho será arredondado para o valor menor seguinte. hashp deve ser
configurado para aproximadamente 1/2 do que sobrar. Por exemplo, o P6 Crafty,
quando está jogando no ICC, geralmente usa hash=48M e hashp=8M. A única
coisa a cuidar é que se você escolher valores muito grandes, particularmente
sob o Windows, a performance vai cair bastante, por causa do overhead de E/S
da paginação. Quando o Crafty está examinando uma posição normal (não é do
livro de aberturas, e nem do banco de dados de finais), a luz do disco rígido
não deve ligar, o que indicaria muita atividade de E/S.
Não há o perigo de fazer esta tabela muito grande, apesar de você ter que cuidar por que se o Crafty mal cabe na memória, fazer qualquer outra coisa na memória fará que o Crafty seja passado completa ou parcialmente para disco ("swapped"), dependendo do sistema operacional em uso. Se você pretende usar a máquina para outra coisa enquanto o Crafty estiver sendo executar, é melhor "fazer de conta" que a máquina só tem metade da memória que realmente tem, quando estiver computando o tamanho das tabelas de has que pretendes usar.
import <filename> [clear]<filename> e importa o dado aprendido, da mesma forma
que o Crafty teria aprendido jogando as partidas. A opção [clear], se
especificada, fará que todos os resultados aprendidos sejam liberados anes da
operação de importação, caso contrário os dados importados são simplesmente
acrescentado para o que já existe.
input <filename>exit" (sem as aspas) como o último comando do arquivo. Isto fará
que a stream de entrada seja retornada para o teclado, e pede por um outro
comando ou lance.
Este comando deve ser usado para configurar o Crafty para algum controle de tempo específico, colocando os comandos de controle de tempo apropriados no arquivo, ou para personalizar os tamanhos de tabela de hash conforme necessário.
info
learn nlearn=0 desabilita todo o
aprendizado, learn=1 habilita somente o aprendizado de livros, learn=2
habilita somente o aprendizado de posições, e learn=4 habilita o aprendizado
de resultados. Some estes valores para habilitar mais de um tipo de
aprendizado (o default 7 habilita tudo).
level <m> <t> <inc><m> número de lances no jogo, <t> tempo inicial do
relógio. Após <m> lances serem feitos, esta quantia de tempo é acrescetnada
ao relógio novamente. <inc> é o incremento Fischer-Clock que é acrescentado
a cada relógio após um lance ter sido feito. Ele pode ser zero para um jogo
sem incremento.
Exemplos:
level 0 5 0 (jogo ICS 5 0) level 0 5 3 (jogo ICS 5 3) level 0 15 30 (jogo ICS 15 30)
list GM|IM|C|AK|S +name [+name ...] -name [-name ...]
A lista AK irá automaticamente espiar escores/PV se o oponente está na lista.
A lista S irá ligar o escore especial para oponentes nesta lista. O único
membro atual é "mercilous".
A sintaxe +name1 +name2 simplesmente acrescenta estes jogadores à lista
especificada. Para remover um nome, use -name1 -name2. Você pode usar um
comando por nome para remover ou acrescentar, ou você pode usar um comando
para acrescentar e remover múltiplos nomes. Note que todos os nomes devem ser
informados em caracteres minúsculas, o uso de qualquer caracter maiúsculo irá
prejudicar o algoritmo de pesquisa.
log off|on|<n>log on, o que faz que o crafty produza um novo arquivo log.nnn para cada
partida jogada. Se você está rodando o Crafty em um servidor, você deve usar
log off, que desabilita a criação destes arquivos bem como os arquivos
game.nnn usados para reiniciar um ogo após você sair do Crafty e retornar
mais tarde. Se você usar a forma "log n", o Crafty irá simplesmente mostrar
as últimas n linhas do log na tela. Se você usar "log n file", o Crafty
irá copiar as últimas n linhas do log para o arquivo "file" que pode estar
no seu disco rígido, ou em um disquete.
Note que se você estiver rodando o Crafty com log off, você não vai poder
descobrir o que o Crafty estava pensando já que ele não vai ter outro registro
do jogo. Você sempre verá um arquivo game.001 por que, conforme o Crafty
joga uma partida, este arquivo contém todos os lances jogados, de forma que
você pode fazer um backup do mesmo se necessário. Você também irá ver um
arquivo log.001, mas ele estará vazio.
ls <filename>filename (os caracteres coringa dependem do sistema que você estiver usando,
mas geralmente * e ? funcionarão bem). Você também pode fornecer informações
de diretório em filename se você deseja listar o conteúdo de um diretório
diferente. Use a mesma sintaxe que você usaria se estivesse usando o comando
"ls" no Unix ou o comando "dir" no Windows.
mode tournament|normalclock". Isto faz com que o Crafty esteja de acordo com as regras de
xadrez de computador que dizem que o operador não pode fazer nada que não seja
especificamente solicitado pelo programa.
name <name><name> apareça na seção de tags PGN.
newlog e game, e abre o próximo arquivo na seqüência numérica. Ele
também reinicia o jogo para o início e prepara-se para inciar um novo jogo.
Este comando foi acrescentado para o Xboard, mas o Xboard não usa o mesmo, em
vez disto, ele reinicia o Crafty para cada novo jogo, terminando primeiro a
cópia antiga e então iniciando uma nova. Não é tão eficiente quanto usar o
"new", mas é mais seguro já que o programa não pode ter certeza de reiniciar
tudo para o estado inicial.
noise <n><n> nós tenham sido examinados, o Crafty ficará quieto e não irá
apresentar a análise.
Isto é útil de duas formas. Primeiro, em finais, mais de 20 ply de pesquisas não são incomuns, e a análise para as primeiras plies chegam tão rapidamente que são um distrativo. Segundo, quando observando jogos (nova interface, somente) em servidores ICS, isto pode ser usado para evitar que o Crafty gere muitas análises paralelas. Um valor de 100.000 irá basicamente retirar toda a saída para o primeiro segundo ou em torno (em um P6/200). De forma similar, 1.000.000 irá eliminar qualquer saída por cerca dos 10 primeiros segundos. Quando estiver examinando jogos como os jogos do Campeonato Mundial no ICC, eu geralmente uso 5.000.000, que é quase um minuto de silêncio, de forma que as primeiras PV que ele aponta já são de uma pesquisa bem profunda.
noise 0 fará que toda a análise seja apresentada, o que não causa
problemas em máquinas rápidas. Em uma máquina mais lenta, ou em uma conexão
lenta no telefone, isto pode causar um grande backlog de comunicação. O padrão
é mais ou menos um segundo em um P6/200 (100.000), mas pode ser modificado por
este comando.
operator <n><n> minutos de tempo e não usá-los. Este tempo é basicamente
alocado ao operador para dar conta do tempo que ele leva para escrever lances
e/ou corrigir erros. Em eventos do WMCCC, o valor normal que usamos é 5. Ao
jogar em um servidor, este comando não é necessário, e também não é necessário
se você estiver jogando com o Crafty sozinho.
perfMakeMove()/UnMakeMove() em
diferentes plataformas. Ele produz dois resultados, o número de lances que
pode gerar por segundo, e os lances que pode gerar e fazer/desfazer por
segundo. Apesar de não ser um indicador perfeito de performance, ele dá uma
"aproximação" do quão rápido o Crafty pode ser executado. Em geral, quanto
maiores os números, melhor o programa irá jogar, apesar que as máquinas
certamente são diferentes. Não é incomum encontrar uma máquina que faz
pesquisas mais lentas que outra, mas que tem um valor "perf" maior.
perft <depth><depth> é maior que 5 ou 6, o programa vai
levar muito tempo, já que se trata basicamente de uma travessia minimax de
árvore que irá visitar todos os nós dentro do horizonte <depth> de
pesquisa.
pgn <tag> <value>Event, Site, Round,
Date, White, WhiteElo, Black, BlackElo, e Result, e as tags
são sensíveis a maiúsculas/minúsculas (Event é reconhecida, event
não). <value> pode ser qualquer entrada válida, e espaços em branco e
caracteres especiais são permitidos. Note que a data é especificada claramente
no padrão PGN e deve ser yyyy.mm.dd, não admitindo variações. Resultados
válidos são 1-0 (as brancas ganham), 0-1 (as pretas ganham), 1/2-1/2 (empate)
e * (desconhecido). Alguns exemplos:
pgn Event 14th World MicroComputer Chess Championship pgn Date 1996.10.8 pgn Site Jakarta, Indonesia pgn Round 1 pgn White Crafty pgn WhiteElo 2400 pgn Black assassin pgn BlackElo 2400 pgn Result 1-0
A configuração destes valores irá resultar em um arquivo PGN correto quando
for usado o comando savegame. Note que se você usar o comando "read" para
ler um jogo PGN, esets valores serão extraídos daquele jogo se forem
informados.
ponder off|on|<move>off) ou habilitar (on) o cálculo de
lances durante o tempo do oponente (ou ponderação como é chamado em muitos
programas, incluindo o Crafty). Desabilitar o mesmo vai enfraquecer o Crafty,
já que ele não vai usar qualquer tempo de máquina disponível enquanto estiver
aguardando pelo lance do oponente. Às vezes é útil, entretanto, quando o
Crafty estiver jogando contra outro computador e as máquinas não são iguais.
Se o Crafty estiver em uma máquina mais rápida, e você tentar corrigir isto
dando mais tempo ao oponente que ao Crafty, isto não irá funcionar como
esperado, por que enquanto o oponente estiver pensando, o Crafty também
estará, o que permitirá que o mesmo use o tempo extra do oponente de uma forma
inesperada. Em casos assim, é melhor parar a ponderação nos dois programas.
Se <move> for informado, o Crafty usa aquele lance para fazer suas
ponderações, em vez do lance resultante da última pesquisa. Este comando é
geralmente usado para configura o lance certo para ponderação após o Crafty
ter sido parado e reiniciado, assumindo que é a vez do oponente mover quando
isto acontece. Cado contrário, é provavelmente melhor não tentar influenciar
as coisas, apesar que se você estiver observando e subitamente pensar "o que
o Crafty faria se o oponente jogasse o lance 'X'?", você pode responder isto
simplesmente escrevendo "ponder X" e observando então a análise resultante.
Você deve restabelecer o lance de ponderação correto após ter feito isto, é
claro.
reset <n>reset <n> retorna o jogo para o lance <n> com o
mesmo lado para fazer o lance. Se você quiser primeiro mudar o lado a efetuar
o lance, use o comando white/black, então use o comando reset para
voltar para o lance desejado. Note que você pode também avançar, desde que
existem lances no histórico do jogo atual.
resign <n>resign 9" o que fará que o Crafty desista cerca
de 5 lances depois do escore ficar abaixo de -9.000. Para IMs eu mudo este
valor para 6, e para GMs eu geralmente uso 3, de forma que ele irá desistir
rapidamente e não irá arrastar um jogo perdido desnecessariamente.
read/reada [<filename>]read) e então irá extrair as tags PGN (se houverem) da entrada. O resto da
entrada é analisado atrás de lances de xadrez (comentários e coisas assim são
excluidas automaticamente) e os lances são feitos e acrescentados ao histórico
do jogo. Uma vez isto feito, você pode retornar, avançar, ou jogar a partir de
qualquer ponto no jogo. Se você especificar um arquivo <filename> tudo é
lido daquele arquivo, caso contrário é lido do teclado do console.
O comando reada lê lances, mas acrescenta os mesmos ao histórico de lances
do jogo/posição atual em vez de reiniciar o tabuleiro para a posição inicial.
Isto permite que você leia um jogo, então use o comando reada para
acrescentar alguns lances e ver a posição resultante.
savegame <filename>pgn para mudá-las
ou então usar um arquivo PGN com as tags já preenchidas.
Esteja avisado que este comando não checa o nome do arquivo para ver se é um nome legal, já que qualquer coisa pode ser usada no UNIX. No DOS, você pode produzir um nome de arquivo errado com muitos caracteres, muitos pontos, ou o que for, portanto, seja cuidadoso com o nome que escolhe. Note também que este arquivo será sobrescrito se ele já existir, então cuide para escolher um nome que não seja o nome de um arquivo que tenha alguma coisa que você considere importante.
savepos <filename><filename>
em uma notação semelhante à FEN. Isto permite que você salve uma posição, e
retorne à mesma mais tarde para reexaminá-la. Você deve usar o comando
"in <filename>" para ler este arquivo e configurar a posição.
search <move>annotate, mas pode ser
usado para investigar um lance específico. Se o lance não é o melhor lance,
uma pesquisa normal não irá mostrar por quê ele é ruim, mas esta irá. Ela
também é um pouco rápida já que os outros lances na posição não são
examinados.
settc <moves> <ctime> <otime>setboard, e então usa
o comando settc para restaurar os valores de controle de tempo. <moves> é
o número de lances até o próximo controle de tempo (da perspectiva do Crafty,
seja cuidadoso e não olhe os lances do oponente que faltame para controle de
tempo por acidente). <ctime> é a quantidade de minutos no relógio do Crafty,
e <otime> os minutos que que faltam no relógio do oponente.
setboard <FEN input>Os códigos padrão das peças p, n, b, r, q e k (peão, cavalo, bispo, torre, dama e rei) são usados para denotar o tipo da peça em uma casa, maiúsculas e minúsculas são usadas para indicar a cor da peça (maiúsculas para peças brancas, minúsculas para peças pretas).
As peças são informadas a partir da orientação clássica para diagrams de xadrez, com a8 sendo o canto superior esquerdo do tabuleiro, e esta casa é informada primeiro, seguido pelo restante da oitava linha, da esquerda para a direita. Para indicar casas vazias, usa-se um número de 1 a 8 para indicar quantas casas adjacentes esão vazias, usa-se / para terminar cada linha após todas as peças daquela linha terem sido informadas. Note que não é necessário informar todas as 8 casas em uma dada linha, apesar de muitos conjuntos de testes fazerem isto para claridade.
A seguinte entrada irá configurar a posição do tabuleiro que é dada abaixo:
k2r/ppp////Q/5PPP/7K/ b
Este diagrama usa a notação em que k representa um rei branco, e -q representa uma dama preta.
-k * * -r * * * * -p -p -p * * * * * * * * * * * * * * * * * * * * * * * * * * * * * q * * * * * * * * * * * * p p p * * * * * * * k
O campo após o último "/" deve ser b ou w para indicar que este lado tem a vez. Após este campo do lado que tem a vez qualquer um dos caracteres seguintes pode aparecer para indicar o seguinte: KQ: as brancas podem fazer o roque menor e maior; kq: o mesmo para as pretas; a1-h8: indicando a casa ocupada por um peão que pode ser tomado en passant.
score+ é bom
para as brancas, e um escore - é bom para as pretas. O Crafty também divide
o escore em duas grandes categorias (do Evaluate()) para indicar coisas como
a estrutura de peões, avaliação das peças, peões passados, desenvolvimento, e
assim por diante. Note que algumas das avaliações do Crafty são assimétricas,
assim se você simplesmente mudar o lado ativo com o comando white/black e
então usar o comando "score" novamente, pode obter um valor diferente. Isto
não é um bug. :)
sd <n>st <n> (abaixo) em conjunto com este se a pesquisa estiver tomando muito
tempo. <n> é a profundidade (em plies ou 1/2 jogadas) que a pesquisa deve
atingir. Note que se o Crafty estiver ponderando, ele ainda vai horar estes
limites e irá parar uma pesquisa de ponderação após esta profundidade ter sido
completada também. Esta não é a forma de fazer o Crafty jogar de forma
mais fraca, mas a que será coberta em uma outra seção deste documento.
show <category><category> é
"book" que fará que o crafty mostre informações sobre todos os lances de
livro que ele encontrar no banco de dados. Mais informações são dadas na seção
BOOK mais tarde neste arquivo.
smpmt=nn" deve ser
configurado para o número de processadores que você tem, apesar que usar menos
irá reduzir a carga em sua máquina. Para este comando funcionar, o Crafty deve
ser compilado com SMP definida. Quando compilado com SMP habilitado, mt=0
efetivamente desabilita completamente o código SMP.
Este comando também tem dois outros que são relacionados de perto, smpmin e
smpmax. Os dois aceitam argumentos numéricos simples. O smpmin é usado
para controlar a profundidade mínima da árvore exigida de um nó para que o
mesmo seja considerado um candidato para pesquisa paralela. Por exemplo,
smpmin 2 diz que não deve ser criada uma thread a menos que pelo menos duas
plies a mais são deixadas para pesquisa abaixo do nó atual. smpmax configura
o máximo para a mesma idéia, assim, smpmax 10 diz que não deve ser feita uma
thread se mais de 10 plies restam abaixo deste nó.
sn <n>sd, mas, em vez de configurar
uma profundidade de pesquisa específica, ele configura o número de nós a
pesquisar. Uma vez que a pesquisa tenha atingido este número de nós (+ talvez
um segundo a mais de pesquisa para verificar o tempo) a pesquisa terminará.
st <n>time" ou "level"
é muito melhor. <time> é informado em segundos, apesar de também poder
ser entrado como mm:ss se for preferido.
swindle on|off
tags
test <filename> [n]st <n>. O
parâmetro opcional [n] é o contador para a "saída antecipada". Se o Crafty
encontra, e guarda o lance solução por n iterações, ele irá terminar a
pesquisa. Eu uso isto para que uma vitória no xadrez leve menos que 15
minutos, mesmo que o tempo de análise por posição seja 1 minuto, configurando
n para 2. Após duas iterações corretas, o Crafty vai para o próximo
problema. Para resultados absolutamente corretos, não é aconselhável usar esta
opção, já que ele pode obviamente mudar de idéia mais adiante, para para fazer
análises, este comando economiza muito tempo.
O conjunto de teste contém as seguintes linhas (este é um exemplo do meu conjunto de tesdes para Win At Chess):
title wac299 setboard 1n2rr2/1pk3pp/pNn2p2/2N1p3/8/6P1/PP2PPKP/2RR4 w solution Nca4 title wac300 setboard b2b1r1k/3R1ppp/4qP2/4p1PQ/4P3/5B2/4N1K1/8 w solution g6 end
O comando title simplesmente mostra esta mensagem no arquivo de log, assim
você pode olhar a saída e saber qual posição está sendo analisada. É opcional,
mas bastante útil.
O comando setboard configura a posição do tabuleiro, como foi explicado
antes.
O comando solution informa o conjunto de lances solução (um ou mais lances
que são separados por espaços em branco) e/ou um conjunto de lances
"anti-solução" (lances que não devem ser jogados para que a posição seja
considerada correta). Lances "anti-solução" são simplesmente seguidos por um
caracter "?", como, por exemplo:
solution Bxa7?
O comando solution simplesmente fornece um conjunto de lances-chave, e então
inicia a pesquisa. Se, após a pesquisa terminar, um dos lances-chave solução
for escolhido (ou um dos lances anti-solução for escolhido) a posição é
contada como correta.
A linha final deve ser "end", apesar de que um fim de arquivo ou EOF ter
sido detectado neste caso.
time CPU|elapsed|<values>
O comando time também é usado para configurar os controles básicos de tempo
de pesquisa. A forma geral deste comando é como segue:
time nmoves/ntime/[nmoves/ntime]/[increment]
Onde nmoves/ntime representa o tradicional primeiro controle de tempo onde
nmoves é um inteiro representando o número de lances e ntime é o tempo
total permitido para estes lances. O nmoves/ntime opcional é um controle de
tempo secundário tradicional. E increment é uma funcionalidade relacionada
com o jogo no ICS e emula o relógio Fischer, onde <increment> é acrescentado
ao tempo remanescente cada vez que é feito um lance.
Como uma alternativa, nmovespode ser "sd", o que representa um controle de
tempo de morte súbita para o restante da partida jogada em ntime. O controle
de tempo secundário opcional pode ser um controle de tempo de morte súbita,
como no seguinte exemplo:
time 60/30/sd/30
Este comando configura 60 lances em 30 minutos, e então um jogo de 30 minutos adicionais. Um incremento pode ser acrescentado se desejado.
Um exemplo final:
time sd/15
Que é uma simples configuração de jogo/15. Este comando também pode ser usado
para fazer a mesma função do comando "level". por exemplo, para configurar
um jogo clássico ICS 2 12, o seguinte comando deve funcionar:
time sd/2/12
trace <n>
Note também que este comando está normalmente desabilitado, por qeu o Crafty é
geralmente compilado com a flag -DFAST, que remove o código de saída de
trace da pesquisa, para que as coisas corram um pouco mais rápido. Você terá
de recompilar sem o -DFAST se quiser usar esta opção. Sua utilidade é
limitada, exceto para depuração, de qualquer forma.
usage <n>st", o Crafty vai fazer o possível para usar o tempo como
você sugeriu, mas ele também antecipará que irá economizar algum tempo fazendo
ponderações, etc., e será, portanto, mais agressivo quando tentar usar seu
tempo. Se <n> for um inteiro positivo, será interpretado como uma
percentagem, e o Crafty irá computar o limite de tempo que ele pensa ser
apropriado para as configurações de relógio atuais, então aumentará este
limite por esta porcentagem: 50 fará que ele tome 1.5 vezes mais tempo que o
normal, -50 fará com que ele leve metade do tempo que normalmente levaria.
I Crafty ajusta internamente o uso baseado no tempo que sobrou, no tempo que sobrou para o oponente, e quão rápido ou lento o oponente está fazendo seus lances, etc. Modificações posteriores com este comando é perigoso, mas possível.
whisper/kibitz <n>noise pode ser usado para evitar que pesquisas
superficiais gerem saída, mantendo o "ruído" baixo nos jogos sendo observados.
(6) basicamente irá colocar na tela tudo que se pode ver em uma pesquisa, cada
PV quando for alterado, altos e baixos, etc. Uma quantia significativa de
saída que deve ser avaliada cuidadosamente antes de deixar ele "solto".
xboardoption.c se estiver interessado.
O Crafty usa dois livros de aberturas pré-compilados, chamados "book.bin" e
"books.bin".
O arquivo book.bin é usualmente construído a partir de um grande arquivo
contendo jogos PGN, geralmente tomados de coleções de jogos de GM. A
construção do book.bin é um exercício simples e não exige mais que o arquivo
de dados brutos que será usado. Geralmente ele é ou o arquivo medium.zip ou
o conjunto de quatro arquivos large[1-4].zip, todos armazenados na máquina
FTP ftp.cis.uab.edu/pub/hyatt/.
Para criar o arquivo book.bin, você precisa de uma coleção PGN de jogos que seja um arquivo PGN real.
Supondo que o arquivo seja chamado "large.pgn", você vai usar o seguinte comando:
book create large.pgn <m> [n] [wpct]
A única coisa que deve ser fornecida é <m>, um número indicando quantos
lances de cada jogo devem ser armazenados no banco de dados book.bin. Eu uso
tipicamente 60, que armazena os 60 primeiros lances de cada jogo. Aumentar
este número aumenta levemente a probabilidade do Crafty ficar mais tempo no
livrro, mas também aumenta a probabilidade que ele irá seguir um jogo por mais
tempo, de forma que ele começa a atingir posições em que o lance jogado pode
não ser o melhor lance, permitindo que ele caia em um buraco. Aumentar este
número também aumenta o tamanho do banco de dados.
Você pode diminuir o tamanho do livro, e também reduzir o número de lances
ruins especificando <n>, o que diz que a menos que um lance seja jogado em
pelo menos n jogos, o lance é descartado. Isto irá diminuir substancialmente
o tamanho do arquivo book.bin, e também irá eliminar lances que só aparecem em
um jogo que geramente contém erros ou capivaradas significativas.
Você pode aumentar a qualidade das linhas do livro especificando <wpct>, que
é a "percentagem de vitórias". Esta é especificada como uma percentagem de
jogos perdidos, e é usada para descartar lances que levam principalmente à
derrota. Um valor seguro é 50, que diz que se um lance de abertura em
particular não ganha pelo menos 50% a mais de jogos que perde, o lance é
descartado. Um valor de 100 significa que os lances são descartados se
produzem mais derrotas que vitórias, e este é um critério realmente restrito.
Após criar book.bin, você precisa cria books.bin. Este é uma versão menor
de book.bin, que tem o objetivo de dar mais controle sobre os
lances/aberturas que o Crafty irá jogar. Ele é geralmente feito com o arquivo
start.pgn na máquina FTP, mas você pode modificar este arquivo para atender
às tuas preferências facilmente. Para construir o arquivo books.bin, use o
seguinte comando:
books create start.pgn 60
Novamente, 60 é o valor que eu uso, mas nenhuma das minhas linhas no
start.pgn chega a tantos lances. O ponto principal aquie é que no
start.pgn, você pode acrescentar um "!" a qualquer lance desejado, e quando
o Crafty vai fazer um lance com aquela cor, ele irá jogar a partir do conjunto
de lances que tem um "!" se houver algum, ignorando o resto dos lances do
livro. Se você quiser que ele jogue apenas 1. e4 com as brancas, basta
entrar o seguinte jogo curto:
[Crafty only plays 1. e4] 1. e4!
E está feito. Você pode entrar tantos quantos quiser. Se, por outro lado,
existe algum lance que você não quer que o Crafty jogue, então coloque depois
do mesmo um "?" e ele nunca irá jogar o mesmo. Os lances em books.bin que
não estão anotados com "!" ou "?" não tem qualquer influência nas escolhas do
Crafty.
A forma que os arquivos são usadas é esta: quando está examinando uma posição,
o Crafty primeiro faz a enumeração do conjunto de lances que ele pode
encontrar no banco de dados de aberturas. Ele então faz o mesmo para o banco
de dados books.bin, e faz uma operação de "mesclagem" para combina as flags
"?" e "!". O objetivo do arquivo books.bin é dar um pequeno banco de dados
que você possa facilmente modificar, reconstruir, e repetir este processo de
novo e de novo. Como leva uma fração de segundo para reconstruir completamente
este arquivo, é muito fácil modificar o mesmo para controlar o que o Crafty
irá jogar, sem ter que reconstruir um grande banco de dados.
Uma característica importante da entrada PGN é que a tag Result tem que ser
especificada na maioria das linhas, por que o Crafty conta as vitórias,
derrotas e empates para cada lance do livro e usa estas contagens com algumas
das opções de seleção de livro dadas abaixo.
As flags ? e ! deve aparecer somente no arquivo books.bin, apesar de não ter
razão para que elas não apareçam no arquivo maior também. Para esta discussão,
isto não importa já que o Crafty usa os lances dos dois arquivos e "mescla" as
flags/etc em uma entrada para cada lance.
De forma simples, se algum livro legal tem uma flag !, então o Crafty irá somente jogar lances do conjunto de lances que tem todos a flag !. Se um lance tem uma flag ?, então aquele lance é imediatamente removido do conjunto de lances possíveis do livro. Se o único lance legal do livro tem uma flag ?, ele não será jogado como um lance de livro e o Crafty simplesmente vai fingir que não encontrou lances no livro e então irá executar uma pesquisa de árvore normal. Bastante simples.
Uma nova funcionalidade na versão 15.15 e posteriores permiet que se
acrescente um comentário PGN a qualquer lance em um arquivo texto usado para
criar o books.bin, na forma {play nn%}. Isto irá forçar que o lance que
segue seja jogado aquela porcentagem do tempo, não importando os valores de
ordenamento normal do livro baseados em freqüência e assim por diante.
Note que {play 0%} não evitará que um lance seja jogado, já que vai parecer
que se trata de um lance sem porcentagem especificada. Para evitar que um
lance seja jogado, use a flag ?.
O algoritmo de seleção de livro do Crafty depende de dois valores definidos pelo usuário que podem ser configurados a qualquer tempo durante um jogo:
book random <n> book width <w>
O algoritmo de seleção primeiro encontra o conjunto de lances legais de livro
como já foi dito. O conjunto será apenas de lances com !, ou não terá lances
com !. Este conjunto é então diminuído, baseado na configuração book random.
Estas são as opções:
book random 0
book random 1bookw option N", onde "option" pode ser "freq",
"ratio", "eval" e "learn". N deve ser um número entre 0 e 1.
Uma vez o Crafty tenha ordenado os lances como informado acima, ele a seguir exclui todos os lances de livro que tem 0 vitórias.
Isto elimina as linhas estranhas em que um jogador escolheu uma linha ruim e perdeu rapidamente. Com zero vitórias, ele não será escolhido nunca, mesmo que o Crafty seguiria a mesma do outro lado. :) Isto não é nem perdo de perfeito, entretanto, por que uma abertura pode ter uma vitória e 19 derrotas e ainda irá continuar na lista.
Se um lance tem um valor de aprendizado > 100, este lance é elevado em prioridade a um lance com um !, já que ele parece ganhar material instantaneamente. Se um valor é <-100, ele recebe um ?, já que ele parece ser um limão.
Após isto, a configuração escolhida para "book width <w>" é usada para
manter os primeiros <w> lances na lista, após a extração acima ter sido
completada. Quanto menor <w>, menor a aleatoriedade que se obtém, mas a
chance do Crafty aparecer com um lance bizarro do livro também fica menor.
Após fazer o ordenamento, o passo final é dividir em quaisquer valores e "porcentagem jogado" obrigatórios. O que este passo faz é encontrar todos os lances no "conjunto de lances jogáveis" recém computado, que não tem nenhum valor "porcentagem-para-jogar". Ele soma os valores de ordenamento destes lances, e então ajusta os valores de ordenamento para os outros lances de forma que suas porcentagens sejam respeitadas.
Isto feito, o Crafty simplesmente usa o "valor de ordenamento" para cada lance para computar um total para todo os lances. Ele gera então um número aleatório entre 1 e este limite, e escolhe o lance cuja distribuição de probabilidade combine. Isto certamente vai evoluir com o tempo, à medida que novas idéias sejam desenvolvidas.
Para meu jogo no ICC, eu uso book random 1, e book width 5, normalmente,
apesar que para jogadores com títulos eu reduzo para book width 3. Para
computadores, eu reduzo mais ainda para 2, para tentar jogar aberturas
razoáveis e retirar os gambitos e as coisas que não funcionam.
book.bin.
Isto mantém o valor aprendido e a contagem aprendida no mesmo arquivo de livro
para melhorar a velocidade. Você não pode modificar isto, apesar que o comando
"show book" irá fazer o Crafty mostrar tudo que ele tem do livro antes de
fazer um lance.
book.lrn serve a dois objetivos: (a) servir como um registro
para os teus olhos, assim você pode ver o que foi aprendido, contra quem, e
qual o escore que ganhou sua atenção em primeiro lugar. Os valores no fim de
cada linha do livro, dentro dos caracteres {} são os seguintes:
{value, depth, rating_difference} - valor é o valor para a pesquisa "chave"
que vem dos primeiros 10 lances do livro. Está em centipeões, e + é bom, e - é
ruim. depth é a profundidade da pesquias que foi atingida nesta posição
"chave", quanto mais profunda a pesquisa, mais o valor é "confiável".
rating_difference é o rating do Crafty - o rating do oponente; um valor
negativo significa que deve prestar mais atenção ao escore já que o oponente é
melhor que o Crafty, um valor positivo significa que ele deve usar o escore
"com um grão de sal", por que o oponente era mais fraco que o Crafty.
book.bin... Este
outro arquivo está aí principalmente para você espiar se estiver interessado.
Entretanto, é este também o "arquivo portátil de dados de aprendizado", e pode
ser dado a outros para que importem para o seu Crafty, onde ele irá afetar o
livro de abertura exatamente como se o Crafty tivesse jogado as aberturas e
obtido os mesmos escores. Existem duas formas de usar estes arquivos "lrn":
import <filename>" irá ler o arquivo <filename> e importar o
conhecimento dele para o seu book.bin. Como eu usei o mesmo código de
aprendizado que eu usei enquanto jogando partidas, esta informação também é
anexada ao seu arquivo book.lrn também, de forma que o seu arquivo
book.lrn sempre reflete tudo que o seu programa já aprendeu, desde que
você nunca remova este arquivo. Seria um erro usar este comando no seu próprio
arquivo book.lrn, por que as coisas que ele vai obter do mesmo serão
contadas duas vezes, o que pode ou não ser uma boa coisa.
import <filename> clear" lerá o arquivo <filename> e importar o
conhecimento como antes, mas ele primeiro limpa todo o resultado aprendido
de book.bin. Se você vai querer fazer isto se você importar o meu arquivo
book.lrn e você contribuiu para meus dados do book.lrn enviando os
seus dados. Eu terei o cuidado de eliminar duplicatas se você cometer erros no
que você me enviar, mas uma vez que você enviar algo a mim, você corre o risco
de ter isto "devolta novamente" mais tarde. Isto vai continuar sendo um
problema até que todo mundo acostume-se a compartilhar alque que seja menos
"paradão" que esta "informação aprendida" é...
Por outro lado, estamos agora "abertos para negócios"... Quando a necessidade
te atingir, mande por email o seu arquivo .lrn, e eu irei manter um enorme
arquivo mestre aqui e o atualizarei conforme a ocasião. Provavelmente a melhor
coisa a fazer é enviar-me o seu arquivo .lrn e no mesmo instante apagar o
seu . Isto irá capturar qualquer coisa aprendida depois que você enviou-me
o seu arquivo, mas você vai ter tudo de volta com a nova versão do book.lrn
que eu distribuir. Após obter este novo book.lrn, aqui está o que você deve
fazer:
book.lrn para outra coisa qualquer. Eu vou chamá-lo
de "book.lrn.old" aqui.
blearn.dat para sua máquina, mas não coloque o mesmo no
diretório que tem o seu book.bin e books.bin por que isto ficará confuso
rapidamente se você o fizer. Coloque em outro lugar, por que você irá remover
o mesmo rapidamente de qualquer forma. Eu chamarei ele de new.lrn para este
exemplo.
import new.lrn clear
import book.lrn.old
book.lrn. Apó isto o seu arquivo book.lrn terá
as coisas do meu .lrn, mais o velho conteúdo .lrn seu, apenas esperando
para ser enviado a mim novamente.
Se isto está ficando confuso, eu posso provavelmente acrescentar um comando
automático para fazer tudo isto, renomeando o book.lrn, etc. Talvez com o
tempo isto deixe de ser tão passível de erro com o passar do tempo...
O Crafty agora tem uma tabela de hash "permanente", que é mantida de um jogo para outro. Uma posição entra neste "arquivo de hash" quando o Crafty executa uma pesquisa e o valor de pesquisa é significantemente mais baixo que o último valor de pesquisa.
Quando isto acontece, o Crafty armazena a informação atual para esta posição no arquivo de hash permanente, que pode conter até 65536 posições. Uma vez cheio, as posições são substituídas em uma base FIFO (primeiro a entrar é o primeiro a sair, ou PEPS), sempre mantendo as 64K entradas mais recentes.
Cada vez que o Crafty faz uma pesquisa, as posições/escores deste arquivo são colocadas na tabela de transposição normal, e usadas durante a pesquisa como qualquer outra entrada da tabela. É deste jeito que isto ajuda o jogo: em uma partida recentemente jogada, os seguintes lances e escores foram encontrados pelo Crafty (jogando com as brancas):
1. Ng5 (+.277) h6 2. Nh7 (+.321) Kg8 3. Qh5 (+.133) Qg7 4. Ng5 (-2.122) hxg5
Assim, o Cavalo cai em uma armadilha em h7, e no lance 4 o Crafty descobriu que se trata de um erro e "aprendeu" este resultado/posição.
Então jogamos exatamente a mesma partida novamente, exceto que duas coisas acontecem aqui. Pode ser que Ng7 seja a única casa para a qual o Cavalo pode se mover aqui, o que significa que a coisa toda é forçada. A primeira pesquisa vai descobrir:
position.bin, é um arquivo binário que contém as tentradas da
tabela de hash, e tem cresce até um megabyte em tamanho, no máximo (16
bytes por entrada de hash * 65536 entradas = exatamente 1 mega, mas eu tenho 8
bytes extra para a implementação da fila FIFO e para ver quantas entradas
existem atualmente no arquivo, se ele não está cheio.
O segundo arquivo é "position.lrn" e é, como você já deve ter adivinhado, um
arquivo que pode ser compartilhado com outros jogadores, exatamente como o
arquivo book.lrn. Ele contém toda a informação necessária para reconstruir a
posição, o escore, a profundidade, etc. e também inclui as tags PGN para que
informam quem estava com que cor e quando a partida foi jogada...
Estes dados podem ser importados com o novo comando "import" (o velho
book learn <filename> não está mais por perto) que irá importar dados do
tipo book.lrn ou do tipo position.lrn e podem descobrir qual está sendo
importado sem que você precise fazer nada. A opção <clear> ainda está aí,
caso você queira usar a mesma, e simplesmente os arquivos position.lrn e
position.bin antes de começar o processo de importação para aprendizagem de
posições.
Esta opção pode ser desligada, se você quiser, usando o comando "learn", que
permite que você desligue o aprendizado de livro (como ele funciona
atualmente), o aprendizado de posições, e o próximo estágio de aprendizado de
livro, que irá acrescentar ao livro em adição ao aprendizado de quais linhas
do livro são boas e más.
O aprendizado de resultado funciona exatamente como o aprendizado normal de livro, exceto que se o Crafty sofre um xeque-mate ou desiste, ele irá voltar pela linha do livro para encontrar o último ponto em que ele tinha mais de um lance para escolher. Ele irá então marcar o lance que havia escolhido como "nunca jogue isto novamente".
Esta funcionalidade trata o caso em que os primeiros lances que não estão no livro produzem escores razoáveis, mas a posição é uma daquelas que o Crafty simplesmente não consegue tratar muito bem. Se ele perder um jogo destes, ele irá variar na próxima vez que esta abertura for jogada, caso contrário ele possívelmente irá repetir a mesma abertura, e provavelmente irá repetir o resto do jogo também.
Todos os três modos de aprendizado estão ligados por padrão, apesar que
qualquer deles pode ser desabilitado com a opção apropriada ao comando
"learn".
Este documento foi produzido com o auxílio do txt2tags, Versão 1.6, e é uma tradução do arquivo crafty.doc.pdf, o qual pode ser encontrado em ftp://ftp.cis.uab.edu/pub/hyatt/.
Copyright (C) 2004 - César A. K. Grossmann