所以我最近看的是用于零和游戏的minimax函数。我完全理解它,除了如何为实际功能实现电路板:
例如,我发现的这个示例实现有这个声明:
int miniMax(Board eval, int iterations)
我唯一的问题是究竟是什么Board
?它是结构,类,数组还是其他结构?另外,我如何实现mini-max的样板,如tic-tac-toe board(例如)?在维基百科或谷歌上找不到任何东西。
答案 0 :(得分:3)
Board就是当前的棋盘游戏。它可以是您用来代表游戏板的任何结构。
首先调用时,minimax函数将接收当前的板配置,由目前为止的不同播放(当前游戏状态)达到。在minimax函数中,您所做的是修改板,每个修改应该代表根据游戏规则的可能移动。每个修改过的板都应作为参数传递给新的minimax调用。一旦达到某个深度(这是多次迭代),您可以使用评估函数选择最佳移动,为每个修改过的棋盘分数并选择得分最高的棋盘。
您正在阅读的算法是通用的,可以适用于任何游戏。您可以根据方便来定义Board,也就是说,最适合您想要代表的游戏板。
对于tic-tac-toe,您可能希望使用3x3阵列代表电路板,以便更改电路板:
int miniMax(char board[3][3], int iterations)
或者,您可能想要为每个方块使用2位代表您的电路板:
typedef struct {
unsigned square1: 2;
unsigned square2: 2;
unsigned square3: 2;
unsigned square4: 2;
unsigned square5: 2;
unsigned square6: 2;
unsigned square7: 2;
unsigned square8: 2;
unsigned square9: 2;
} Board;
尽管如此,对于井字游戏,您不需要轻量级的板表示,因为它的最大深度仅为9.我只是给您举例让您了解它可以是您用来表示板的任何结构游戏。
如果你要处理minimax功能并且游戏比tic-tac-toe复杂得多,你应该认真考虑使用alpha-beta pruning这是一个很大的改进。
编辑:我认为你不应该把你的电路板称为“eval”,因为这可能会与评估功能混淆,这是完全不同的事情。
答案 1 :(得分:2)
board ,正如您所编写的那样,只是使用 minimax 和许多其他决策树算法的常见结构。
它意味着包含有关游戏特定状态的信息的结构。在算法本身,从逻辑的角度来看,这个参数应该是不可修改的,因为你将在板上移动并生成新的板快照(所以旧的板快照不会被修改)当你深入到树的你正在评估的动作是为了找到更好的策略。
实际上,在内部有两个元素是很有用的:规则集(你可以应用于通过移动来有效地修改它的状态)和一个状态,它会在每次迭代时改变(即使是董事会本身它仍然是相同的),这是用于评估一个玩家的移动有多好的对象(当达到最大深度时,你不得不仅仅通过状态来估计移动的优劣)。
所以它可以是任何东西,它只是一个概念参数。如果你真的想要更实用的东西,我会以类似的方式想象它:
class BoardSnapshot {
Board b;
float alpha;
State state;
int evaluate();
}
class Board {
List<Players> players;
List<Rules> rules;
State applyMove(State current, Player player, Rule rule, params ...);
}
因此,您使用没有当前状态的BoardSnapshot
初始化它,并应用规则并生成一个新状态,该状态将是当前所选树分支的快照。