AlphaBeta_SameStruct

/*

*文件名: AB剪枝

*创建人: 陈泽丹

*/

 

#pragma once
#include "SearchEngine.h"


class AlphaBeta_SameStruct: public SearchEngine
{
public:
 AlphaBeta_SameStruct(void);
 virtual ~AlphaBeta_SameStruct(void);
 void SearchAGoodMove();

private:
 //算法功能: 寻找突围点(突围点:突破对方包围圈的可行点,若不能突围则取包围圈里的最佳值(包围圈和返回值以客观价值观(绝对值)为标准)
 //解题角度: 价值观统一,而博弈双方的思路不统一
 //[in_dAlpha,+00)为Alpha的包围圈
 //(-OO,in_dBeta]为Beta的包围圈
 //当AB双方包围圈无交集时,当前层为何方,则何方突围
 //一般默认调用方式为TransformFum_AlphaBeta(-200000,200000,3,true,0);
 double TransformFum_AlphaBeta(const double in_dAlpha, const double in_dBeta, const int in_iLeftPly,
           const bool in_bCurIsAlpha, const int in_CurChessBoardID);
};

 

///////////////////////////////////////////////////

 

#include "AlphaBeta_SameStruct.h"

AlphaBeta_SameStruct::AlphaBeta_SameStruct(void)
{
}

AlphaBeta_SameStruct::~AlphaBeta_SameStruct(void)
{
}

void AlphaBeta_SameStruct::SearchAGoodMove()
{
 m_iNodeNum = 0;
 TransformFum_AlphaBeta(-200000,200000,m_iMaxDepth,true,0);
}

 //算法功能: 寻找突围点(突围点:突破对方包围圈的可行点,若不能突围则取包围圈里的最佳值(包围圈和返回值以客观价值观(绝对值)为标准)
//解题角度: 价值观统一,而博弈双方的思路不统一
//[in_dAlpha,+00)为Alpha的包围圈
//(-OO,in_dBeta]为Beta的包围圈
//当AB双方包围圈无交集时,当前层为何方,则何方突围
//一般默认调用方式为TransformFum_AlphaBeta(-200000,200000,3,true,0);
double AlphaBeta_SameStruct::TransformFum_AlphaBeta(const double in_dAlpha, const double in_dBeta, const int in_iLeftPly,
           const bool in_bCurIsAlpha, const int in_CurChessBoardID)
{
 m_iNodeNum++;
 if( 0 == in_iLeftPly)
 {
  int dV = 0;
  m_pcmtMove->GetItemData(in_CurChessBoardID, dV);
  return dV;
 }

 if( in_bCurIsAlpha)
 {
  int iAlpha = in_dAlpha;
  for(int i=0; i<m_pcmtMove->Path(); i++)
  {//搜索最好的走法
   int iChildID = 0;
   if( m_pcmtMove->GetChildID(in_CurChessBoardID, i, iChildID))
   {
    int iScore = TransformFum_AlphaBeta(iAlpha, in_dBeta, in_iLeftPly-1, !in_bCurIsAlpha, iChildID);
    if( iScore > iAlpha)
    {
     if( in_iLeftPly == m_iMaxDepth)
     {
      m_iBestID = iChildID;
      m_dBestValue = iScore;
     }
     iAlpha = iScore; //更新当前方包围圈
     if( iAlpha >= in_dBeta)
     {//已知Beta方的包围圈(-00,iBeta]
      //现在Alpha方的将获得的解空间[iAlpha,+00)与Beta方的解空间(-00,iBeta]无交集
      //即是说Alpha方的当前选择必将突破Beta方的包围圈!
      //所以不必再细搜索后面的情况了,可直接返回
      return iAlpha;
     }
    }
   }
  }
  return iAlpha;
 }
 else
 {
  int iBeta = in_dBeta;
  for(int i=0; i<m_pcmtMove->Path(); i++)
  {
   int iChildID = 0;
   if( m_pcmtMove->GetChildID(in_CurChessBoardID, i, iChildID))
   {
    int iScore = TransformFum_AlphaBeta(in_dAlpha, iBeta, in_iLeftPly-1, !in_bCurIsAlpha, iChildID);
    if( iScore < iBeta)
    {
     if( in_iLeftPly == m_iMaxDepth)
     {
      m_iBestID = iChildID;
      m_dBestValue = iScore;
     }
     iBeta = iScore; //更新当前方包围圈
     if( in_dAlpha >= iBeta)
     {//已知Alpha方的包围圈[iAlpha,+00)
      //现在当前方Beta方的将获得的解空间(-00,iBeta]与Alpha方的解空间[iAlpha,+00)无交集
      //即是说当前方Beta方的当前选择必将突破Alpha方的包围圈!
      //所以不必再细搜索后面的情况了,可直接返回
      return iBeta;
     }
    }
   }
  }
  return iBeta;
 }
 return 0;
}

你可能感兴趣的:(AlphaBeta_SameStruct)