Bài 35 · Đo hối tiếc khi học cách chơi kéo búa bao

Bài 35 · Đo hối tiếc khi học cách chơi kéo búa bao

An muốn viết một chương trình kéo búa bao. Bản đầu tiên làm một việc rất dễ giải thích. Ván sau, chương trình ra đúng thứ đối thủ đã ra ở ván trước. Nó có trí nhớ một lượt và rất tự tin vào trí nhớ đó.

Sau 12 ván, An nhìn tổng điểm rồi tự hỏi. Hai điểm là tốt hay dở?

Chọn một mốc so cho rõ

Thắng được 1, thua mất 1, hòa được 0. Đối thủ phát lại chuỗi kéo, kéo, bao bốn lần. Chương trình của An mở đầu bằng búa rồi làm theo lượt trước của đối thủ.

Ta lấy một mốc đơn giản. Sau khi biết đủ 12 lượt của đối thủ, hỏi nếu An chọn một nước cố định từ đầu đến cuối, nước tốt nhất được bao nhiêu. Đây là phép so hồi cứu. Chương trình đang chơi chưa được biết tương lai.

 1doi_thu = ["kéo", "kéo", "bao"] * 4
 2thang = {"búa": "kéo", "kéo": "bao", "bao": "búa"}
 3
 4def diem(nuoc_minh, nuoc_kia):
 5    if nuoc_minh == nuoc_kia:
 6        return 0
 7    return 1 if thang[nuoc_minh] == nuoc_kia else -1
 8
 9nuoc_da_choi = ["búa"] + doi_thu[:-1]
10diem_that = sum(diem(a, b) for a, b in zip(nuoc_da_choi, doi_thu))
11diem_co_dinh = {
12    nuoc: sum(diem(nuoc, b) for b in doi_thu)
13    for nuoc in thang
14}
15print(diem_that, diem_co_dinh)
16print(max(diem_co_dinh.values()) - diem_that)

Chương trình được 2. Luôn ra búa được 4, luôn ra kéo cũng được 4, luôn ra bao mất 8. Mốc tốt nhất là 4. Chênh lệch 4 − 2 = 2 gọi là hối tiếc ngoại tại đối với mốc so là các nước cố định. Tính trung bình thì hụt 2/12, tức khoảng 0,167 điểm một ván.

Hối tiếc nhỏ vẫn có thể còn nhiều chỗ để cải thiện

Người biết trước chuỗi kéo, kéo, bao sẽ chơi búa, búa, kéo và thắng cả 12 ván. Hối tiếc ở trên chỉ so với một nước cố định, nên không bắt lỗi hết những chỗ chương trình có thể học quy luật. Muốn thử một bộ đo mạnh hơn, ta phải nói rõ sẽ so với các cách chơi nào và chúng được biết thông tin gì.

Ở bài này đối thủ phát lại một chuỗi cố định. Nếu đối thủ đổi hành động khi thấy An đổi, không thể giữ nguyên chuỗi rồi coi đó là câu trả lời cho mọi tình huống ngoài đời. Khi làm thí nghiệm cho một thuật toán, ghi rõ đối thủ, cách chấm điểm và mốc so quan trọng không kém viết mã.

Tự thử

Sửa đối thủ thành 12 lần ra kéo. Giữ chương trình mở đầu bằng búa rồi chép lượt trước. Điểm của chương trình và hối tiếc sẽ là bao nhiêu?

Đáp án. Chương trình thắng ván đầu rồi hòa 11 ván, được 1 điểm. Luôn ra búa thắng cả 12. Hối tiếc là 12 − 1 = 11. Nhìn lại 35 bài, đây là câu hỏi cuối để tự kiểm tra một mô hình. Bạn đang so kết quả của mình với cái gì, và người chơi có thật sự biết những gì bạn đưa vào phép so đó?

Đọc tiếp trong series

Bài liên quan

Tài liệu tham khảo

Bình luận