/*
*文件名: 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;
}