当前位置: 首页 > 知识库问答 >
问题:

棋盘游戏 AI 的启发式函数

缪远航
2023-03-14

我试图为一个棋盘游戏找到一个更好的启发式函数,我将在代码后指定其规则。我的评估功能是:

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 令牌。这称为前锋攻击。同样,如果你有一个令牌与对手的令牌相邻,你可以离开它,删除该行中的所有令牌。

显然,黑格上的代币有更多可能的招式。

对人工智能来说,什么是好的启发式函数?我现在的职能应该改变什么?

共有1个答案

邬安邦
2023-03-14

你的功能确实很差:它计算右下角和作品数量。D8处的一块价值超过中间的三块。

我建议你使用当前的人工智能技术:不要让我们为你做研究,而是开发一个探索空间的程序。开发一个基础广泛的评估函数,并执行遗传搜索以优化该函数的参数。

例如,遍历所有的片段,而不是行

  • 占领黑色方块
  • 相邻的敌人碎片
  • 相邻的友好作品
  • 在边缘或边缘/角落附近
  • 可用移动

现在,让你的评价函数成为这些特征的线性组合。比如说,挑选100组参数。让这些程序在循环赛中互相竞争。

保留前 20 名完成者。通过突变和交叉再制作 80 组参数。重复比赛。

继续这些重复,直到程序强度收敛,或者至少达到让你满意的水平。

 类似资料:
  • 我对java完全陌生,我想在Java中创建一个单人棋盘游戏。 我已经有很多定义游戏的类,但是对于我的问题,我将把问题限制在为我的棋盘游戏创建GUI板 我非常具体的问题是,基于以下代码: 如何在棋盘游戏中移动玩家?(类播放器存在) 提前感谢您的得体回答。因为我对java非常陌生,请清楚地解释您的答案。 这是以下代码的输出:

  • 五子棋是是一种两人对弈的纯策略型棋类游戏。它有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩法二:自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。

  • 五子棋(Gomoku)是一款经典的线上五子棋游戏,5 子连成一线者胜。  

  • 我刚刚学习了Android和Java编程(里面非常noob),我想问一些关于Android编程和Socket服务器的问题。 我得到一个任务,创建一个简单的国际象棋应用程序(不包括AI),棋子的位置将从TCP套接字中检索: 服务器:xinuc.org 端口:7387 我被告知使用Socket Persistent,因为服务器会在每秒更新典当的位置,典当的位置将以这种格式发送 [卒典][横位][竖位]

  • 本文向大家介绍JavaScript实现一个带AI的井字棋游戏源码,包括了JavaScript实现一个带AI的井字棋游戏源码的使用技巧和注意事项,需要的朋友参考一下 最近有一门课结束了,需要做一个井字棋的游戏,我用JavaScript写了一个。首先界面应该问题不大,用html稍微写一下就可以。主要是人机对弈时的ai算法,如何使电脑方聪明起来,是值得思考一下的。开始游戏后,由玩家先行。那么站在计算机的

  • 此为在原版2048的基础上,添加了电脑AI解题,并稍微修改了UI添加按钮来触发AI。 AI的核心在/js/myAI.js里,相关函数在window.myPlugin里 核心算法是用dfs搜3步后使代价函数window.myPlugin.evalCost期望值最小的走法, 代价函数的设计目的是让块尽量按由大到小顺序堆叠在右上角,并合并。 实验效果是基本能保证到2048,偶尔到4096甚至8192(概率较小)。