社区
数据结构与算法
帖子详情
谁能给个黑白棋的评估函数的算法
nkfish
2003-12-29 11:47:02
写了搜索算法以后,评估函数跟不上,还是太弱了,快没时间了,请帮忙给个评估函数(就当前局面),最好使用C或C++描述的
谢谢!
...全文
972
27
打赏
收藏
谁能给个黑白棋的评估函数的算法
写了搜索算法以后,评估函数跟不上,还是太弱了,快没时间了,请帮忙给个评估函数(就当前局面),最好使用C或C++描述的 谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
27 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dcyu
2004-01-27
打赏
举报
回复
哪说的上是指点,偶的程序棋力有限的狠,你说的那么多我都没有考虑到程序中去,“防固定套路下死”原来是指随机化下子方法,那只要加些随机性就可以了,我想这不是问题的最关键的地方。
当时做黑白棋的时候还没有xp,所以没有测试,csdn有个yanwl的黑白棋是偶同学帮我改成win32的,你用那个下试试看。
估值动态是说,根据角的状态来估值,如果在中局可以吃到角,那角的价值就减半,可以去
寻求其他机会,毕竟已经是囊中之物。残局中边的利益成为关键,角不见得是必争的地方。
我所知道李开复也写过黑白棋,他是基于统计来进行棋型的识别,从而根据局面来下子,
那样已经不把某个局部的得失看得很重要,是大处着手,这种方法对偶来说太遥远了,统计
和棋型都是基于数据库的。
在我的程序中初局、中局、残局是根据当前下的子的数量来划分的,尽管不合理,
但写完后对最后的棋力没有影响。
wzebra太强了,仅用它来判定某个程序的棋力肯定不行,应该找很多黑白棋程序排个座次,
依位而定。不过wzebra有个bug,只要在走的时候悔过一两步,它的棋力会大减,甚至连人也下不过。
dcyu
2004-01-26
打赏
举报
回复
呵呵,我当时没有想那么多,黑白棋确实博大精深,我用的可以说算是最基本的博弈算法。
太高深的自己没有去研究。程序写完后能下过自己就觉得很有成就感了。
偶最后的版本估值是动态,智能会稍高,除了估值,其实可以考虑的东西还有很多,初局和中局重要的是棋型和四角的利益,残局重要的是棋的数量。我个人觉得黑白棋是一个很机器化的游戏,“固定套路下死”的问题可以不用考虑太多,这是人下的思路。考虑后对棋力的提高可能没有其他方面好。
比较强的黑白棋确实可以想到10步以上,那是他们剪枝做的好,在参数选择上下了大工夫了,剪枝如果配合上数据库可能会很强。你可以试试剪枝的效果,时间会节省很多,自然深度就上去了,黑白棋深度比广度重要,你不必对所有的位置做广度优先计算,个人觉得应该从深度优先考虑。
我最早做黑白棋是在01年,当时我见到的黑白棋程序还不多,我在csdn上发表后,有两个人写信给我说他们也做了黑白棋,我和他们的程序对战后败了,呵呵。现在网上黑白棋程序可多了,你也可以找一些来下下看。
CD2006
2004-01-26
打赏
举报
回复
小弟确知行动力一说,但如何将其量化?是否一味限制对方行动力,增强己方行动力?这样能赢?恳请指点
bopengbopeng
2004-01-26
打赏
举报
回复
评估函数靠棋盘表是绝对不够的,行动力好多了,但也不够。
bopengbopeng
2004-01-26
打赏
举报
回复
想判断自己的程序棋力,跟wzebra下吧
http://www.nada.kth.se/~gunnar/download.html
CD2006
2004-01-26
打赏
举报
回复
另外,阁下的软件download后,在windows xp下没法用?
dcyu
2004-01-25
打赏
举报
回复
恩,我没有用剪枝,所以会比较慢。
当时剪枝算法还没有想清楚就急忙发布了,现在也没再做下去。
theoldman
2004-01-25
打赏
举报
回复
dcyu(Dd) 是黑白棋我下过(在其个人主页上下载的),还可以,但当难度为7或8级时,电脑思考的时间是不是过长了。只是个人看法。
dcyu
2004-01-25
打赏
举报
回复
静态估值:
角900,内角-600,其他0,
深度搜索6步,广度搜索8步,残局穷举。
这已经就足够强了。
再加上alpha-beta剪枝优化速度,就差不多了。
http://www.csdn.net/cnshare/soft/12/12266.shtm
CD2006
2004-01-25
打赏
举报
回复
其实,你的AI强不强,拿到yahoo 游戏厅 在线跟别人对抗一下,就知道了,黑白棋博大精深,我过去就自不量力的测试过,对棋盘上所有可能位置都深度搜索到6步,且告诉了一些经验给电脑,结果还是惨败而归,胜率很低,要想赢黑白高手,这种个位数的预测,是不行的,而且对于“防固定套路下死”问题楼上的 一星少将 可有想过? 有何高见?
dcyu
2004-01-25
打赏
举报
回复
我觉得那个静态估值还算比较准确,如果可以根据棋面状况动态估值会更好些。
Nowcan写的一个也不错,level高的时候也会挺慢的。
CD2006
2004-01-24
打赏
举报
回复
这是本人很早写的一个被本人称做Alpha Thinker 的黑白棋AI Engine 。既然是Alpha 版
当然有点弱,可容忍状态是六步,偶当时没有时间,这一版并未用到Alpha-Beta 剪枝算法,不然可预测到更深的程度,而且并未融合“防定势下死”技术,这些东西我不想多说,相信楼主明白处理方法,说实话,这一版只是一个基础,(所有原代码也未给出,只给了核心数据结构和估值函数)能给楼主一点启发,我也心满意足了!
我更希望各路高手能不吝赐教,给我宝贵指点。 谢谢!!
CD2006
2004-01-24
打赏
举报
回复
偶将内核写成了一个Othello类,将一系列的运算和操作封装在此类中,具体定义如下:
typedef struct MapInfo
{
int color;
int state;
} MapInfo;
typedef struct Direction
{
int x;
int y;
} Direction;
class Othello
{
private:
bool InBoundary(int x,int y); // 判断坐标(x,y)是否在棋盘边界内
void Copy(MapInfo map[9][9],MapInfo aim[9][9]); //拷贝棋盘
void tricks(int x,int y,int & goal); //经验加分函数
public:
int step; //已下步数记录
int MAX_SEARCH_STEP; //搜索的最大深度
MapInfo map[9][9]; //棋盘信息
Direction dir[9]; //方向数组
Othello(int status=1); //构造函数
bool WhetherCanGo(int who); //判断当前人是否有棋可走
bool Coordinates_Legal(int x,int y,int who); //判断当前人输入的坐标是否合法
void Modify_States(int x,int y); //改变棋盘状态
void Modify_Colors(int x,int y,int who); //改变棋盘颜色
int benefit(int who,int x,int y); //计算当前人在(x,y)坐标落子后,吃对方棋子数
int tryit(int who,int depth); //估值函数
void Init(int status = 1); //重新初始化函数
};
2. Alpha Thinker© 人工智能函数的具体算法:
int Othello::tryit(int who,int depth)
// 本函数计算当前人who的最高综合利益得分并返回其值
// who :当前人: COMPUTER=1;CHALLENGER=-1;
//depth :当前还剩下的,需搜索的博弈树层数
{
int i,j,
best_x=0,best_y=0, //记录最大利益点的坐标
max_goal=0, //记录最大利益
goal,counterpart;
counterpart=who*(-1); // 根据当前者,确定对方
Copy(map,backup.map); // 备份棋盘
if (depth==0)
return 0; //已达最大深度,退出博弈树遍历
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
if (map[i][j].state==1) // 找出有可能的落子点
{
goal=benefit(who,i,j); //计算该点可吃对方棋子数
if(goal) //goal==0 表示当前人不可落子于此点
{ // goal!=0 表示当前人可落子于此点
Modify_States(i,j); // 在当前点试落一子
goal-=tryit(counterpart,depth-1); //递归计算综合利益
tricks(i,j,goal); //根据人为经验,对特殊点加分
if (best_x==0 || max_goal<goal)
{
best_x=i;
best_y=j;
max_goal=goal; //保存最大利益点和最大利益
}
}
Copy(backup.map,map); //恢复棋盘;
}
if (depth==MAX_SEARCH_STEP) // MAX_SEARCH_STEP 最大搜索深度
{ // 当depth==最大搜索深度,则在此点真正落子
Modify_Colors(best_x,best_y,COMPUTER);
Modify_States(best_x,best_y);
step++;
}
return max_goal; //返回最大利益值
}
nkfish
2004-01-09
打赏
举报
回复
没有答案怎么结帖啊
nkfish
2003-12-31
打赏
举报
回复
程序当然有,但很多没源代码,有代码的又不强
ZhangYv
2003-12-31
打赏
举报
回复
哦,黑白棋和五子棋我都不会下,所以不能给出什么局面评价函数。不过黑白棋的难度比五子棋更低,现在人基本上是无法胜电脑的,GOOGLE吧应该有程序。
ZhangYv
2003-12-31
打赏
举报
回复
哦,黑白棋和五子棋我都不会下,所以不能给出什么局面评价函数。不过黑白棋的难度比五子棋更低,现在人基本上是无法胜电脑的,GOOGLE吧应该有程序。
ZhangYv
2003-12-31
打赏
举报
回复
哦,黑白棋和五子棋我都不会下,所以不能给出什么局面评价函数。不过黑白棋的难度比五子棋更低,现在人基本上是无法胜电脑的,GOOGLE吧应该有程序。
nkfish
2003-12-30
打赏
举报
回复
受到了,我给你回信了,你发给我的是五子棋的,我说的是黑白棋,但还是非常感谢!
ZhangYv
2003-12-30
打赏
举报
回复
什么?我前2天就发给你了,没收到?
加载更多回复(6)
黑白棋
AI
算法
自己制作的
黑白棋
AI
算法
采用了alha-beta剪枝和比较准确的估值
算法
,有比较墙的智能水平
基于蒙特卡洛树搜索
算法
编写的
黑白棋
AI
算法
_Reversi-AI-based-on-Mont
基于蒙特卡洛树搜索
算法
编写的
黑白棋
AI
算法
_Reversi-AI-based-on-Monte-Carlo-tree-search
黑白棋
游戏
算法
提高指南
介绍
黑白棋
游戏
算法
的代码。帮助提高游戏的难度。
黑白棋
剪枝版_
黑白棋
_
黑白棋
游戏,当黑棋或者白棋占满整个棋盘,则占满棋盘的一方子获胜
黑白棋
研究(介绍
黑白棋
代码)
黑白棋
研究,包括代码,对
黑白棋
感兴趣的朋友可以研究下
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章