0

我正在使用标准 Python 国际象棋库和一个非常简单的评估函数制作一个非常简单的 Python 国际象棋引擎;黑色总重量的总和(正)加上白色总重量的总和(负)。引擎始终显示为黑色。

我使用 Negamax Wikipedia 页面作为指导,深度是第四层。我不指望大师级的表现,但是引擎做出了非常可疑的举动,例如:白色的e2e4和f1c4导致引擎通过b7b5自由放弃它的棋子。

谁能帮我吗?我完全不知道我做错了什么。Negamax(称为搜索)和评估函数如下所示:

import chess
import time
import math
from time import sleep
from chessboard import display

scoreMovePair = {}

def colorMap(color):
    if color == True:
        return -1
    return 1

def pieceMap(pieceNum):
    if pieceNum == 1:
        return 1
    elif pieceNum == 2:
        return 3
    elif pieceNum == 3:
        return 3
    elif pieceNum == 4:
        return 5
    elif pieceNum == 5:
        return 9
    return pieceNum

def posEval(board):
    
    score = 0
    
    for i in range(0, 64):
        piece = board.piece_at(i)
        if piece != None:
            score = score + pieceMap(piece.piece_type)*colorMap(piece.color)
    
    return score

def search(board, level, a, b, moveSet, color):

    if level == 4:
        score = posEval(board)
        scoreMovePair[score] = moveSet[0]
        return score*color
    if board.is_checkmate():
        return 1000*colorMap(board.turn)

    value = -10000

    for move in board.legal_moves:
        board.push(move)
        moveSet.append(move)
        value = max(value, -search(board, level + 1, -b, -a, moveSet, -color))
        a = max(a, value)
        moveSet.pop()
        board.pop()
        if (a >= b):
            break
    return value
    

def main():
    global scoreMovepair
    board = chess.Board()
    display.start(board.fen())
    while not display.checkForQuit():
        validMoves = list(board.legal_moves)
        if len(validMoves) == 0:
            break
        else:
            move = input("Enter move: ")
            t0 = time.time()
            move = str(move)
            myMove = chess.Move.from_uci(move)
            if myMove in validMoves:
                board.push_san(move)
                value = search(board, 0, -10000, 10000, [], 1)
                move = scoreMovePair[value]
                print(scoreMovePair)
                print("FINAL -> "+str(value))
                board.push(move)
                print(board.fen())
                display.update(board.fen())
                sleep(1)
                t1 = time.time()
                print(t1-t0)
            else:
                continue
    display.terminate()    

if __name__ == "__main__":
    main()
4

1 回答 1

-2

乍一看,我会说你可能错过了“静止搜索”(意思是寻找安静)。也称为“仅捕获搜索”。

https://www.chessprogramming.org/Quiescence_Search

这是在叶节点(达到最大深度的节点)上调用而不是评估函数的搜索。搜索只进行捕获移动,直到没有更多捕获(无限深度)。

简而言之,如果没有这种搜索,无论谁在搜索中获得最后一步(由深度决定),都将能够做任何事情而不会产生任何后果。这可能会导致一些奇怪的结果。

于 2021-10-18T13:00:55.923 回答