谁能帮我看看这个函数的递归调用为什么得不到正确的结果(关于象棋的搜索)? ( 积分: 200 )

  • 主题发起人 主题发起人 zhangxiong
  • 开始时间 开始时间
Z

zhangxiong

Unregistered / Unconfirmed
GUEST, unregistred user!
// 负极大值搜索引擎
function CNegamaxEngine.NegaMax(nDepth: Integer): Integer;
var
current, score: Integer;
i, Count: Integer;
MoveType: Byte;
begin
current := -20000;

i := IsGameOver(CurPosition, nDepth)
// 检查棋局是否结束
if i <> 0 then
begin
// 棋局结束,返回极大/极小值
Result := i;
exit;
end;

if nDepth <= 0 then
begin
// 返回估值
Result := m_pEval.Evaluate(CurPosition, ((m_nMaxDepth - nDepth) mod 2)=1);
end
else
begin
// 列举出当前局面下一步所有可能的走法
Count := m_pMG.CreatePossibleMove(CurPosition, nDepth, (m_nMaxDepth - nDepth) mod 2);
for i:=0 to Count-1 do
begin
// 根据走法产生新局面
MoveType := MakeMove(m_pMG.m_MoveList[nDepth]);

// 递归调用负极大值搜索下一层的节点
score := -NegaMax(nDepth-1);

// 恢复当前局面
UnMakeMove(m_pMG.m_MoveList[nDepth], MoveType);

if score > current then // 如果score大于已知的最大值
begin
current := score
// 修改当前最大值为score
if nDepth = m_nMaxDepth then
begin
// 靠近根部时保存最佳走法
m_cmBestMove := m_pMG.m_MoveList[nDepth];
end;
end;
end;
Result := current
// 返回极大值
end;
end;
 
// 负极大值搜索引擎
function CNegamaxEngine.NegaMax(nDepth: Integer): Integer;
var
current, score: Integer;
i, Count: Integer;
MoveType: Byte;
begin
current := -20000;

i := IsGameOver(CurPosition, nDepth)
// 检查棋局是否结束
if i <> 0 then
begin
// 棋局结束,返回极大/极小值
Result := i;
exit;
end;

if nDepth <= 0 then
begin
// 返回估值
Result := m_pEval.Evaluate(CurPosition, ((m_nMaxDepth - nDepth) mod 2)=1);
end
else
begin
// 列举出当前局面下一步所有可能的走法
Count := m_pMG.CreatePossibleMove(CurPosition, nDepth, (m_nMaxDepth - nDepth) mod 2);
for i:=0 to Count-1 do
begin
// 根据走法产生新局面
MoveType := MakeMove(m_pMG.m_MoveList[nDepth]);

// 递归调用负极大值搜索下一层的节点
score := -NegaMax(nDepth-1);

// 恢复当前局面
UnMakeMove(m_pMG.m_MoveList[nDepth], MoveType);

if score > current then // 如果score大于已知的最大值
begin
current := score
// 修改当前最大值为score
if nDepth = m_nMaxDepth then
begin
// 靠近根部时保存最佳走法
m_cmBestMove := m_pMG.m_MoveList[nDepth];
end;
end;
end;
Result := current
// 返回极大值
end;
end;
 
问题在你的current 变量吧,每一次进入这个过程current 都被设置为 -20000了,而不是可能的上次找出来的结果,知道了原因解决方法就简单了:既然NegaMax是一个对象的方法,那就把current 变量作为一个对象成员变量即可[8D]
 
同意thx1180
你可以把这个方法改改
function CNegamaxEngine.NegaMax(nDepth: Integer
var pCurrent: Integer): Integer;
在递归调用时将pCurrent作为参数在传入此过程中
 
后退
顶部