2013-12-08 3 views
0

4x4 tic-tac-toe 게임에서 작은 프로젝트를하고 있습니다. 나는 알파 베타 (Alpha Beta) 검색을 사용하여 다음으로 좋은 움직임을 찾습니다. 알파 베타 검색에서, 나는 성공적으로 모든 것을 구현함수가 음수 값을 반환하지 않습니다.

Alpha Beta Search

다음 알고리즘의 "유틸리티"함수에서 호출되는 컷오프 평가 기능을 사용하고 있지만, 문제는 유틸리티 기능하지 않는 것입니다 음수 값을 반환하고 나는 왜 그런지 정말로 모른다! O 유틸리티는 반환하도록되어 이기면가 MINVALUE 기능에서 호출

isMin

private static int utility(GameTreeNode gtn, bool isMin = false) 
{ 
    int nodeValue = 0; 
    switch (gtn.NodeBoard.getBoardStatus()) 
    { 
     case Status.Success: 
      nodeValue = 50; 
      if (isMin) nodeValue = -50; /// here 
      break; 
     case Status.Incomplete: 
      if (isMin) 
       nodeValue = gtn.evaluate(State.X); 
      else 
       nodeValue = gtn.evaluate(State.O); 
      break; 
    } 
    // case Status.Draw: 
    return nodeValue; 
} 
이 true로 설정되어있는 기능,

isMin는 O의 이동과 AI의 움직임이다 다음은 X.이다 -50. 그러나 0 만 반환합니다. 나는 프로그램을 디버깅하고 실제로 -50을 nodeValue (디버거에서 -50으로 변경하면 nodeValue)로 지정하지만 최소 또는 최대 기능으로 수신하면 0입니다.

참고 : 전체 프로젝트에서 사용되는 모든 int는 signed int입니다. 당신은 함수 호출자가

알파 - 베타 검색의 전체 코드 서명되지 생각하는 경우에 어떤 unsigned 키워드, 사용하지 않는 것은 여기에 있습니다 : http://pastie.org/8538015

하시기 바랍니다 친구는 가능한 한 빨리 도움이됩니다.

+0

pseudo-code에서'isMin'이'true'로 설정된'Utility'에 대한 호출을 보지 못했습니다 ... – MiMo

+0

내 코드에서 MinValue와 MaxValue의 호출을 구별하기 위해 of O from X) –

답변

1

메소드 서명에 선택적 매개 변수를 사용하고 있으므로 함수를 입력 할 때 코드가 실제로인지주의해야합니다. 당신은 당신이 그것을 디버깅하고 값이 할당된다고 말했지만, 많은 상황 중 하나에서만 발생하는지 여부를 알기에 충분한 컨텍스트가 없습니다. 어쨌든, 그냥 조심해!

나는이 같은 함수를 다시 작성 것이다 : 나는이 방법으로 볼 수

private static int utility(GameTreeNode gtn, bool isMin) 
{ 
    switch (gtn.NodeBoard.getBoardStatus()) 
    { 
     case Status.Success: 
      return isMin 
       ? -50 
       : 50; 
     case Status.Incomplete: 
      return isMin 
       ? gtn.evaluate(State.X) 
       : gtn.evaluate(State.O); 
     default: 
      throw new NotImplementedException("The status is not implemented."); 
    } 
} 

몇 가지 개선 사항 : 당신은 값을 저장하고 마지막에 그것을 반환 할 필요가 없습니다

  • 합니다. 귀하의 경우, Status.Success 경로를 취할 때 nodeValue에 50을 저장하고 가끔 -50을 할당하는 경우가 있습니다. 당신이 당신의 기능 중 하나의 복귀에 대해 견고하지 않다면, 나는이 접근이 더 분명하다고 생각합니다. 그래도 내 의견을 수 있습니다.
  • switch 문에 기본값이 있으므로 구현되지 않은 상태 인 경우 명시 적으로 예외가 발생합니다.
  • 함수에 대한 선택적 매개 변수는 입니다. 이 매개 변수를 선택적으로 만드는 이점은 없습니다. 제 의견으로는 디버깅하기가 더 어려워 진 것처럼 보입니다.

편집 :의 코드를 기반으로

: http://pastie.org/8538015#33,43 그것은 당신이 이제까지 유틸리티는 음의 값이에 명중 할 때 if (gtn.Nodes.Count == 0) return utility(gtn, true);입니다 반환 얻을 수있는 시간과 같은

private static int MinValue(GameTreeNode gtn, int alpha, int beta) 기능. 그렇지 않으면 게시하지 않은 코드가 더 이상 없으면 유틸리티 함수에 대한 다른 호출이 진행중인 논리 경로에 충돌하지 않습니다. 거기로 들어가면 nodeValue 값이 올바르게 할당 된 것을 볼 수 있습니다. 적어도 일시적으로

// if Terminal-test(state) then return utitly(state) 
if (gtn.Nodes.Count == 0) return utility(gtn, true); 
gtn.Value = Globals.MAXINT; 

// if Terminal-test(state) then return utitly(state) 
if (gtn.Nodes.Count == 0) 
{ 
    int retVal = utility(gtn, true); 
    return retVal; 
} 

gtn.Value = Globals.MAXINT; 

하려면 다음 return retVal에 중단 점을 넣어 :

나는 변경 제안하고있다. 당신의 유틸리티 함수 이라면 실제로 말하는 값을 설정하십시오. MinValue 함수로 반환 할 때 마술처럼 사라질 수는 없습니다. 나는 비린내 같은 일이 벌어지고 있고 코드가 실제로 당신이 생각하는 길을 실행하고 있지 않다는 느낌을 가지고 있습니다.

+0

직접적으로 리턴 할 수 있지만 디버거에서는 직접 리턴 할 때 값을 저장하지 않으므로, 단계별로 완료되었는지 여부를 확인할 수 있도록 값을 사용했습니다. 또한 발신자 기능에서도 동일한 작업을 수행 할 수 있습니다. 나는 minmax 함수도 올리고있다. 제발 –

+0

괜찮아, 공정한 :) 다른 코드가 올라 오면 다시 확인해 볼게. –

+0

게시 됨 - http://pastie.org/8538015에 있음 –

관련 문제