赞
踩
源码下载 http://www.byamd.xyz/hui-zong-1/
对抗问题
对抗问题:顾名思义,博弈双方是带有对抗性质的。博弈的任何一方都希望局面尽量对自己有利,同时局面也应该尽量令对方不利。通常这一类问题可以通过 Minimax 算法解决。
Minimax 算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。
Minimax 算法常用于棋类等由两方较量的游戏和程序,这类程序由两个游戏者轮流,每次执行一个步骤。
为了执行Minimax 算法,我们可以通过穷举的方式,枚举所有的状态空间,从而使得我们可以在游戏刚一开始,就预测到输赢。
但是,在实际情况下,游戏的状态空间都是异常庞大的。很显然,我们不能将以穷举方式实 现的Minimax 算法用于实际应用。
α-β 减枝
通过分析可以发现,在利用穷举方法执行 Minimax 算法中有许多的无效搜索,也就是说,许多明显较劣的状态分支我们也进行搜索了。
我们在进行极大值搜索的时候,我们仅仅关心,下面最大的状态,对于任何小于目前值 的分支也都是完全没有必要进行进一步检查的。(α 减枝)
通过上图,我们可以发现,我们可以减去大量无用的状态检查,从而降低我们的运算量。
同时,我们在进行极小值搜索的时候,我们仅仅关心,下面最小的状态,对于任何大于 目前值的分支都是完全没有必要进行进一步检查的。(β 减枝)
通过上图,我们可以发现,我们可以减去大量无用的状态检查,从而降低我们的运算量。 将上述所提到的 α 减枝与 β 减枝进行综合就可以得到 α-β 减枝。
对于对抗搜索而言,我们需要精心设计其估值函数,不然我们的 α-β 减枝将毫无用武之地。
五子棋问题
五子棋:**是一种两人对弈的纯策略型棋类游戏,通常双方分别使用黑白两色的棋子,下在棋 盘直线与横线的交叉点上,先形成 5 子连线者获胜。
源代码
#include “opencv2/imgproc/imgproc.hpp” #include “opencv2/imgcodecs.hpp”
#include “opencv2/videoio/videoio.hpp” #include “opencv2/highgui/highgui.hpp”
#include <iostream>
#include <iostream> #include <cstdio> #include <cstring> #include
<cstdio> #include <cstdlib> #include <iomanip>
using namespace std; using namespace cv;
//sro 菜神 Orz
cv::Mat chessboard, whiteChess, blackChess, tmp, BGS;
int is_red(Vec3b X) {
// cout << (int)X[1] << ’ ’ << (int)X[2] << ’ ’ << (int)X[3] <<
endl;
return X[0] < 200 && X[1] < 200 && X[2] > 230;
}
cv::Mat BG;
//将棋子复制到背景画面上
void imageCopyToBG(cv::Mat chess, int x, int y) {
x *= 35;
y *= 35;
int rows = chess.rows;
int cols = chess.cols;
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
if (!is_red(chess.at<Vec3b>(i, j))) {
BG.at<Vec3b>(x + i + 8, y
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。