와 미니 맥스 알고리즘 알파-베타 가지 치기

와 미니 맥스 알고리즘 지금까지 인공 지능(인공 지능)의 출현 이후,게임 플레이는 인공 지능의 가장 흥미로운 응용 프로그램 중 하나가되었습니다.

최초의 체스 프로그램은 1950 년 클로드 섀넌과 앨런 튜링에 의해 작성되었다,거의 즉시 컴퓨터가 프로그램되었다.

체스,틱택 토,바둑과 같은 게임은 두 군대 간의 경쟁에 대한 순수한 추상화를 제공하기 때문에 흥미 롭습니다.

이 추상화는 게임을 인공 지능 연구에 매력적인 영역으로 만듭니다.

이 기사에서는 알고리즘의 기능과 함께 미니 맥스 알고리즘의 기본 사항을 살펴 보겠습니다.

우리는 또한 미니 맥스 알고리즘의 최적화를 살펴 보겠습니다,알파-베타 가지 치기.

미니맥스 알고리즘은 무엇입니까?

미니맥스는 다른 플레이어도최적으로 플레이한다고 가정하는 플레이어의 최적 이동을 선택하는 데 사용되는 재귀 알고리즘입니다.

틱택 토,바둑,체스,이솔라,체커 및 기타 여러 2 인용 게임과 같은 게임에 사용됩니다.

이러한 게임은 특정 게임의 가능한 모든 움직임을 볼 수 있기 때문에 완벽한 정보의 게임이라고 불린다.

상대의 움직임을 예측할 수 없기 때문에 글자 맞추기와 같은 완벽한 정보가 아닌 2 인용 게임이있을 수 있습니다.

그것은 우리가 게임을 할 때 우리가 생각하는 방식과 유사하다:”나는이 움직임을 만들 경우,내 상대는 이러한 움직임을 만들 수 있습니다,”등등.

최소값은 다른 플레이어가 최대 손실을 갖는 전략을 선택할 때 손실을 최소화하는 데 도움이되기 때문에 그렇게 불립니다.

용어

  • 게임 트리:그것은 당신이 다음 상태로 게임의 상태에서 이동할 수 있도록 가능한 모든 움직임으로 구성된 트리의 형태로 구조입니다.

게임은 다음 구성 요소의 검색 문제로 정의 할 수 있습니다:

  • 초기 상태:그것은 보드의 위치를 구성하고 누구의 이동 그것이 보여주는.
  • 후속 기능: 그것은 플레이어가 할 수있는 법적 움직임이 무엇인지 정의합니다.
  • 끝 국가:게임이 넘어서 얻을 때 널의 위치입니다.
  • 유틸리티 기능:게임의 결과에 숫자 값을 할당하는 함수입니다. 예를 들어,체스 또는 틱택 토에서 결과는 승리,손실 또는 무승부이며 각각+1,-1 또는 0 값으로 나타낼 수 있습니다. 가능한 결과의 훨씬 더 큰 범위를 가지고 게임이 있습니다;예를 들어,주사위 놀이의 유틸리티는+192 에서-192 까지 다양합니다. 유틸리티 함수는 보수 함수라고도 할 수 있습니다.

알고리즘은 어떻게 작동합니까?

최소 및 최대라는 게임에 관련된 두 선수가 있습니다. 플레이어 최대 가능한 가장 높은 점수를 얻기 위해 시도하고 최소 즉,최소 및 최대 서로의 반대 역할을하려고,가장 낮은 점수를 얻기 위해 시도합니다.

의 일반적인 프로세스 Minimax 알고리즘은 다음과 같습니다:

1 단계:최초 생성,전체 게임무를 시작으로 현재의 위치를 게임에 모든 방법 개까지 터미널다. 이 게임 트리 게임 틱택 토에 대한 모습입니다.

틱택 토 게임 트리

우리는 위의 다이어그램의 관점에서 정의 된 용어를 이해하자.

  1. 초기 상태는 보드가 비어 있음을 정의하는 첫 번째 레이어입니다.
  2. 후속 함수는 가능한 모든 후속 이동을 나열합니다. 트리의 모든 레이어에 대해 정의됩니다.
  3. 터미널 상태는 최종 상태를 보여주는 트리의 마지막 계층입니다.
  4. 이 경우 터미널 상태에 대한 유틸리티는 앞에서 설명한 것처럼 1,0 및-1 이며 다른 노드의 유틸리티를 확인하는 데 사용할 수 있습니다.

2 단계:유틸리티 기능을 적용하여 모든 터미널 상태에 대한 유틸리티 값을 가져옵니다.
3 단계:터미널 노드의 유틸리티를 사용하여 상위 노드의 유틸리티를 결정합니다. 예를 들어,아래 다이어그램에서,우리는 사각형에 기록 된 터미널 상태에 대한 유틸리티가 있습니다.

최소 최대 알고리즘 단계 2

터미널 위의 레이어의 왼쪽 노드(빨간색)에 대한 유틸리티를 계산합시다. 이 플레이어 분의 움직임이기 때문에,우리는 모든 유틸리티의 최소 선택합니다. 이 경우 최소{3,5,10}을 평가해야하며 이는 확실히 3 입니다. 따라서 빨간색 노드에 대한 유틸리티는 3 입니다.

마찬가지로,같은 계층의 녹색 노드에 대해,우리는 2 인 최소{2,2}를 평가해야 할 것입니다.

최소 알고리즘

단계 4: 나무의 뿌리까지 한 번에 하나의 레이어를 고려 잎의 도움으로 유틸리티 값을 계산합니다.
5 단계:결국 모든 백업 값이 트리의 루트,즉 최상위 지점에 도달합니다. 이 시점에서 맥스는 가장 높은 값을 선택해야합니다.

이 예제에서는 3 개의 레이어 만 있으므로 즉시 루트에 도달했지만 실제 게임에서는 더 많은 레이어와 노드가있을 것입니다. 그래서 우리는 3 인 최대{3,2}를 계산해야합니다.

따라서 최대에 가장 적합한 개방 이동은 왼쪽 노드(또는 빨간색 노드)입니다. 이 움직임은 상대방이 그것을 최소화하기 위해 최적으로 놀고 있다는 가정에 따라 유틸리티를 극대화하기 때문에 최소 최대 결정이라고합니다.

요약하면

최소 최대 결정=최대{최소{3,5,10},최소{2,2}}
=최대{3,2}
= 3

프세도코드는:

function minimax(node, depth, maximizingPlayer) if depth = 0 or node is a terminal node return the utility of the node if maximizingPlayer bestValue := ?? for each child of node v := minimax(child, depth ? 1, FALSE) bestValue := max(bestValue, v) return bestValue else (* minimizing player *) bestValue := +? for each child of node v := minimax(child, depth ? 1, TRUE) bestValue := min(bestValue, v) return bestValue

최적화

게임 트리는 일반적으로 빌드하는 데 시간이 많이 걸리며 짧은 시간 내에 생성 할 수있는 간단한 게임에만 해당됩니다.

(비\)법적 움직임이있는 경우,즉.,\(비\)각 지점의 노드와 트리의 최대 깊이는\(미디엄\),최소 최대 알고리즘의 시간 복잡도는 순서\(비^미디엄(영형(비^미디엄))\).

이 상황을 억제하기 위해 알고리즘에 추가 할 수있는 몇 가지 최적화가 있습니다.

다행히 게임 트리의 모든 노드를 보지 않고도 실제 미니맥스 결정을 찾을 수 있습니다. 따라서 우리는 분석하지 않고 트리에서 노드를 제거하며,이 프로세스를 가지 치기라고합니다.

알파-베타 가지 치기

이 기사에서 살펴볼 방법을 알파-베타 가지 치기라고합니다.

표준 최소 최대 알고리즘에 알파-베타 가지 치기를 적용하면 표준 알고리즘과 동일한 이동을 반환하지만 최종 결정에 영향을 미치지 않는 모든 노드를 제거(자두)합니다.

우리가 먼저 뒤에 직관을 이해하자 그리고 우리는 알고리즘을 공식화 할 것이다. 게임 트리가 있다고 가정합니다.
인공 지능에 대한 알파-베타 가지 치기

이 경우
최소 최대 결정=최대{최소{3,5,10},최소{2,에이,비},최소{2,7,3}}
=최대{3,씨,2}
= 3

당신은 놀랄 것입니다!

누락 된 값으로 최대 값을 어떻게 계산할 수 있습니까? 여기에 트릭이 있습니다. 최소{2,ㅏ,비}확실히 2 보다 작거나 같음,즉 씨<=2 따라서 최대{3,씨,2}는 3 이어야합니다.

이제 질문은 우리가 정말로 계산해야합니까? 물론 아닙니다.

우리는 그 노드를 보지 않고 결론에 도달 할 수있었습니다. 그리고 이것이 알파-베타 가지 치기가 그림에 나오는 곳입니다.

몇 가지 정의:

알파:지금까지 플레이어 맥스에 가장 적합한 선택입니다. 우리는 여기서 가능한 가장 높은 가치를 얻고 싶습니다.
베타: 그것은 분 지금까지 최선의 선택이며,그것은 가장 낮은 가능한 값이어야한다.

참고:각 노드는 알파 및 베타 값을 추적해야 합니다. 알파는 최대 차례 일 때만 업데이트 할 수 있으며 마찬가지로 베타는 최소의 기회 일 때만 업데이트 할 수 있습니다.

알파-베타 가지 치기는 어떻게 작동합니까?

  1. 알파=-무한대 및 베타=무한대를 최악의 경우로 초기화합니다. 노드를 정리하는 조건은 알파가 베타보다 크거나 같아지는 경우입니다.알파 베타 가지 치기
  2. 알파와 베타의 초기 값을 루트에 할당하는 것으로 시작하고 알파가 베타보다 작기 때문에 우리는 그것을 가지 치기하지 않습니다.
  3. 이 알파 및 베타 값을 왼쪽의 자식 노드로 전달합니다. 그리고 이제 터미널 상태의 유틸리티 값에서 알파 값을 업데이트 할 것이므로 베타 값을 업데이트 할 필요가 없습니다. 다시 말하지만,우리는 조건이 동일하게 유지되기 때문에 가지 치기하지 않습니다. 마찬가지로,세 번째 자식 노드도. 그 알파가 가질 수있는 최소 값이기 때문에 그리고 루트에 역 추적 우리는 알파=3 을 설정합니다.
  4. 이제 알파=3 과 베타=루트에서 무한대. 그래서 우리는 가지 치기를하지 않습니다. 이것을 중앙 노드로 옮기고 최소{2,무한대}를 계산하면 알파=3 과 베타=2 가됩니다.
  5. 알파가 이제 베타보다 크기 때문에 두 번째 및 세 번째 자식 노드를 정리합니다.
  6. 루트의 알파는 2 보다 크기 때문에 3 으로 유지됩니다. 이것을 가장 오른쪽 자식 노드로 옮기고 최소{무한대,2}=2 를 평가합니다. 베타 버전을 2 로 업데이트하고 알파는 3 으로 유지됩니다.
  7. 알파가 이제 베타보다 크기 때문에 두 번째 및 세 번째 자식 노드를 정리합니다.
  8. 따라서 왼쪽,가운데 및 오른쪽 최소 노드에서 각각 3,2,2 를 얻습니다. 그리고 최대{3,2,2}를 계산하면 3 이됩니다. 따라서 4 개의 잎을 보지 않고도 미니 맥스 결정을 올바르게 찾을 수 있습니다.

의사 코드):

evaluate (node, alpha, beta) if node is a leaf return the utility value of node if node is a minimizing node for each child of node beta = min (beta, evaluate (child, alpha, beta)) if beta <= alpha return beta return beta if node is a maximizing node for each child of node alpha = max (alpha, evaluate (child, alpha, beta)) if beta <= alpha return alpha return alpha

결론

게임은 매우 매력적이며 게임 플레이 프로그램을 작성하는 것은 아마도 훨씬 더 흥미 롭습니다. 어떤 그랑프리 경주 자동차 산업에,게임 플레이는 인공 지능에 있습니다.

경주용 자동차가 울퉁불퉁 한 길에서 완벽하게 달릴 것으로 기대하지 않는 것처럼,게임 플레이 알고리즘이 모든 상황에 완벽 할 것으로 기대해서는 안됩니다.

은 최소 최대 알고리즘입니다. 그것은 인공 지능이 필요한 모든 종류의 컴퓨터 게임에 대한 최선의 해결책이 아닐 수도 있습니다.

그러나 좋은 구현을 감안할 때,그것은 힘든 경쟁자를 만들 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.