2016-06-20 5 views
1

나는 네 개의 연결을 재생하기 위해 negamax를 사용 해왔다. 내가 알아 차 렸던 점은, 알파 베타를 추가하면 잃어버린 움직임을 만들 때와 같이 때로는 "잘못된"결과를 얻는다는 것입니다. 나는 그것이 내가 찾고있는 깊이로 만들어야한다고 생각하지 않습니다. 알파 베타를 제거하면 그것이 어떻게되는지를 보여줍니다. 알파 베타가 실제 가능한 지점을자를 수 있습니까? 특히 깊이가 제한되어있을 때 특히 그렇습니다. 여기에 단지 경우 코드는 다음과 같습니다C++ Negamax 알파 베타 컷오프가 잘못 되었습니까?

int negamax(const GameState& state, int depth, int alpha, int beta, int color) 
{ 
    //depth end reached? or we actually hit a win/lose condition? 
    if (depth == 0 || state.points != 0) 
    { 

     return color*state.points; 
    } 

    //get successors and optimize the ordering/trim maybe too 
    std::vector<GameState> childStates; 
    state.generate_successors(childStates); 
    state.order_successors(childStates); 

    //no possible moves - then it's a terminal state 
    if (childStates.empty()) 
    { 
     return color*state.points; 
    } 
    int bestValue = -extremePoints; 
    int v; 
    for (GameState& child : childStates) 
    { 
     v = -negamax(child, depth - 1, -beta, -alpha, -color); 
     bestValue = std::max(bestValue, v); 
     alpha = std::max(alpha, v); 
     if (alpha >= beta) 
      break; 
    } 
    return bestValue; 
} 

답변

2

알파 - 베타 일부 실제로 실행 가능한 지점 (깊이가 제한된다 특히) 차단 할 수 있습니까?

알파 베타 알고리즘은 최소 최대와 같은 결과 가능성이 최종 결정에 영향을 미칠 수없는 지점을 멀리 치기 (루트 노드와 플레이의 라인에서 평가)하지만 (보통) 빠른 시간을 반환 (당신은 읽을 수 H. Fuller - 1973에 의한 Analysis of the alpha-beta pruning algorithm by Samuel의 증거.

당신은 을 사용하고 있습니다. Negamax 알파 베타 프래 닝하지만 알고리즘 구현을 단순화 한 변형입니다.

는 또한 fail-soft 비밀이 상황을 변경하지 않습니다.

물론 얕은 수심을 선택하면 나쁜 동작을 선택할 수 있지만 Minimax도 마찬가지입니다.

그래서 구현 오류가 있어야합니다.

표시된 코드는 나에게 맞는 것처럼 보입니다. 다음을 확인하십시오 :

  1. 루트 노드에서 negamax를 호출하는 방식.

    negamax(rootState, depth, −extremePoints, +extremePoints, color) 
    

    alpha/beta가 가능한 최저 및 최고 값은 다음과 같습니다 그것은 무언가 같이해야합니다.

    당신이 alpha/(예를 들어, aspiration windows) beta와 실제 점수가 초기 창 외부에 대해 서로 다른 초기 값을 사용하는 경우, 당신은 다시 검색을해야합니다.

  2. 주요 변형의 이동을 수집/저장/관리/전파하는 방법 (관련 코드가 누락 됨). PV 테이블과 같은 기술은 bestValue의 변경 사항과 관련이 있습니다. 이것이 문제라면 Minimax와 관련하여 순위에 대해 동일한 점수를 얻어야하지만 다른 최선의 방법은 다릅니다.

+0

고맙습니다. 제한된 깊이와 알파 베타에 대해 더 이상 의심 할 여지가 없습니다. 결국 그것은 구현 오류로 밝혀졌다 (나는 그것을 올바르게 멀티 쓰레딩하는 것을 망쳤다). – lightxbulb

0

질문은 루트 노드에서 알파와 베타를 초기화하는 방법입니다. 나는 그들을 표준 :: numerical_limits :: min() 및 std :: numeric_limits :: max()에 맞게 설정했기 때문에 알파 매개 변수를 negamax (... -a_beta, - a_alpha ...) 최소 int 값의 수학적 부정이 int (-214748364 대 214748364) 범위를 벗어 났으므로 최소 int 값을 여전히 산출하는 빼기 연산자를 추가하여 최소 int 값을 무효화했습니다.

그러나 알파를 다른 값 (예 : std :: numeric_limits :: min() + 1)으로 초기화하면 그렇지 않습니다.