谁能给个黑白棋的评估函数的算法

nkfish 2003-12-29 11:47:02
写了搜索算法以后,评估函数跟不上,还是太弱了,快没时间了,请帮忙给个评估函数(就当前局面),最好使用C或C++描述的

谢谢!
...全文
972 27 打赏 收藏 转发到动态 举报
写回复
用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)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧