QT五子棋详解之八:min-max优化的负极大值算法兼谈qt内存泄露

本文详细解释了QT五子棋中min-max算法的优化——负极大值搜索,对比了两种算法的伪代码,并探讨了如何在QT中避免内存泄漏,特别是在处理大量节点时需要注意的内存管理技巧。
摘要由CSDN通过智能技术生成



负极大值搜索作为min-max博弈算法的优化,其本质上没有任何区别。

负极大值搜索它的效率也不会快多少,只是它的代码更加优雅简洁。更好进行代码的移植。

我们将min-max博弈算法与负极大值算法的伪代码发出来比较一下。不加那个剪枝的

int MinMax(int depth) {
if (SideToMove() == WHITE) { // 白方是“最大”者
return Max(depth);
}
else {           // 黑方是“最小”者
return Min(depth);
}
}


int Max(int depth) {
int best = -INFINITY;
if (depth <= 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = Min(depth - 1);
UnmakeMove();
if (val > best) {
best = val;
}
}
return best;
}


int Min(int depth) {
int best = INFINITY; // 注意这里不同于“最大”算法
if (depth <= 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = Max(depth - 1);
UnmakeMove();
if (val < best) {  // 注意这里不同于“最大”算法
best = val;
}
}
return best;
}
上面的代码可以这样调用:
val = MinMax(5);

对比负极大值算法的伪代码是不是代码更加风骚:


要从极大极小值过渡到负极大值搜索,需要理解几个方面:

1、极大极小值对每一个点的评估都是对于电脑来说的。而负极大值是对于本层来说的。如第一层是黑棋,那么这一层的分数是对于黑棋来说的,下一层是白棋层,那么这些点的分数是对于白棋的角度来看的。

2、max(deep-1)=-min(deep-1).假设本层为黑棋层,求本层某个点对于黑棋的分数,实际是求下一层白棋对于下一点的分数的负数。

3、每一层都是选的最大值,因为这个值是当前玩家的角度对于局势的评价。

看图说话:在这个局面,下面的点的得分是白棋对于局面的评价。




那么对于黑棋来说,上面的点的得分又是多少呢?

首先对于白棋来说,其会选择对其最有利的一个点:


黑棋对其取负数,就变成了黑棋对这个局势的评价:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值