무한한 처리 능력이 주어지면 컴퓨터가 절대로 체스를 잃지 않도록 체스를 완벽하게 할 수있는 알고리즘이 있습니까?
그렇다면 의사 코드를 어디에서 찾을 수 있습니까?
무한한 처리 능력이 주어지면 컴퓨터가 절대로 체스를 잃지 않도록 체스를 완벽하게 할 수있는 알고리즘이 있습니까?
그렇다면 의사 코드를 어디에서 찾을 수 있습니까?
답변:
알고리즘이 존재합니까? 예. Zermelo의 정리 에 따르면 체스와 같은 유한 결정적 완전 정보 2 플레이어 게임에는 세 가지 가능성이 있습니다. 우리는 그것이 체스를 위해 무엇인지 알지 못합니다. (반면 체커 가 해결되었습니다 . 두 선수 모두 무승부를 강제 할 수 있습니다.)
개념적으로, 알고리즘은 매우 간단합니다. 완전한 게임 트리 를 구성하고, 리프 노드 (게임 종료 위치)를 분석하고, 승리를 거두거나 사임하거나 추첨을하는 것입니다.
문제는 세부 사항에 있습니다. 대략 10 43 개의 가능한 위치가 있으며 훨씬 더 많은 수의 움직임이 있습니다 (대부분의 위치는 여러 가지 방법으로 도달 할 수 있습니다). 이 알고리즘을 활용할 수있는 컴퓨터는 알려진 유니버스에 맞지 않거나 유니버스가 끝난 후 언젠가는 계산을 마치지 않기 때문에 무한한 강력한 컴퓨터가 필요합니다.
https://en.wikipedia.org/wiki/Endgame_tablebase를 참조 하십시오 .
무한한 컴퓨터 성능으로 시작 위치에 대한 테이블을 만들고 체스를 해결할 수 있습니다.
실제로, 현재의 슈퍼 컴퓨터를 사용하여 최대 7 명의 "남성"(전당과 조각, 왕을 세는 것)을 가진 위치 만이 해결되었으므로 체스를 풀지 못하고 있습니다. 문제의 복잡성은 조각의 수에 따라 기하 급수적으로 증가합니다.
실제로 처리 능력 이 무한 하다면 그러한 알고리즘은 실제로 쓰기 가 쉽지 않습니다 . 체스가이 있기 때문에 유한 가능한 상태의 수를, 당신은 이론에 불과으로 반복 그들을 통해 모든 당신까지 완벽한 플레이의 경로를 찾을 수 있습니다. 엄청나게 비효율적이지만 , 처리 능력 이 무한 하다면 중요하지 않습니다.
질문을 직접 해결하기 위해 : 예. 그러한 알고리즘이 있습니다. 이를 minimax라고합니다. (엔드 게임 테이블베이스는이 알고리즘 (뒤로!)을 사용하여 생성되지만, 기존의 단순 미니 맥스 알고리즘 만 있으면됩니다.) 이 알고리즘은 두 플레이어의 제로섬 게임을 완벽하게 재생할 수 있습니다. 여기에서 의사 코드를 찾으십시오.
https://ko.wikipedia.org/wiki/Minimax
이 알고리즘의 변형은 최신 컴퓨터 체스 프로그램에서 사용됩니다.
완벽한 체스를하는 알고리즘이있을뿐만 아니라, (무한한 자원을 주었을 때) 결정적인 완벽한 지식 유한 듀레이션 2 인 게임을 완벽하게 하는 짧은 프로그램을 작성할 수 있습니다 .
게임 엔진은 게임의 규칙을 알 필요조차 없습니다. 필요한 것은 "게임 상태"의 불투명 한 표현이며 (a) 모든 게임 상태를 제공하고, 법적 다음 게임 상태 목록을 제공하고 (b) 게임 상태를 제공하고, 플레이어의 승리 여부를 결정하는 기능 1 , 플레이어 2의 승리, 무승부 또는 종료 상태가 아닙니다.
이러한 기능이 주어지면 간단한 재귀 알고리즘이 게임을 "해결"합니다.
이 사실은 chessprogrammer (minimax)와 Acccumulation (python에서 프로그램 버전을 제공하는 사람)이 이전 답변에서 암시했습니다.
나는 20 년 전에 그런 프로그램을 썼습니다. 나는 noughts-and-crosses (당신이 미국인이라면 틱택 토)를 연주함으로써 그것을 테스트했습니다. 물론 완벽한 게임이었습니다.
물론 이것은 심각한 게임을 위해 상상할 수있는 모든 컴퓨터에서 빠르게 넘어 질 것입니다. 재귀 적이기 때문에 스택에 전체 게임 트리를 효과적으로 구축하므로 다른 답변에서 언급 된 10 ^ 123 개의 체스 상태를 분석하기 전에 "스택 오버플로"(매우 의도 한 것)를 얻게됩니다. 그러나이 작은 프로그램이 원칙적으로 작동한다는 것을 아는 것은 재미 있습니다.
나에게 이것은 AI에 대해 흥미로운 것을 말해줍니다. 그러나 당신이 생각하는 많은 "지능"은 Deep Blue, Go Go 또는 실제로 인간 체스 또는 Go에 의해 전시된다고 생각합니다. 솔루션. 문제는 합리적인 시간에 최적의 솔루션은 아니지만 좋은 솔루션을 얻는 방법입니다.
단순화를 위해 무승부 또는 무한한 이동 순서를 무시합니다. 알고리즘이 이해되면, 그러한 경우로 확장하는 것은 특히 어렵지 않습니다.
먼저 일부 정의는 다음과 같습니다.
그 움직임을하는 플레이어의 게임에서이기는 움직임은 승리하는 움직임입니다.
그 움직임을하는 플레이어의 게임에서지는 동작은지는 동작입니다.
다른 플레이어에게 최소한 한 번의이기는 움직임을 남기는 움직임도지는 것입니다. (상대방은 그 움직임을 취하고 손실을 강요 할 수 있기 때문에)
다른 플레이어에게만지는 동작 만 남는 동작은 승리하는 동작입니다. 상대방이 어떤 행동을하든 승리하게됩니다.
완벽한 전략은 남은 움직임이 있으면 항상이기는 동작을하고 남은 동작 만 잃는 경우에는 사임합니다.
이제 완벽한 전략을 작성하는 것은 쉽지 않습니다. 가능한 모든 이동 시퀀스를 분해하고 승리 / 손실 이동을 식별하십시오. 교착 상태를 무시하면 결국 모든 움직임을 승리 움직임 또는 잃어버린 움직임으로 식별합니다.
이제 전략은 사소합니다. 가능한 모든 움직임을보십시오. 승리 한 움직임이 남아 있으면 하나를 잡고 승리하십시오. 지는 동작 만 남아 있다면, 상대방이 당신을 잃을 수 있기 때문에 사임하십시오.
교착 상태 가능성을 포함하도록 전략을 조정하는 것은 어렵지 않습니다.
업데이트 : 모든 동작이 어떻게 더 많은 승리 또는 잃어버린 움직임으로 식별되는지 확실하지 않은 경우 다음을 고려하십시오.
n
가장 긴 체스 게임에서 움직임의 수를 호출 하십시오. (우리는 제한되지 않은 시퀀스를 무시하고 있지만 포함하는 것은 어렵지 않습니다.)n
우리가 고려해야 할 이전의 움직임 은 없습니다 .n-1
이전의 움직임을 가진 모든 움직임은 움직임이 n
가장 긴 게임을 끝내기 때문에 승리하는 움직임 또는지는 움직임 입니다.n-2
승리 한 움직임 또는지는 동작 만 따르므로 그 자체가 승리하는 움직임 또는지는 동작입니다.1. d4
과를 ...resigns
?
: 당신은 세 가지 기능을 가지고 가정 win_state
, get_player
그리고 next_states
. 에 대한 입력 win_state
은 게임 상태이며, 흰색이 체크 메이트 인 경우 -1, 드로우 인 경우 0, 검은 색이 체크 메이트 인 경우 1, None
그렇지 않으면 출력입니다. 에 대한 입력 get_player
은 게임 상태이며 출력이 검은 색이면 -1이고 흰색이면 1입니다. 에 대한 입력 next_states
은 합법적 인 이동으로 인해 발생할 수있는 다음 게임 상태 목록입니다. 그런 다음 게임 상태와 플레이어가 주어지면 다음 함수는 해당 플레이어가 이길 수있는 게임 상태를 알려줍니다.
def best_state(game_state,player)
def best_result(game_state):
if win_state(game_state):
return(win_state)
else:
player = get_player(game_state)
return max([best_result(move)*player for move in next_states(game_state)])*player
cur_best_move = next_states(games_state)[0]
cur_best_outcome = -1
for state in next_states(game_state):
if best_result(state)*player > cur_best_outcome:
cur_best_outcome = best_result(state)*player
cur_best_move = state
return(best_move)
예. 그것은 간단합니다. 무한한 처리 능력이 필요하지 않습니다. 필요한 모든 보드 위치에 대해 해당 위치에서 가장 잘 플레이 할 수있는 룩업 테이블이 필요합니다. 의사 코드는 다음과 같습니다.
def play-move(my-color, board-position):
return table-of-best-moves[my-color, board-position]
유일한 발견은이 룩업 테이블이 은하계보다 훨씬 크거나, 아마도 은하계보다 더 커야하고, 우주가 존재하지 않는 한, 현재의 우주 시대보다 더 길어질 것입니다. 체스에서 발견되지 않은 규칙 성으로 인해 지금보다 훨씬 간단합니다. 그러나이 룩업 테이블이있는 경우 매번 완벽한 이동을 선택하는 서브 루틴은 단 하나의 CPU 명령으로 구현 될 수 있습니다.
또한 체스에 대한 현재의 지식을 감안할 때 완벽한 플레이가 당신을 잃지 않도록 보장 할 수있는 방법이 없습니다. 예를 들어, 완벽한 플레이가 화이트의 승리를 보장한다면, 블랙이 완벽하게 플레이하더라도 블랙은 잃게됩니다.