Lí thuyết trò chơi LÍ THUYẾT TRÒ CHƠI Chuyên đề DHBB 2017 – Tin học skkn Impartial Combinatorial Games Impartial Combinatorial Games Các trò chơi đối kháng giữa hai người đã được hình thành từ lâu tro[.]
LÍ THUYẾT TRỊ CHƠI Chun đề DHBB 2017 – Tin học skkn Impartial Combinatorial Games Impartial Combinatorial Games Các trò chơi đối kháng hai người hình thành từ lâu người chơi ln cố gắng tìm cách để giành phần thắng Về lí thuyết khả thắng thua trị chơi hồn tồn tiền định Chính xác hơn, trị chơi cho trước vị trí ban đầu kết tốt mà người chơi đạt tính tốn (giả thiết hai người chơi chơi tối ưu) Tuy nhiên khối lượng tính tốn q lớn nên khả thực nước tối ưu số trò chơi không tưởng Do nay, số lượng nhỏ trò chơi đối kháng giải trọn vẹn Bài viết giới thiệu hai cách tiếp cận trị chơi đối kháng hai người: tìm kiếm mini-max hàm grundy Mơ hình đồ thị trị chơi đối kháng Cho đồ thị định hướng G=(V , E) (đồ thị G có tập đỉnh V , tập cạnh E ), ta định nghĩa E ( v ) ={ u|( v , u ) ∈ E } tức tập đỉnh đến từ u Một trò chơi hai người tương ứng với đồ thị định hướng G=(V , E) trạng thái chơi tương ứng với đỉnh đồ thị, hàm E(u) qui tắc chơi theo nghĩa E(u) chứa đỉnh hay trạng thái chơi mà từ u đến Hai người luân phiên thực lượt đi, chơi u người chơi cho nước v nhận thoả mãn v ∈ E(u) Trị chơi kết thúc khơng thể tiếp (Thơng thường người khơng thể tiếp người thua cuộc) Ta phân chia trò chơi thành hai loại: trò chơi lựa chọn đối tượng trò chơi lựa chọn nhiều đối tượng tùy theo khả phân rã đồ thị tương ứng trò chơi thành đồ thị độc lập Trò chơi lựa chọn đối tượng Loại trò chơi lựa chọn đối tượng hiểu trực quan nước thực đối tượng (nên G không phân rã thành đồ thị độc lập được) Ví dụ Trị chơi tổng phương Bắt đầu số nguyên dương N , hai đấu thủ A, B trừ bớt số số phương dương cho phần cịn lại không âm Đấu thủ thua không thực nước lượt Nếu người chơi tối ưu liệu người thứ có khả thắng? Phân tích 10 11 12 13 14 Lượt chơi có N=0 hiển nhiên thua Lượt chơi có N=1,4,9,16 ,… chiến thắng sau lượt Lượt chơi N=2 trao cho đối thủ N=1 nên chắn thua Lượt chơi N=3 trao cho đối thủ N=2 nên chắn thắng [1|14] skkn Impartial Combinatorial Games Lượt chơi N=5 trao cho đối thủ N=1,4 (chắc chắn thắng) nên chắn thua … Bằng cách phân tích tương tự ta tìm khẳng định chắn cho N (miễn có đủ thời gian tính tốn) Để tổng quát hóa cách làm trên, ta đưa khái niệm thắng, thua Khi đến lượt chơi mà khơng cịn nước ta thua (gọi thua sở) Nếu lượt chơi thực nước đưa đối phương vào thua ta thắng Nếu nước lượt chơi đưa đối phương vào thắng ta thua Định nghĩa truy hồi cho phép ta áp dụng phép tìm nước theo chiến lược vét cạn với trị chơi có số trạng thái đủ nhỏ (dĩ nhiên) Ngoài ra, giả thiết hai đấu thủ chơi tối ưu nên tính thắng/thua trạng thái tiền định, thực phương pháp loang thơng thường để tô màu trạng thái (quyết định thắng/thua) Nếu trị chơi khơng định thắng/thua mà cịn tính điểm nước nước đi, đấu thủ ln mong muốn giành điểm số cao kết thúc trò chơi Tương tự thấy chiến lược thực nước là: chọn nước cho sau với cách tốt đối phương, điểm giành lớn Chính xác hơn, đối phương cố gắng cực tiểu hóa điểm số ta, ta cần thực nước cho điểm số cực tiểu lớn Đây lí cách tiếp cận có tên tìm kiếm mini-max Ta xét số tốn ví dụ Ví dụ GAME Một trị chơi đối kháng hai người A B diễn sau: Hai người luân phiên điều khiển tốt theo số đường cho trước Một người di chuyển tốt từ vị trí u đến v có đường nối trực tiếp định hướng từ u đến v Trò chơi kết thúc tiếp tục di chuyển Đấu thủ thực nước người thua Hỏi cho trước vị trí ban đầu danh sách đường nối người trước thắng, thua hay hồ? Giả hai người ln chơi tối ưu Input: GAME.IN - Dòng đầu ghi số N số vị trí tốt đứng, số M số đường (định hướng) mà tốt (1≤ N ≤ 200, ≤ M ≤ N*(N-1)) Dòng thứ hai ghi u trạng thái bắt đầu M dòng dòng ghi hai số u, v mô tả đường từ u đến v Output: GAME.OUT - Ghi số 1, 2, tương ứng với người thắng, thua hay hoà [2|14] skkn Impartial Combinatorial Games Phân tích - Những vị trí khơng có đường chắn thua Những vị trí có đường nối với vị trí chắn thua chắn thắng Những vị trí tất đường nối với vị trí chắn thắng chắn thua Những vị trí mà trạng thái thắng thua khơng thể xác định vị trí hồ Thuật toán - - Ban đầu coi tất vị trí v hồ gán giá trị đỉnh F [ v ]=0 Tìm vị trí khơng có đường gán lại F [v ]=2 (vị trí thua) Khi thay trạng thái vị trí từ hồ sang thắng thua kiểm tra vị trí có đường đến nó: Những vị trí u có đường nối với vị trí v chắn thua ( F [ v ]=2 ) chắn thắng (thay F [u ]=1); Những vị trí u tất đường nối với nối với vị trí v có F [ v ]=1 (chắc chắn thắng) chắn thua (thay F [u ]=2) Quá trình ngừng khơng có chuyển trạng Trị chơi hịa xuất chu trình Ví dụ LGAME Cho bảng kích thước 4*4 vng, đặt hai thước thợ hình L kích thước vng hai hình trịn hình vẽ, hình nằm bảng khơng đè lên Hình kẻ ca rơ người chơi A, hình kẻ sọc người chơi B Hai người chơi luân phiên, nước đi, người phải nhấc hình L lên, xoay, lật tuỳ di chuyển đến vị trí (khác so với vị trí ban đầu), hình có hai cách di chuyển Và người chơi thực thêm bước khơng bắt buộc di chuyển trịn đến Trị chơi kết thúc khơng thể di chuyển nữa, người di chuyển thua Tuy nhiên, trị chơi hồ trạng thái hai người khơng muốn thua (chính xác khơng dồn đối thủ vào thua) Yêu cầu: Cho trạng thái trò chơi, hỏi trị chơi kết thúc thế, (hoà, A thắng hay B thắng, A người trước) Input Gồm dòng dòng ghi kí tự, ‘.’ thể trống(có ơ), ‘x’ chứa miếng hình trịn (2 ơ), ‘#’ biều thị bị miếng hình L người chơi A đặt lên (có ơ), cịn lại bốn ô biểu thị ô bị miếng hình L người chơi B đặt lên Output [3|14] skkn Impartial Combinatorial Games Có ba trường hợp: A thắng: ghi trạng thái sau A nước dẫn đến trạng thái thắng A thua: ghi xâu “No winning move Losing” Hoà: ghi xâu “No winning move Draw” Ví dụ LGAME.IN *** #*.x ### x x ### #*** x * ### x#*x *** LGAME.OUT *** x*#x ### No winning move Draw No winning move Losing Phân tích Do kích thước bảng nhỏ nên tính tốn số trạng thái vào khoảng 18,000 Từ xây dựng hàm băm hợp lí tiến hành loang để tô màu trạng thái Đôi lúc lưu tất trạng thái số tốn số trạng thái lớn Khi đó, thay xét thắng/thua cho trạng thái thời ta tính thắng/thua cho trạng thái tương đương Ví dụ Stones Một trị chơi bốc sỏi diễn bảng ngang kích thước 1*N vng Trên số có đặt số viên sỏi Tại bước người chơi cầm viên sỏi ô di chuyển viên sỏi sang bên trái hai ô với điều kiện di chuyển tới phải khơng có sỏi đường di chuyển khơng qua có sỏi Người không di chuyển người thua Cho trước trạng thái ban đầu hỏi người trước có nước mà người thứ hai thua, giả thiết hai người chơi tối ưu Input Dòng đầu ghi số N(1 ≤ N ≤ 50) Dòng thứ hai ghi xâu gồm N kí tự thể trạng thái lúc bắt đầu trị chơi, ‘.’ thể trống, ‘X’ thể có sỏi (số viên sỏi khơng vượt 10) Output Ghi số số nước mà thắng Ví dụ STONES.IN X.X STONES.OUT [4|14] skkn Impartial Combinatorial Games XX Phân tích Nếu coi trạng thái đỉnh đồ thị rõ ràng tốn theo lý thuyết tính kết Nhưng thực tế số trạng thái lớn (có thể lên đến C 10 50) Vì trước hết cần làm giảm số lượng trạng thái cần xét Đầu tiên ta thấy trạng thái người chơi đặc trưng dãy số nguyên không âm số ô tự phía trước viên sỏi, ví dụ: xâu “ XX.X” thay dãy {3, 0, 1} Tuy nhiên cách mã hóa trạng thái, ta xét thắng thua dãy lấy đồng dư modul tất phần tử dãy, chẳng hạn thay dãy {3,0,1} ta xét dãy {0,0,1} Chứng minh hai dãy tương đương thắng/thua, thật vậy: Gọi dãy ban đầu A , dãy sau ước lược B=f ( A) ( f hàm rút gọn) Vì B dãy ước lược A nên với cách nước từ B đến B’ A đi nước đến A ’ (cùng vị trí số ô) cho f ( A ’)=f (B ’) (I) Chẳng hạn với dãy B {0,0,1 } sau nước vị trí với số đến B’ {0,0,0 } với A {3,0,1 } với số ô đến A ’ {3,0,0} Lúc ta có: f ( A ’)=f ( B ’)={0,0,0 } Vì bước chơi đối thủ nhằm có lợi cho nên người chơi thứ thực nước từ A đến A ’ hòng thay đổi thua thành thắng (vốn theo lý thuyết xác định), tức f ( A) thua, f ( A ’) thua mà B=f ( A), suy B không đến B’ (vì B=f ( A) suy B thua, B’ thua) suy người chơi thực có số tự đằng trước lớn 3, suy tiếp người thứ hai tiếp nước ô với số ô (3 - số ô người thứ đi) Suy người thứ vị trí f ( A ’ ’) thua (II) (I)(II) ⟹ hai dãy tương đương theo kết thắng thua Ví dụ Trị chơi chuyển đá Vào ngày đẹp trời, A nghĩ trò chơi rủ B tham gia Có n ơ, ô chứa số viên đá Các ô đánh số từ đến n−1 Để thực nước đi, A/B chọn ô với số i , j, k thoả mãn i< j ≤ k i chứa viên đá, sau bỏ viên đá ô i đồng thời thêm hai viên đá vào ô j ô k (mỗi viên) Chú ý j k , sau bước tổng số viên đá tăng lên Ai thực nước coi bị thua A trước Nhiệm vụ bạn xác định xem A chiến thắng hay không? (giả sử B chơi tối ưu) Nếu in số i , j, k mô tả nước A Nếu có nhiều kết in kết có i nhỏ nhất, có kết chọn kết có j nhỏ nhất, có kết chọn kết có k nhỏ Input Dòng đầu gồm số nguyên n số Dịng thứ hai gồm n số, số thứ i thể số viên đá ô i Output [5|14] skkn Impartial Combinatorial Games Nếu A thắng in số i , j, k dòng Nếu A thua in số –1 Giới hạn ≤n ≤ 15 Số viên đá khơng vượt q 1000 Ví dụ INCSTONE.IN 1 INCSTONE.OUT 1 Phân tích Trạng thái tương đương trạng thái lấy số sỏi mod 2, có nhiều 215 trạng thái Vậy áp dụng kĩ thuật tìm mini-max Trị chơi lựa chọn nhiều đối tượng Qua cách tiếp cận ta nhận thấy trạng thái chơi gồm nhiều đỉnh đồ thị khơng thể thực tìm kiếm mini-max đơn số trạng thái lớn, phương pháp giải vấn đề dùng hàm grundy Ví dụ Trị chơi bốc sỏi Hai người chơi bốc sỏi đống sỏi có n viên, người đến lượt bốc không k viên Xác định khả thắng người trước hai chơi tối ưu Phân tích Ta khảo sát với k =3 Ta đặc trưng cho số sỏi n=0 đại lượng để thua sở Với số n> có nhiều nước thực đưa đến giá trị n1 , n2 ,n 3, đặc trưng cho n giá trị nguyên không âm nhỏ chưa xuất giá trị đặc trưng n1 , n2 ,n Với cách làm ta thu bảng: 0 1 2 3 10 11 12 13 14 Dễ nhận thấy n có trị đặc trưng khác ta ln có nước để trao cho đối thủ số sỏi có đặc trưng Ngược lại, đặc trưng cho n ta khơng có nước ( n=0) nước ta dẫn đến số sỏi có đặc trưng khơng Từ rút thua trạng thái có số đặc trưng số đặc trưng cho thua sở (*) Với trò chơi tương tự tìm số đặc trưng cho trạng thái theo cách thu kết luận (*) Đây sở hàm grundy 3.1 Khái niệm Cho đồ thị định hướng chu trình G=(V , E) V tập đỉnh, E tập cạnh [6|14] skkn Impartial Combinatorial Games - - - Với đỉnh u ∈V , ta định nghĩa E ( u )= { v|( u , v ) ∈ E } Một trò chơi hai người định nghĩa đồ thị định hướng G=(V , E) chơi tương ứng với đỉnh đồ thị tổng (có thể gồm hay nhiều đồ thị thành phần), hàm E( v ) qui tắc chơi, đỉnh v gán với số thực r ( v ) giá trị mà đấu thủ nhận nước Hai người luân phiên đi, chơi u người chơi cho nước v nhận thoả mãn v ∈ E(u), người nhận đựơc giá trị r ( v ) tương ứng Trò chơi kết thúc đến lượt chơi mà thực nước Nếu trò chơi kết thúc, tuỳ theo tổng giá trị mà đấu thủ nhận ta có kết có người thắng hay ván đấu hồ Trước hết, ta định nghĩa hàm grundy sau: Cho đồ thị G=(V , E) , hàm grundy G cách gán cho đỉnh u số tự nhiên g(u), cho ∀ u ∈V , g(u) số tự nhiên nhỏ khơng có tập S giá trị hàm grundy đỉnh kề với u 3.2 Các định lý Ta xét lớp tốn trị chơi thoả mãn tính chất: Đồ thị G tương ứng đồ thị định hướng khơng có chu trình người thắng người thực nước cuối trước kết thúc trò chơi Từ đây, nói đến đồ thị G , ta nói đến đồ thị thỏa mãn tính chất Định lý Đồ thị DAG có có hàm grundy Chứng minh: Ta xác định hàm grundy sau: Ban đầu tất đỉnh chưa tính hàm grundy Lần lượt thực chừng cịn đỉnh chưa tính hàm: Xét đồ thị G ’ G sinh tập hợp đỉnh chưa tính hàm, lấy tất đỉnh v G ’ mà E ’(v ) tương ứng ∅, ta xác định hàm grundy cho đỉnh v theo định nghĩa hàm grundy: S ( v ) ={ g (u )|u ∈ E ( v ) } ; g(u)=min { p∨( p ∈ N )∩! ( p ∉ S(u))} Chú ý G định hướng khơng có chu trình nên đồ thị G ’ thoả mãn khơng có chu trình Mặt khác đồ thị định hướng khơng có chu trình ln ln tìm đỉnh khơng có cung tức E ’=∅, bước ln xác định hàm grundy cho đỉnh Ta thuật toán xác định hàm grundy nhất, phương pháp qui nạp Tại bước 0, hiển nhiên đỉnh chọn có giá trị hàm grundy ¿ , đỉnh v có E(v )=0 nên theo định nghĩa hàm grundy, cách cho với đỉnh Giả sử bước k ≥ 1, tất đỉnh tính hàm thỏa hàm tương ứng xác định [7|14] skkn Impartial Combinatorial Games Khi đó, đỉnh xác định hàm bước khơng có cung nối đến đỉnh chưa có hàm, với đỉnh v xác định hàm bước này, tập E(v ) gồm đỉnh có hàm xác định nhất, theo định nghĩa hàm grundy, hàm g( v) xác định Như vậy, đến bước k +1 , tất đỉnh đă xác định hàm grundy xác định cách Định lý chứng minh Định lý Đồ thị G nhận g hàm grundy tương ứng, đấu thủ đến lượt chơi trạng thái có hàm grundy khác đấu thủ ln ln có cách chơi để không thua Chứng minh Tại chơi khác 0, ta ln có cách đưa chơi 0, khơng chơi phải theo định nghĩa hàm grundy Đối phương khơng tiếp nữa, đến chơi khác cho ta Như vậy, đến lượt ta chơi khác 0, tức ta không thua, trường hợp đồ thị hữu hạn khơng có chu trình ta thắng Hệ quả: Với đồ thị hữu hạn ta ln xác định người chiến thắng Như vấn đề phải xác định hàm grundy Cần phải ý đồ thị khơng DAG có nhiều hàm grundy, nên kết không Xét định nghĩa phép cộng đồ thị: Cho hai đồ thị G1=(V , E1 );G2 =(V , E 2) đó, G=G1 +G 2là đồ thị G(V , E) có: V =V ×V ( ( x1 , x2 ) , ( y , y ) ) ∈ E ⇔ ( ( x 1= y ) ∩ ( x , y ) ∈ E2 ) ∪ ( ( x 2= y ) ∩ ( x , y ) ∈ E 1) Tổng quát ta định nghĩa qui nạp G=G1 +…+ Gn=(G1+G2 +…+ Gn−1)+Gn Định lý Cho G1 ,G2 , … ,G n nhận hàm grundy g1 , g , … , g n tương ứng Khi đó: G=G +…+ Gn nhận hàm grundy g thoả mãn: g ( v , v , … , v n )=g1 ( v1 ) XOR g ( v ) XOR … XOR g n( v n ) Chứng minh: Vì G thoả mãn tính chất G1 ,G …nên có hàm grundy Để chứng minh công thức hàm grundy , ta chứng minh với đỉnh theo thứ tự định lý 1: Khi xét đỉnh v đỉnh tập E(v ) thoả mãn Ta có hai tính chất sau: Cách cho hàm g thoả mãn g( v) khác g(u) với u ∈ E (v ) ngược lại g(u)=g (v ): u v khác thành phần biểu diễn ( x , x ,… , x n ), giả sử thành phần thứ k ⟹ g ( uk )=g (v k ), mâu thuẫn uk ∈ E k ( v k ) Hàm g nhỏ tập giá trị thoả mãn tính chất 1: Giả sử l< g( v) thỏa mãn, biểu diễn nhị phân, gọi vị trí sai khác g( v) l dễ thấy g( v) [8|14] skkn Impartial Combinatorial Games l Vì g(v) vị trí i=1 nên tồn thành phần, giả sử j có g j (v j) biểu diễn i nhị phân vị trí thứ i bằng1nên tồn v j ’ ∈ E j ( v j ) cho g j (v j ’)=g j ( v j ) XOR Khi đó: v ’=(v , v ,… , v j ’ , … , v n ) có l=g( v ’) khơng thoả mãn hàm grundy v ’ ∈ E(v) Cách khác: Giả sử l< g( v) thoả mãn suy tồn số vị trí xảy sai khác cách biểu diễn nhị phân vị trí: i n