为什么我的 negamax 函数选择愚蠢的动作? (六角象棋)

问题描述 投票:0回答:1
func GetEvaluation(Turn, NextPositions = Positions):
    var EvaluationTable = {
        White = 0,
        Black = 0
    }
    
    for Piece in NextPositions.Main.values():
        EvaluationTable[Piece.get_parent().get_parent().name] += AIValues[Piece.get_parent().name]
    
    return EvaluationTable[Turn] - EvaluationTable[ColorTable[Turn]]
func Negamax(NextPositions, Depth, Alpha, Beta, Turn, Started = true):
    if Depth == 0 or IsGameOver(NextPositions, Turn):
        return [GetEvaluation(Turn, NextPositions)]
    
    var MaxEvaluation = -INF
    var Data = []
    
    for Key in NextPositions[Turn].keys():
        var PlaceX = get_node("Positions").get_node(Key.left(1))
        var PlaceY = PlaceX.get_node(Key.right(-1))
        var NewPositions = GetPosition(PlaceX, PlaceY, NextPositions)
        
        for Select in NewPositions:
            if Select:
                var CreatePos = CreatePosition(Select, NextPositions[Turn][Key], NextPositions)
                var EvaluationTable = Negamax(CreatePos, Depth - 1, -Alpha, -Beta, ColorTable[Turn], false)
                var Evaluation = -EvaluationTable[0]
                
                if Evaluation >= Beta:
                    return [Evaluation]
                
                if Evaluation > MaxEvaluation:
                    MaxEvaluation = Evaluation
                    Alpha = max(Alpha, Evaluation)
                    
                    if Started:
                        Data = [PlaceX, PlaceY, Select.get_parent(), Select]
    
    return [MaxEvaluation, Data]

所以出于某种原因,我的 negamax 函数会做出愚蠢的动作,比如无缘无故地牺牲棋子 例如骑士拿走棋子或其他什么

我尝试使用移动排序和静止搜索,但这些似乎没有太大影响,并且在尝试后性能也下降了。

我在代码中做错了什么吗? 请记住这是 gdscript 如果有任何疑问lmk

godot chess gdscript godot4 negamax
1个回答
0
投票
Negamax(CreatePos, Depth - 1, -Alpha, -Beta, ColorTable[Turn], false)

所以我不久前就明白了这一点,但我应该返回

-Beta, -Alpha
而不是
-Alpha, -Beta

我只是忽略了我猜的伪代码

© www.soinside.com 2019 - 2024. All rights reserved.