와 미니 맥스 알고리즘 지금까지 인공 지능(인공 지능)의 출현 이후,게임 플레이는 인공 지능의 가장 흥미로운 응용 프로그램 중 하나가되었습니다.
최초의 체스 프로그램은 1950 년 클로드 섀넌과 앨런 튜링에 의해 작성되었다,거의 즉시 컴퓨터가 프로그램되었다.
체스,틱택 토,바둑과 같은 게임은 두 군대 간의 경쟁에 대한 순수한 추상화를 제공하기 때문에 흥미 롭습니다.
이 추상화는 게임을 인공 지능 연구에 매력적인 영역으로 만듭니다.
이 기사에서는 알고리즘의 기능과 함께 미니 맥스 알고리즘의 기본 사항을 살펴 보겠습니다.
우리는 또한 미니 맥스 알고리즘의 최적화를 살펴 보겠습니다,알파-베타 가지 치기.
미니맥스 알고리즘은 무엇입니까?
미니맥스는 다른 플레이어도최적으로 플레이한다고 가정하는 플레이어의 최적 이동을 선택하는 데 사용되는 재귀 알고리즘입니다.
틱택 토,바둑,체스,이솔라,체커 및 기타 여러 2 인용 게임과 같은 게임에 사용됩니다.
이러한 게임은 특정 게임의 가능한 모든 움직임을 볼 수 있기 때문에 완벽한 정보의 게임이라고 불린다.
상대의 움직임을 예측할 수 없기 때문에 글자 맞추기와 같은 완벽한 정보가 아닌 2 인용 게임이있을 수 있습니다.
그것은 우리가 게임을 할 때 우리가 생각하는 방식과 유사하다:”나는이 움직임을 만들 경우,내 상대는 이러한 움직임을 만들 수 있습니다,”등등.
최소값은 다른 플레이어가 최대 손실을 갖는 전략을 선택할 때 손실을 최소화하는 데 도움이되기 때문에 그렇게 불립니다.
용어
- 게임 트리:그것은 당신이 다음 상태로 게임의 상태에서 이동할 수 있도록 가능한 모든 움직임으로 구성된 트리의 형태로 구조입니다.
게임은 다음 구성 요소의 검색 문제로 정의 할 수 있습니다:
- 초기 상태:그것은 보드의 위치를 구성하고 누구의 이동 그것이 보여주는.
- 후속 기능: 그것은 플레이어가 할 수있는 법적 움직임이 무엇인지 정의합니다.
- 끝 국가:게임이 넘어서 얻을 때 널의 위치입니다.
- 유틸리티 기능:게임의 결과에 숫자 값을 할당하는 함수입니다. 예를 들어,체스 또는 틱택 토에서 결과는 승리,손실 또는 무승부이며 각각+1,-1 또는 0 값으로 나타낼 수 있습니다. 가능한 결과의 훨씬 더 큰 범위를 가지고 게임이 있습니다;예를 들어,주사위 놀이의 유틸리티는+192 에서-192 까지 다양합니다. 유틸리티 함수는 보수 함수라고도 할 수 있습니다.
알고리즘은 어떻게 작동합니까?
최소 및 최대라는 게임에 관련된 두 선수가 있습니다. 플레이어 최대 가능한 가장 높은 점수를 얻기 위해 시도하고 최소 즉,최소 및 최대 서로의 반대 역할을하려고,가장 낮은 점수를 얻기 위해 시도합니다.
의 일반적인 프로세스 Minimax 알고리즘은 다음과 같습니다:
1 단계:최초 생성,전체 게임무를 시작으로 현재의 위치를 게임에 모든 방법 개까지 터미널다. 이 게임 트리 게임 틱택 토에 대한 모습입니다.
우리는 위의 다이어그램의 관점에서 정의 된 용어를 이해하자.
- 초기 상태는 보드가 비어 있음을 정의하는 첫 번째 레이어입니다.
- 후속 함수는 가능한 모든 후속 이동을 나열합니다. 트리의 모든 레이어에 대해 정의됩니다.
- 터미널 상태는 최종 상태를 보여주는 트리의 마지막 계층입니다.
- 이 경우 터미널 상태에 대한 유틸리티는 앞에서 설명한 것처럼 1,0 및-1 이며 다른 노드의 유틸리티를 확인하는 데 사용할 수 있습니다.
2 단계:유틸리티 기능을 적용하여 모든 터미널 상태에 대한 유틸리티 값을 가져옵니다.
3 단계:터미널 노드의 유틸리티를 사용하여 상위 노드의 유틸리티를 결정합니다. 예를 들어,아래 다이어그램에서,우리는 사각형에 기록 된 터미널 상태에 대한 유틸리티가 있습니다.
터미널 위의 레이어의 왼쪽 노드(빨간색)에 대한 유틸리티를 계산합시다. 이 플레이어 분의 움직임이기 때문에,우리는 모든 유틸리티의 최소 선택합니다. 이 경우 최소{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 이어야합니다.
이제 질문은 우리가 정말로 계산해야합니까? 물론 아닙니다.
우리는 그 노드를 보지 않고 결론에 도달 할 수있었습니다. 그리고 이것이 알파-베타 가지 치기가 그림에 나오는 곳입니다.
몇 가지 정의:
알파:지금까지 플레이어 맥스에 가장 적합한 선택입니다. 우리는 여기서 가능한 가장 높은 가치를 얻고 싶습니다.
베타: 그것은 분 지금까지 최선의 선택이며,그것은 가장 낮은 가능한 값이어야한다.
참고:각 노드는 알파 및 베타 값을 추적해야 합니다. 알파는 최대 차례 일 때만 업데이트 할 수 있으며 마찬가지로 베타는 최소의 기회 일 때만 업데이트 할 수 있습니다.
알파-베타 가지 치기는 어떻게 작동합니까?
- 알파=-무한대 및 베타=무한대를 최악의 경우로 초기화합니다. 노드를 정리하는 조건은 알파가 베타보다 크거나 같아지는 경우입니다.
- 알파와 베타의 초기 값을 루트에 할당하는 것으로 시작하고 알파가 베타보다 작기 때문에 우리는 그것을 가지 치기하지 않습니다.
- 이 알파 및 베타 값을 왼쪽의 자식 노드로 전달합니다. 그리고 이제 터미널 상태의 유틸리티 값에서 알파 값을 업데이트 할 것이므로 베타 값을 업데이트 할 필요가 없습니다. 다시 말하지만,우리는 조건이 동일하게 유지되기 때문에 가지 치기하지 않습니다. 마찬가지로,세 번째 자식 노드도. 그 알파가 가질 수있는 최소 값이기 때문에 그리고 루트에 역 추적 우리는 알파=3 을 설정합니다.
- 이제 알파=3 과 베타=루트에서 무한대. 그래서 우리는 가지 치기를하지 않습니다. 이것을 중앙 노드로 옮기고 최소{2,무한대}를 계산하면 알파=3 과 베타=2 가됩니다.
- 알파가 이제 베타보다 크기 때문에 두 번째 및 세 번째 자식 노드를 정리합니다.
- 루트의 알파는 2 보다 크기 때문에 3 으로 유지됩니다. 이것을 가장 오른쪽 자식 노드로 옮기고 최소{무한대,2}=2 를 평가합니다. 베타 버전을 2 로 업데이트하고 알파는 3 으로 유지됩니다.
- 알파가 이제 베타보다 크기 때문에 두 번째 및 세 번째 자식 노드를 정리합니다.
- 따라서 왼쪽,가운데 및 오른쪽 최소 노드에서 각각 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
결론
게임은 매우 매력적이며 게임 플레이 프로그램을 작성하는 것은 아마도 훨씬 더 흥미 롭습니다. 어떤 그랑프리 경주 자동차 산업에,게임 플레이는 인공 지능에 있습니다.
경주용 자동차가 울퉁불퉁 한 길에서 완벽하게 달릴 것으로 기대하지 않는 것처럼,게임 플레이 알고리즘이 모든 상황에 완벽 할 것으로 기대해서는 안됩니다.
은 최소 최대 알고리즘입니다. 그것은 인공 지능이 필요한 모든 종류의 컴퓨터 게임에 대한 최선의 해결책이 아닐 수도 있습니다.
그러나 좋은 구현을 감안할 때,그것은 힘든 경쟁자를 만들 수 있습니다.