回 帖 发 新 帖 刷新版面

主题:讨论一下黑白棋估值的问题

想了解一下这方面的东西,今天特意的把黑白棋《策略基础》过了一遍,之前算是一个黑白棋白痴级新手,有点感悟。

黑白棋的规则是子越多越好,但多子策略是个非常坏的策略,虽然到了终局是看谁子多,但它变化太多,不到最后一步放下,胜负难分,它介绍了一个极端情况,一颗黑子在中心,其余全部是白子,但是空出了四个角,结果四步之内,黑子胜,我原来想,在临近终局的时候考虑一下子力平衡,看来还是没这必要。

黑白棋的估值完全是一个策略估值,策略不好棋力急剧下降,我的程序的估值是采用特定位置上的价值+行动力的价值,棋力只能算新手之上,只能解决我等新手,跟WZebra下,31:33输了(我同时开两个程序,我当中间者),而它只搜索了1层,配上开局库,残局库,我搜了7层,没任何开局库之类的东西。

刚和WZebra下了一盘,1层深度下平手,呵呵~~菜吧。

有这方面资料提供我吗,感谢!

回复列表 (共8个回复)

沙发

看看~估值多有用,你7层还不死机,厉害哦?
google:
http://blog.csdn.net/NowCan/category/73614.aspx
http://blacwet.diy.myrice.com/evaluation.htm

板凳

原来WZebra是号称人类不可能击败的黑白棋程序~

3 楼

我刚才也看了很多资料,现在棋力很强的程序都是用的模板估值,中局搜7层是有些慢,我加了时间控制的,5,6层速度还可以。

我现在对‘潜在的行动力’不理解,查了黑白棋术语也没说明。我觉得行动力和边界(frontier)是差不多的量级的东西,是不是估边界更合理一些?

4 楼

你看第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 楼

不好意思,那是最大行动力。

6 楼

又找了一个估值程序,潜在行动力就是对方临近的子数,挨着对方的子,你下一步就可以把棋放在另一端,这就是一个潜在行动力. 除非敌方的子已经到边界了,但这个没有判断边界.
///////////////////
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 楼

那个余裕手是什么?

8 楼

http://blacwet.diy.myrice.com/tactics.htm

引用:"余裕手指的是自己可以下棋而对方不能下的地方,高手对局时,余裕手显得特别重要,因为一方如果多于对方两个余裕手则基本上已经胜定了。 " (这么恐怖?)

6楼那个程序含check的一段就是同时算了行动力和余裕手.

我来回复

您尚未登录,请登录后再回复。点此登录或注册