棋盘游戏 AI 的启发式函数
Heuristic function for a board game AI
我正在尝试为我将在代码后指定规则的棋盘游戏找出更好的启发式函数。我的评价函数是这样的:
def evaluate(self, board):
score = 0
for i in range(board.LENGTH):
for j in range(board.WIDTH):
if board.board[i][j].token == "G":
score += 100 * (i+1) + 50 * (j + 1)
if board.board[i][j].token == "R":
score -= 100 * (i+1) + 50 * (j + 1)
return score
如图所示,最初的棋盘上有绿色和红色标记。人工智能首先移动,播放与您相反的颜色,攻击您的标记。在黑色单元格上,令牌可以正交(左、右、上、下)或对角线移动。如果它在白色单元格上,您只能正交移动。
当你将你的标记移动到对手的标记旁边时,你将移除该方向上所有对手的标记。例如,如果我将绿色标记从 C4 移动到 C5,我将杀死 C-6 到 C-9 上的所有 R 标记。这称为前向攻击。同样,如果你有一个与对手的标记相邻的标记,你可以远离它,移除该行中的所有标记。
显然,黑色方格上的标记有更多可能的走法。
对于 AI 来说什么是好的启发式函数?我应该在当前功能中更改什么?
你这个功能确实很差:它重视右下角和棋子的数量。 D8 的单件比中间的三件更值钱。
我建议您在 AI 中使用当前的技术:不要让我们为您做研究,而是开发一个程序来探索 space。开发一个广泛的评估函数并执行遗传搜索以优化该函数的参数。
例如,遍历所有片段,但使用
的特征代替行数和列数
- 占据黑色方块
- 相邻的敌人棋子
- 相邻友方棋子
- 在边缘/拐角处或附近
- 可用动作
现在,让你的评估函数成为这些特征的线性组合。比如说,选择 100 组参数。 运行 这些程序在循环赛中相互对抗。
保留前 20 名。通过变异和交叉制作另外 80 组参数。重复比赛。
继续这些重复,直到程序强度收敛,或者至少达到让你满意的发挥水平。
我正在尝试为我将在代码后指定规则的棋盘游戏找出更好的启发式函数。我的评价函数是这样的:
def evaluate(self, board):
score = 0
for i in range(board.LENGTH):
for j in range(board.WIDTH):
if board.board[i][j].token == "G":
score += 100 * (i+1) + 50 * (j + 1)
if board.board[i][j].token == "R":
score -= 100 * (i+1) + 50 * (j + 1)
return score
如图所示,最初的棋盘上有绿色和红色标记。人工智能首先移动,播放与您相反的颜色,攻击您的标记。在黑色单元格上,令牌可以正交(左、右、上、下)或对角线移动。如果它在白色单元格上,您只能正交移动。
当你将你的标记移动到对手的标记旁边时,你将移除该方向上所有对手的标记。例如,如果我将绿色标记从 C4 移动到 C5,我将杀死 C-6 到 C-9 上的所有 R 标记。这称为前向攻击。同样,如果你有一个与对手的标记相邻的标记,你可以远离它,移除该行中的所有标记。
显然,黑色方格上的标记有更多可能的走法。
对于 AI 来说什么是好的启发式函数?我应该在当前功能中更改什么?
你这个功能确实很差:它重视右下角和棋子的数量。 D8 的单件比中间的三件更值钱。
我建议您在 AI 中使用当前的技术:不要让我们为您做研究,而是开发一个程序来探索 space。开发一个广泛的评估函数并执行遗传搜索以优化该函数的参数。
例如,遍历所有片段,但使用
的特征代替行数和列数- 占据黑色方块
- 相邻的敌人棋子
- 相邻友方棋子
- 在边缘/拐角处或附近
- 可用动作
现在,让你的评估函数成为这些特征的线性组合。比如说,选择 100 组参数。 运行 这些程序在循环赛中相互对抗。
保留前 20 名。通过变异和交叉制作另外 80 组参数。重复比赛。
继续这些重复,直到程序强度收敛,或者至少达到让你满意的发挥水平。