2. ALGORITHM GAME 두명의 플레이어 상대방과 정보를 공유함 더 이상 움직일 수 없을 때 승패가 결정 종착점에 도착 전까지 서로 교대로 행동함 ( 턴방식 ) 모든 플레이어는 최적화된 선택을 함 카드게임류는 상대방의 패를 모르기 때문에 해당하지 않는다 .
3. THE BASICS < 규칙 > 최초 n 개의 코인이 존재 플레이어는 자기 차례에 특정한 개수 만큼의 코인을 가져갈 수 있음 ( 예 : 1 개 ,3 개 ,4 개 ) 더 이상 가져갈 코인이 없다면 패배
4. THE BASICS < 예시 > 조건 : 플레이어는 1 개 ,3 개 ,4 개의 코인만을 가져갈 수 있다 최초 코인이 0 개 일 때 첫번째 플레이어는 패배 ( Terminal P0sition ) 최초 코인이 1 개 ,3 개 ,4 개 일 때 첫번째 플레이어는 반드시 승리가 가능하다 . ( Winning Position ) 최초 코인이 2 개 일 때 첫번째 플레이어는 코인 1 개를 가져감 -> 두번째 플레이어는 코인이 1 개 ( Losing Position )
5. THE BASICS < 법칙 > 마지막 종착점에서는 패배한다 플레이어가 Losing Position 으로 갈 수 있다면 ( 상대방이 Losing Position 이 됨 ) 플레이어는 Winning Position 플레이어가 Winning Position 으로 밖에 못간다면 ( 상대방이 Winning Position 이 됨 ) 플레이어는 Losing Position 플레이어는 상대방이 Losing Position 으로 가도록 선택한다 ( 최적화 )
6. THE BASICS 코인은 11 개 , 플레이어는 1 개 ,3 개 ,4 개의 코인을 가져갈때 더 이상 가져갈 코인이 없다면 패배 N 0 1 2 3 4 5 6 7 8 9 10 11 Position L W L W W W W L W L W W
7. THE BASICS 코인은 11 개 , 플레이어는 1 개 ,3 개 ,4 개의 코인을 가져갈때 마지막으로 코인을 가져간 사람이 패배일때 Terminal position 의 조건만 바꾸어 주면 됨 !! N 0 1 2 3 4 5 6 7 8 9 10 11 Position W L W L W W W W L W L W
8. THE BASICS <WL-Algorithm> boolean isWinning ( position pos ) { moves[] // pos 로부터 갈 수 있는 위치들 for ( all x in moves ) if (! isWinning ( x )) return true ; // 하나라도 Losing position 이라면 Winning position return false ; // 모두가 Winning position 이라면 Losing position }
9. THE GAME OF NIM < 규칙 > 최초 N 개의 더미가 존재함 플레이어는 하나의 더미를 선택하고 적어도 일 이상의 값을 버릴 수 있음 더 이상 버릴 더미가 없을 때 패배 http://www.transience.com.au/pearl3.html ( 조금 다르지만 )
10. THE GAME OF NIM xor : 1 이 홀수개면 1, 짝수개면 0 xor 이 0 이 아니므로 반드시 승리한다 !! 이진수 6 1 1 0 9 1 0 0 1 3 1 1 6∧9∧3 1 1 0 0
11. THE GAME OF NIM < 성질 > 더 이상 버릴 것이 없다면 xor == 0 (Terminal position) xor == 0 (Losing position) 하나 이상의 값을 버릴 때 반드시 xor 은 0 이 아닌 수가 됨 xor != 0 (Winning position) 가장 큰 더미의 값을 변경하면 xor 은 항상 0 이 되도록 만들 수 있음 필승 전략 : 상대방의 xor 이 항상 0 이 되도록 선택함 ( 최적화 )
12. GRUNDY NUMBER < 규칙 > N x N 사이즈의 체스판에 K 개의 나이트가 존재함 나이트는 좌표값의 합이 적어지는 방향으로만 이동 가능 ( 다음 페이지 그림 참조 ) 하나의 좌표에는 하나 이상의 나이트가 위치할 수 있음
14. GRUNDY NUMBER int grundyNumber ( position pos ) { moves[] //pos 에서 갈수 있는 위치를 저장 set s ; for ( all x in moves ) insert into s grundyNumber ( x ); // 각각의 위치들의 grundy number 를 s 에 추가 int ret =0; while ( s . contains ( ret )) ret ++; // 하나씩 증가하면서 s 에 값이 있으면 ret++ return ret ; }
16. GRUNDY NUMBER < 성질 > 더 이상 움직일 나이트가 없을때 나이트가 위치한 좌표의 Grundy number 의 xor 은 0 (Terminal position) xor == 0 (Losing position) 나이트를 움직이면 반드시 xor 은 0 이 아닌 값 xor != 0 (Winning position) Grundy number 가 가장 큰 나이트를 이동하여 xor 이 항상 0 이 되도록 만들 수 있음 필승 전략 : 상대방의 xor 이 항상 0 이 되도록 선택함 ( 최적화 )