턴 기반 전략 게임에 최소 / 최대를 성공적으로 적용하려면 사용 가능한 모든 체스 기술을 올바르게 적용해야합니다 ...
평가 기능
평가 기능이 나쁜 경우 체스 엔진도 강도가 매우 나쁩니다. 평가 함수의 가장 간단한 버전은 다음과 같습니다. 1 = 흰색으로 게임 승리, -1 = 흑색으로 게임 승리, 0 = 다른 모든 경우; 그러나 이렇게하면 성능이 매우 저하됩니다. 턴 기반 게임에서도 마찬가지입니다! 체스 에서처럼 min / max (알파 / 베타 가지 치기 및 기타)를 사용하려면 합리적인 평가 기능도 구현해야합니다! 그렇지 않으면 전략 게임에 적용될 때 이러한 알고리즘 성능을 체스에 적용되는 경우와 비교할 수 없습니다.
체스 엔진의 평가 기능은 다음과 같은 것을 평가합니다.
- 보드에서 한 조각의 위치는 어느 정도입니까?
- 조각이 몇 번 공격됩니까?
- 조각은 몇 번 보호됩니까?
- 각 조각이 보드에서 얼마나 잘 자유롭게 움직일 수 있습니까? (또는 : 얼마나 많은 타일을 "제어"합니까?)
평가 기능의 해당 부분은 먼저 게임으로 "번역"되어야합니다.
- 조각의 위치 : 예를 들어 사거리를 연장하는 언덕 위에 있습니까?
- 공격 당 : 각 조각은 얼마나 위험합니까? (예 : 특수 유닛을 공격 할 수있는 유닛의 공격 가치의 합에 공격 확률을 곱한 값; 유닛이 이미 손상된 경우 확률이 증가합니다. 다른 유닛이 공격 유닛의 범위 내에 있으면 감소합니다)
- 자신의 공격 :이 유닛이 몇 개의 유닛을 공격 할 수 있습니까?
- 보호 : 옆에 얼마나 많은 조각이 있습니까? 어쩌면 유닛은 최소 거리에서 유닛을 공격하지 않을 수 있으며 근처 유닛을 공격 할 가능성이있는 유닛으로 보호하는 것이 좋습니다.
- 이동성 : 얼마나 모바일 기기입니까? (피할 수 있습니까?)
모든 단위에 대해 가중치 함수 (factor_a * rating_a + factor_b * ranting_b + ...)로 다른 등급을 합산해야합니다 ...
전략 게임에서는 남은 자원 (골드, 우드, ...)도 고려해야합니다.
평가 기능이 충분하면 대부분의 경우 실제로 트리를 "깊게"검색 할 필요가 없습니다. 따라서 가장 유망한 3 또는 10 개의 선택을 면밀히 검토하면됩니다. 다음 장 참조 ...
각 위치에서 가능한 이동
전략 게임에 최소 / 최대를 사용하는 데있어 가장 문제가되는 것은 한 번에 여러 유닛을 명령 할 수 있다는 것입니다. 반면 체스에서는 한 유닛 만 명령 할 수 있습니다 (캐스터 링 제외). 각 유닛에 대해 "북쪽, 남쪽, 서쪽, 동쪽 또는 정지"만 결정하는 경우 각 "위치"(체스 항)에 대해 N 단위에 대해 5 ^ N의 가능한 이동이 발생합니다. 복잡한 명령을 하위 수준의 명령으로 분류하여이 문제를 해결할 수 있습니다. 예를 들어, 유닛 A에 대한 동작을 선택하고, 깊이에 들어가서 유닛 B에 대해 결정하십시오. 그러나 이것만으로는 복잡성을 변화시키지 않습니다! 작업이 장치에 할당되는 순서를 최적화해야합니다 (예 : 첫 번째 장치 B, C, D 및 장치 A). 마지막 계산 중에 각 단위에 대한 결정의 영향을 기록한 다음 중요도별로 정렬 할 수 있습니다. 이 방법으로 알파-베타 가지 치기를 사용하여 검색 트리에서 잘못된 조합을 매우 빨리 제거 할 수 있습니다. 가장 높은 우선 순위는 각 반복마다 항상 "더 이상 아무것도하지 말고 턴을 끝내십시오"(null move pruning) 여야합니다. 이렇게하면 대부분의 작업을 대부분의 장치에 "건너 뛰어"이전 작업을 계속할 수 있습니다. 이런 식으로 "중요한"유닛 (예를 들어, 실제로 전투중인 유닛)을 살펴보면 검색이 빠르게 진행됩니다. 각 장치를 한 번만 명령하십시오. 또한 "중요한"장치가 때때로 명령을 받고 있는지 확인하기 위해 임의성을 사용할 수 있습니다. 특히, 일부 직무를 수행하는 부대 (예 :
반복 심화 + 캐싱 / 해시 테이블
그런 다음 시간 제한에 도달 할 때까지 점점 더 깊이 들어가기 위해 "상호 심화"를 수행 할 수 있습니다. 따라서 단위가 적 으면 더 깊이 검색하고 더 나은 솔루션 검색을 중지하면 항상 "결과"가 나타납니다. 반복 심화는 해시 테이블을 사용하여 이전 검색 결과를 캐시해야합니다. 또한 마지막 회전 검색 (마지막 회전에서 실제로 실행 된 명령을 포함하는 검색 트리의 분기)의 일부 결과를 재사용 할 수 있습니다. 이를 구현하려면 반복적으로 업데이트 할 수있는 매우 우수한 해싱 기능 ( "조브리스트 키"를 살펴보십시오)이 필요합니다. 해시 키를 업데이트한다는 것은 이전 "위치"의 해시 키를 가져 와서 위치 변경을 시작할 수 있음을 의미합니다 (예 : x 위치에서 유닛을 빼내고 y 위치에 놓으십시오). 이 방법으로 해시 키를 계산하는 것이 빠르며 해시에이 위치에 대한 이전 항목이 있는지 확인하기 위해 전체 보드 상황을 처리 할 필요가 없습니다. 어떤 방식 으로든 해시 충돌이 발생하지 않도록해야합니다.
비 결정적 행동
비 결정적 동작은 최소 / 최대 검색의 문제입니다. 즉, 공격 대상을 공격 할 것인지 확실하지 않습니다 (예 : 확률은 10 %). 그런 다음이 일을 계획 할 수는 없습니다. 이 경우 알고리즘을 수정하고 그 사이에 "probabilty"레이어를 배치해야합니다. 그것은 "확률이 바뀌는"것과 비슷합니다. 각각의 독립적 인 결과는 개별적으로 고려해야합니다. 이 깊이 "계층"을 통한 평가는 샘플링되어야하고 (몬테카를로 샘플링) 심층적 인 평가 결과는 발생 확률에 의해 가중되어야합니다. 확률 레이어의 다른 결과는 다른 상대 이동으로 간주되어야합니다 (그러나 최소 / 최대 대신 "평균"을 계산해야합니다). 이것은 물론 검색 트리의 복잡성을 증가시킵니다.
요약
결정적인 게임에 이러한 모든 기술 (현재 체스 엔진에서 사용되는 모든 기술)을 적용하면 게임에서도 합리적인 결과를 얻을 수 있습니다. 비 결정적 게임의 경우이 방법이 더 복잡 할 수 있지만 여전히 관리가 가능하다고 생각합니다.
이러한 기술에 대한 설명을 제공하는 좋은 자료는 다음과 같습니다 (체스). http://chessprogramming.wikispaces.com/
최소 / 최대 검색에서 일종의 방향성 무작위성을 구현할 수도 있습니다. 각 반복에서 먼저 최상의 결과를 결정적으로 조사하는 대신 이것을 무작위 화하고 현재 평가를 기반으로 확률 분포에 따라 순서를 결정할 수 있습니다 ...