首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制stockfish评估时间

限制stockfish评估时间
EN

Stack Overflow用户
提问于 2020-09-04 23:33:13
回答 2查看 100关注 0票数 2

我正在尝试使用Python stockfish库获取一系列fen位置的评估结果。当解决方案是在x中的mate时,我的代码运行得很快。当解决方案是x centipawns时,它会运行很长时间。我如何让stockfish限制它必须考虑评估的时间?下面是我的代码:

代码语言:javascript
复制
fish = Stockfish()
evals = []
fen = 'r1bqk2r/pp1pbppp/2n1pn2/2p5/2B1N3/4PN2/PPPP1PPP/R1BQ1RK1 b kq - 1 1'
fish.set_fen_position(fen)
fish.get_evaluation()
EN

回答 2

Stack Overflow用户

发布于 2021-08-07 21:38:35

您可以使用python-chess库($ pip instep python-chess)并简单地执行此操作:

代码语言:javascript
复制
import chess
import chess.engine
engine = chess.engine.SimpleEngine.popen_uci("your/stockfish/path/here.exe")
fen = 'r1bqk2r/pp1pbppp/2n1pn2/2p5/2B1N3/4PN2/PPPP1PPP/R1BQ1RK1 b kq - 1 1'
board = chess.Board(fen)
evaluation = chess.engine.Limit(time=1))['score']
print(evaluation)
票数 0
EN

Stack Overflow用户

发布于 2021-12-17 06:04:05

我查看了code,目前不支持使用时间获取分数。

我创建了一个可以控制时间限制的函数。该函数将返回cp和mate中的score,以及bestmove。

代码

代码语言:javascript
复制
from stockfish import Stockfish


VALUE_MATE = 32000


def mate_to_value(mate: int) -> int:
    """
    Convert mate number to value.
    """
    if mate > 0:
        v = VALUE_MATE - 2*mate + 1
    else:
        v = -VALUE_MATE - 2*mate

    return v


def my_get_evaluation(fish: Stockfish, fen: str, timems: int):
    """
    Evaluate the fen with fish at a given timems.
    Returns a dict of score {'cp': '49', 'mate': None} and move.
    """
    score = {}
    bestmove = '0000'

    fish.set_fen_position(fen)
    fish.get_best_move_time(timems)

    search_info = fish.info
    bestmove = search_info.split(' pv ')[1].split()[0]

    if 'score cp ' in search_info:
        score_cp = search_info.split('score cp ')[1].split()[0]
        score.update({'cp': int(score_cp), 'mate': None})
    elif 'score mate ' in search_info:
        score_mate = search_info.split('score mate ')[1].split()[0]
        score_cp = mate_to_value(int(score_mate))
        score.update({'cp': int(score_cp), 'mate': int(score_mate)})

    return score, bestmove

示例应用程序

代码语言:javascript
复制
def myprocess():
    evals = []
    only_score_cp = []
    bestmoves = []

    timems = 5000
    fens = [
        'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1',
        '1k6/7Q/2K5/8/8/8/8/8 w - - 0 1',
        '1k6/7Q/1K6/8/8/8/8/8 b - - 0 1'
    ]
    fish = Stockfish(r'F:\Chess\Engines\stockfish\sf14\sf14.exe')

    for fen in fens:
        score, bm = my_get_evaluation(fish, fen, timems)
        evals.append(score)
        bestmoves.append(bm)
        only_score_cp.append(score['cp'])

    for e in evals:
        print(e)
    print()

    for bm in bestmoves:
        print(bm)
    print()

    for s in only_score_cp:
        print(s)
    print()

    for f, m, e in zip(fens, bestmoves, evals):
        print(f'fen: {f}, move: {m}, score: {e}')


# Start
myprocess()

输出

代码语言:javascript
复制
{'cp': 49, 'mate': None}
{'cp': 31999, 'mate': 1}
{'cp': -31998, 'mate': -1}

e2e4
h7b7
b8c8

49
31999
-31998

fen: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1, move: e2e4, score: {'cp': 49, 'mate': None}
fen: 1k6/7Q/2K5/8/8/8/8/8 w - - 0 1, move: h7b7, score: {'cp': 31999, 'mate': 1}
fen: 1k6/7Q/1K6/8/8/8/8/8 b - - 0 1, move: b8c8, score: {'cp': -31998, 'mate': -1}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63744112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档