Các lựa chọn thay thế cho ký hiệu FEN


8

Ngoài các ký hiệu FEN, còn có các ký hiệu vị trí cờ vua nhỏ gọn hơn nữa không? Một trong đó tất nhiên cũng sẽ đòi hỏi quyền castling, và en khả năng thụ động. Một điều thực sự thiếu trong FEN là thực tế là nó không mang thông tin nào về việc vị trí đó có tương ứng với người kiểm tra hay kiểm tra vấn đề đó hay không. Tất nhiên người ta luôn có thể đặt vị trí lên bảng và xem đó có phải là người kiểm tra hay không, nhưng nó không được khấu trừ trực tiếp từ ký hiệu. Vì vậy, tài sản như vậy cũng có tầm quan trọng trong việc phân biệt giữa các ký hiệu có thể (ngoài tính gọn nhẹ, v.v.)

Nếu nó giúp, điều này được yêu cầu cho lý do thực tế và hiệu quả trong lập trình. Cảm ơn cho bất kỳ đề nghị.


2
Tại sao bạn không biến điều này thành một câu trả lời? Tôi sẽ quan tâm đến một mã hóa vị trí cờ 128 bit.
BlindKungFuMaster 3/2/2015

@BlindKungFuMaster bạn đang nói chuyện với ai? :-)
Ellie

Ồ, chỉ cần ai đó nhận ra rằng không có mã hóa vị trí cờ 128 bit. ;-)
BlindKungFuMaster

Nếu chúng tôi biết những gì bạn đang cố gắng thực hiện, chúng tôi có thể cung cấp cho bạn câu trả lời tốt hơn.
Tony Enni

@TonyEnnis hãy bắt đầu với liệu: có những lựa chọn thay thế hay không?
user098876 3/2/2015

Câu trả lời:


6

Vì bạn đang nói về lập trình, có lẽ bạn đang tìm kiếm một sơ đồ lưu trữ nhỏ gọn hơn trong không gian bộ nhớ máy tính so với FEN. Bên cạnh việc ra ngoài để nghiên cứu cách nó được thực hiện trong các bàn lớn, hai khả năng xuất hiện trong tâm trí tôi ngay lập tức.

FEN bình thường

Vì lợi ích của cuộc thảo luận này, FEN "bình thường" chỉ là một chuỗi văn bản điển hình được biểu thị bằng các ký tự 1 byte (8 bit). Hãy xem xét một trường hợp xấu nhất được đơn giản hóa :

r1b1k1n1/1p1p1p1p/p1p1p1p1/1n1q1b1r/R1B1P1N1/1P1P1P1P/P1P1K1P1/1N1Q1B1R w KQkq e3 999 999

Tất nhiên đây không phải là một FEN hợp lệ, nhưng nó là giới hạn trên hiệu quả đối với sự phức tạp của chúng ta. Có tám ký tự cho mỗi cấp bậc, cộng với bảy dấu gạch chéo, năm dấu cách và mười ba ký tự bổ sung tạo thành các trường còn lại. Đó là 89 ký tự, với tổng kích thước 712 bit .

FEN nén

Phiên bản này chỉ lấy một đại diện FEN và sử dụng một số quan sát cơ bản để giảm số lượng bit cần thiết để lưu trữ nó. Dưới đây là những quan sát của chúng tôi:

  1. Các dấu gạch chéo là không cần thiết để lưu trữ máy; mỗi cấp bậc chỉ đơn giản là "thêm vào 8". Vì vậy, chúng tôi có thể loại bỏ dấu gạch chéo trong đại diện nội bộ của chúng tôi.
  2. Các ký tự có thể còn lại (trong phần đầu tiên) là : kK qQ rR bB nN pP 12345678. Sự khác biệt giữa 20 ký tự khớp với năm bit, vì vậy trong trường hợp xấu nhất được đơn giản hóa của chúng tôi, chúng tôi có năm bit lần tám tệp, tám lần xếp hạng là 320 bit cho phần đầu tiên.
  3. Chúng tôi không cần bất kỳ không gian nào; một lần nữa chúng là một tiện lợi cho con người. Điều đó giúp chúng tôi tiết kiệm năm nhân vật.
  4. "Ai có động thái" là một bit: Trắng hoặc Đen.
  5. Castling có sẵn là bốn bit: có sẵn / không có sẵn cho mỗi KQkq.
  6. En passant thường không có sẵn và nó có thể chiếm rất nhiều không gian (sáu bit để đại diện cho tất cả các hình vuông), vì vậy hãy di chuyển nó đến cuối và làm cho nó tùy chọn: nếu có các bit passant , nó có sẵn, nhưng nếu nó không có sẵn chỉ cần chấm dứt biểu diễn sau các bit di chuyển và nửa di chuyển để tiết kiệm không gian.
  7. Để đơn giản, tôi chỉ phân bổ mười bit cho mỗi bộ đếm di chuyển và nửa di chuyển. Điều này có nghĩa là các trò chơi được thể hiện ở định dạng này không thể vượt quá 1023 lần di chuyển (nửa lần di chuyển kể từ lần bắt trước hoặc cầm đồ trước).

Định dạng đầy đủ của chúng tôi trông như thế này (trong trường hợp xấu nhất được đơn giản hóa với en passant có sẵn):

<position><whose move><castling><half moves><full moves><en passant>
 320 bits  1 bit       4 bits    10 bits     10 bits     6 bits

Điều này mang lại cho chúng tôi tổng kích thước 351 bit trong trường hợp xấu nhất không thể xảy ra, ít hơn một nửa kích thước của điểm xuất phát của chúng tôi.

HÒA

Nếu chúng ta từ bỏ FEN hoàn toàn cho thịt của đại diện, chúng ta có thể giảm nó xuống một chút nữa. Hãy xem xét một hình vuông tùy ý. Hình vuông đó có thể trống, hoặc nó có thể có một mảnh trên đó. Nếu nó có một mảnh, nó có thể là màu trắng hoặc đen và nó có thể là Vua, Nữ hoàng, Rook, Giám mục, Hiệp sĩ hoặc Cầm đồ. Đó là tổng cộng mười ba trạng thái khác nhau, mà chúng ta có thể biểu thị bằng bốn bit; đại loại như thế này:

0000: empty square
0001: White Pawn
0010: White Knight
0011: White Bishop
0100: White Rook
0101: White Queen
0110: White King
0111: unused
1000: unused
1001: Black Pawn
1010: Black Knight
1011: Black Bishop
1100: Black Rook
1101: Black Queen
1110: Black King
1111: unused

Rõ ràng là có một số "bit một phần" chưa được sử dụng, do đó sơ đồ này gần như chắc chắn có thể được cải thiện hơn nữa bởi một người có kiến ​​thức về kỹ thuật nén hơn, hoặc đơn giản là ánh xạ cẩn thận hơn về các trạng thái khác nhau. Ngoài ra trong thực tế, giá trị này có thể lớn hơn FEN nén được mô tả ở trên, do không có các khoảng trống liền kề. Tuy nhiên, nó đại diện cho toàn bộ bảng trong 256 bit không đổi (4 bit * 64 ô vuông), đây là một cải tiến 20% trong các trường hợp xấu nhất.

Để đơn giản, chúng tôi sẽ chỉ gắn thẻ vào nửa sau của FEN được nén để hoàn thành việc đại diện. Vì vậy, định dạng trông như thế này:

<position><whose move><castling><half moves><full moves><en passant>
 256 bits  1 bit       4 bits    10 bits     10 bits     6 bits

Điều đó cung cấp cho chúng tôi một yêu cầu không gian trong trường hợp xấu nhất là 287 bit . Không tệ lắm!


Lưu ý 1: Hãy nhớ rằng, tất cả chỉ là phân tích trường hợp xấu nhất vì tôi có nền tảng khoa học máy tính. FEN tiêu chuẩn thường hoạt động tốt hơn nhiều so với tôi đã mô tả, vì các vị trí bình thường không phải là kịch bản bình phương của mọi người mà tôi đã sử dụng để so sánh ở đây. Vì vậy, phần trăm cải thiện có thể thấp hơn một chút so với thực tế tôi đã trình bày, nhưng xu hướng có thể vẫn còn, ít nhất là đối với đại diện FEN đã nén. Tôi rất quan tâm nếu ai đó muốn thực hiện phân tích trường hợp trung bình có xác suất cho FEN tiêu chuẩn (và bằng cách mở rộng, phiên bản nén được đề xuất ở trên)!

Lưu ý 2: Hãy nhớ rằng sự đánh đổi tốc độ để xử lý các định dạng nén có thể có hoặc không có giá trị đối với các ứng dụng của bạn! Tùy thuộc vào ngôn ngữ bạn đang sử dụng và mức độ kiểm soát bạn có trên các bit riêng lẻ, bạn có thể thấy rằng FEN đơn giản nhanh hơn đáng kể để sử dụng , ngay cả khi nó cần nhiều không gian hơn!

Lưu ý 3: Nếu bạn muốn thêm chỉ báo "kiểm tra / kiểm tra / không kiểm tra" vào một trong các ký hiệu được đề xuất mới, thì đó là thêm hai bit để thể hiện ba trạng thái bổ sung. Chỉ cần ném nó vào trước khi chỉ báo en passant .


Thông tin en passant thực sự chỉ là một tệp chứ không phải hình vuông (vì hình vuông có thể được suy ra từ tệp cùng với trình phát để di chuyển). Điều này làm giảm trường hợp xấu nhất của bạn bằng ba bit.
Stephen

cảm ơn vì đã trả lời chi tiết Tại sao trong biểu diễn 4 bit, chúng tôi để lại 0111 1000 1111 cho không sử dụng? chưa đủ?
user098876 4/2/2015

@ user098876 "không sử dụng" chỉ có nghĩa là ba kết hợp đó không được ánh xạ tới bất cứ thứ gì. "Không gian" bổ sung đó là lý do tại sao có thể cải thiện ánh xạ trên mỗi ô vuông hơn nữa với sơ đồ cẩn thận hơn, giống như câu trả lời trong user58697.
Henry Keiter

1
Vì tối đa 32 ô vuông có thể có quân cờ trên đó, người ta có thể dễ dàng cắt kích thước từ 256 đến 192 bằng cách sử dụng 64 bit để xác định ô vuông nào bị chiếm, và sau đó 4x32 bit để nói những gì trên mỗi ô vuông như vậy. Thông tin về castling hoặc en passant có thể được mã hóa bằng cách sử dụng các loại mảnh khác nhau cho "rook that can Castle" hoặc "cầm đồ có thể bị bắt en passant".
supercat

2

Mô tả vị trí mở rộng ( EPD ) thêm "thao tác" vào FEN. Những hoạt động này bao gồm, trong số những hoạt động khác, di chuyển tốt nhất, số lần lặp lại và di chuyển dự đoán. Nó rõ ràng không nhỏ gọn hơn, nhưng nó làm được nhiều hơn thế.


1

Trừ khi tôi thiếu một cái gì đó rõ ràng, đại diện

0      empty
100    white pawn
101    black pawn
110xxx any piece except Rook
111x   Rook

mã hóa toàn bộ ngôi nhà (nghĩa là trước khi bắt bất kỳ) trong 32 * 1 + 16 * 3 + 12 * 6 + 4 * 4 = 168 bit vị trí. Thêm vào đó, tất nhiên, 4 bit lâu đài, 3 bit thụ động và 7 hoặc 8 bit quy tắc 50 di chuyển.

Trường hợp xấu nhất (8 con tốt đã được thúc đẩy bằng chi phí bắt 8 con tốt khác, dẫn đến 20 mảnh + 4 rooks trên tàu) đòi hỏi 40 * 1 + 20 * 6 + 4 * 4 = 176 bit vị trí.


Nếu những con tốt của a, c, e và g của White bắt được những con tốt của b, d, f và h, thì màu trắng sẽ thúc đẩy tám con tốt và màu đen có thể thúc đẩy bốn con. Vì vậy, tôi nghĩ rằng việc đẩy số bit lên tới 200.
supercat

@supercat Bắt tốt!
dùng58697

0

Có thể điều chỉnh bảng và tất cả thông tin (ngoại trừ quy tắc di chuyển 50) thành 256 bit dễ quản lý. Tôi sẽ đề nghị như sau. 64 hình vuông và 4 bit trên mỗi hình vuông cho phép 16 trạng thái có thể. 0 sẽ đại diện cho hình vuông trống. Sau đó, chúng tôi có 6 mảnh, nhưng tôi sẽ dành một chiếc thứ 7 cho 'rook di chuyển' để có thể xác định được khả năng ném. Một bit để chỉ màu trắng hoặc đen. Chúng tôi đang sử dụng 15 trạng thái và còn lại 1 trạng thái: giá trị 8 (1000 nhị phân). Nó cũng đại diện cho một hình vuông mẫu, nhưng chúng ta có thể sử dụng nó trên xếp hạng thứ 3 hoặc thứ 6 để biểu thị con tốt trước nó di chuyển 2 hình vuông và có thể bị bắt 'en passant'. Cuối cùng, chúng tôi cũng sử dụng giá trị này để chỉ ra bên cần di chuyển. Tìm hình vuông empy đầu tiên ở nửa dưới của bảng để cho biết nó có màu trắng để di chuyển. Trên nửa trên cho màu đen.


Có thể, mặc dù cực kỳ khó xảy ra, vì không có một hình vuông trống trên một nửa bảng.
DM

0

Bạn đã hỏi: Một điều thực sự thiếu trong FEN là thực tế là nó không mang thông tin nào về việc vị trí đó có tương ứng với một người kiểm tra hay kiểm tra vấn đề đó không. Tất nhiên người ta luôn có thể đặt vị trí lên bảng và xem đó có phải là người kiểm tra hay không, nhưng nó không được khấu trừ trực tiếp từ ký hiệu.

Tại thời điểm này, nó có thể là một câu hỏi hay nếu người ta muốn nhúng một phần thông tin phức tạp về mặt tính toán vào những gì chỉ nên là một mô tả.

Điều tương tự cũng áp dụng cho các ký hiệu di chuyển - ví dụ: giữa: ký hiệu đại số (e2e4 b1c3) và SAN (e4 Nc3) - sau này yêu cầu một công cụ tính toán vị trí TO của mọi di chuyển và phức tạp về mặt tính toán để giải mã, trong khi trước đây không yêu cầu viết một trình tạo di chuyển toàn bộ để xác định vị trí TO được suy ra - có thể có ích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.