主题:讨论一下黑白棋估值的问题
rickone
[专家分:15390] 发布于 2006-07-27 00:42:00
想了解一下这方面的东西,今天特意的把黑白棋《策略基础》过了一遍,之前算是一个黑白棋白痴级新手,有点感悟。
黑白棋的规则是子越多越好,但多子策略是个非常坏的策略,虽然到了终局是看谁子多,但它变化太多,不到最后一步放下,胜负难分,它介绍了一个极端情况,一颗黑子在中心,其余全部是白子,但是空出了四个角,结果四步之内,黑子胜,我原来想,在临近终局的时候考虑一下子力平衡,看来还是没这必要。
黑白棋的估值完全是一个策略估值,策略不好棋力急剧下降,我的程序的估值是采用特定位置上的价值+行动力的价值,棋力只能算新手之上,只能解决我等新手,跟WZebra下,31:33输了(我同时开两个程序,我当中间者),而它只搜索了1层,配上开局库,残局库,我搜了7层,没任何开局库之类的东西。
刚和WZebra下了一盘,1层深度下平手,呵呵~~菜吧。
有这方面资料提供我吗,感谢!
回复列表 (共8个回复)
沙发
euc [专家分:4310] 发布于 2006-07-27 12:01:00
看看~估值多有用,你7层还不死机,厉害哦?
google:
http://blog.csdn.net/NowCan/category/73614.aspx
http://blacwet.diy.myrice.com/evaluation.htm
板凳
euc [专家分:4310] 发布于 2006-07-27 12:42:00
原来WZebra是号称人类不可能击败的黑白棋程序~
3 楼
rickone [专家分:15390] 发布于 2006-07-27 14:37:00
我刚才也看了很多资料,现在棋力很强的程序都是用的模板估值,中局搜7层是有些慢,我加了时间控制的,5,6层速度还可以。
我现在对‘潜在的行动力’不理解,查了黑白棋术语也没说明。我觉得行动力和边界(frontier)是差不多的量级的东西,是不是估边界更合理一些?
4 楼
euc [专家分:4310] 发布于 2006-07-27 19:10:00
你看第2篇文章后面的程序,有一小段是算行动力的,贼简单啊:
///////////////////////////////
for i := 1 to 8 do
for j := 1 to 8 do
begin
if chessable(i, j, compColor) then //电脑在位置[i,j]可以下棋
inc(compMobility); //增加电脑的行动力
if chessable(i, j, oppColor) then //对手在位置[i,j]可以下棋
inc(oppMobility); //增加对手的行动力
end;
///////////////////////////////
ps:老实说我从小就不喜欢黑白棋,因为太菜...
5 楼
euc [专家分:4310] 发布于 2006-07-27 19:20:00
不好意思,那是最大行动力。
6 楼
euc [专家分:4310] 发布于 2006-07-28 10:21:00
又找了一个估值程序,潜在行动力就是对方临近的子数,挨着对方的子,你下一步就可以把棋放在另一端,这就是一个潜在行动力. 除非敌方的子已经到边界了,但这个没有判断边界.
///////////////////
float calc(int f[10][10]) //估值函数
{
int i,j;
float player_num=0,computer_num=0,num=0,
com_mob=0, // 电脑行动力
man_mob=0, // 玩家行动力
mob=0, // 余裕手
com_pmob=0, // 电脑潜在行动力
man_pmob=0, // 玩家潜行动力
Stab_num=0; // 稳定子
changecost(f);
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
{
if(f[i][j]==COMPUTER_COLOR)
num+=cost[i][j];
else if(f[i][j]==PLAYER_COLOR)
num-=cost[i][j];
else
{
if(f[i-1][j-1]==PLAYER_COLOR) com_pmob++;
else if(f[i][j-1]==PLAYER_COLOR) com_pmob++;
else if(f[i+1][j-1]==PLAYER_COLOR) com_pmob++;
else if(f[i-1][j]==PLAYER_COLOR) com_pmob++;
else if(f[i+1][j]==PLAYER_COLOR) com_pmob++;
else if(f[i-1][j+1]==PLAYER_COLOR) com_pmob++;
else if(f[i][j+1]==PLAYER_COLOR) com_pmob++;
else if(f[i+1][j+1]==PLAYER_COLOR) com_pmob++;
if(f[i-1][j-1]==COMPUTER_COLOR) man_pmob++;
else if(f[i][j-1]==COMPUTER_COLOR) man_pmob++;
else if(f[i+1][j-1]==COMPUTER_COLOR) man_pmob++;
else if(f[i-1][j]==COMPUTER_COLOR) man_pmob++;
else if(f[i+1][j]==COMPUTER_COLOR) man_pmob++;
else if(f[i-1][j+1]==COMPUTER_COLOR) man_pmob++;
else if(f[i][j+1]==COMPUTER_COLOR) man_pmob++;
else if(f[i+1][j+1]==COMPUTER_COLOR) man_pmob++; // 潜在行动力
if(check(i,j,COMPUTER_COLOR,f)>0)
{
com_mob++;
if(check(i,j,PLAYER_COLOR,f)<=0)
mob++;
}
else if(check(i,j,PLAYER_COLOR,f)>0)
{
man_mob++;
if(check(i,j,COMPUTER_COLOR,f)<=0)
mob--;
}
}
}
Stab_num=(float)(getstab(COMPUTER_COLOR,f)-getstab(PLAYER_COLOR,f));
//Stab_num=(float)(getstab(PLAYER_COLOR,f));
com_mob+=com_pmob+(float)0.2;
man_mob+=man_pmob+(float)0.2;
if(com_mob>man_mob)
return num+(com_mob/man_mob)*5+Stab_num*15+mob*10;
else return num-(man_mob/com_mob)*5+10+Stab_num*15+mob*10;
}
7 楼
rickone [专家分:15390] 发布于 2006-07-28 11:09:00
那个余裕手是什么?
8 楼
euc [专家分:4310] 发布于 2006-07-28 20:38:00
http://blacwet.diy.myrice.com/tactics.htm
引用:"余裕手指的是自己可以下棋而对方不能下的地方,高手对局时,余裕手显得特别重要,因为一方如果多于对方两个余裕手则基本上已经胜定了。 " (这么恐怖?)
6楼那个程序含check的一段就是同时算了行动力和余裕手.
我来回复