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
Negamax(CreatePos, Depth - 1, -Alpha, -Beta, ColorTable[Turn], false)
所以我不久前就明白了这一点,但我应该返回
-Beta, -Alpha
而不是-Alpha, -Beta
我只是忽略了我猜的伪代码