Trong thử thách này, bạn sẽ vào vai tình huống khó xử lặp đi lặp lại của tù nhân ồn ào.
Tình thế tiến thoái lưỡng nan của tù nhân là một kịch bản trong lý thuyết trò chơi, nơi có hai người chơi, mỗi người có hai lựa chọn: hợp tác hoặc khiếm khuyết. Mỗi người chơi sẽ làm điều tốt hơn cho chính họ nếu họ đào tẩu hơn là hợp tác, nhưng cả hai người chơi sẽ thích kết quả mà cả hai người chơi hợp tác với người mà cả hai người chơi đều khiếm khuyết.
Tình huống khó xử của tù nhân lặp đi lặp lại là cùng một trò chơi, ngoại trừ bạn chơi với cùng một đối thủ nhiều lần và bạn biết đối thủ của mình đã chơi gì trong quá khứ. Mục tiêu của bạn là luôn tích lũy điểm số cao nhất cho bản thân, bất kể đối thủ của bạn làm thế nào.
Tình trạng khó xử lặp đi lặp lại ồn ào của tù nhân giới thiệu một số tiếng ồn vào giao tiếp. Kiến thức của bạn về những gì đối thủ của bạn đã chơi trong quá khứ sẽ có một số tiếng ồn được giới thiệu. Bạn cũng sẽ biết những gì bạn đã thực hiện trong quá khứ. Tốc độ tiếng ồn không đổi trong một vòng so với cùng một đối thủ, nhưng khác nhau giữa các vòng khác nhau.
Thử thách
Trong thử thách này, bạn sẽ viết một chương trình Python 3 để chơi trò tiến thoái lưỡng nan của tù nhân ồn ào.
Chương trình của bạn sẽ nhận được ba đầu vào:
Di chuyển của riêng bạn, không áp dụng lật ngẫu nhiên.
Di chuyển của đối thủ của bạn, với lật ngẫu nhiên được áp dụng.
Một biến trạng thái, bắt đầu như một danh sách trống mỗi vòng và bạn có thể sửa đổi nếu muốn. Bạn có thể bỏ qua điều này nếu bạn không muốn sử dụng nó.
Chương trình của bạn nên xuất ra 'c'
để hợp tác hoặc 'd'
để sửa lỗi.
Chẳng hạn, đây là một chương trình hợp tác nếu đối thủ đã hợp tác ít nhất 60% thời gian trong quá khứ, sau khi các lần lật ngẫu nhiên được áp dụng và trong 10 lần lật đầu tiên:
def threshold(my_plays, their_flipped_plays, state):
if len(their_flipped_plays) < 10:
return 'c'
opp_c_freq = their_flipped_plays.count('c')/len(their_flipped_plays)
if opp_c_freq > 0.6:
return 'c'
else:
return 'd'
Nếu bạn không biết Python, hãy viết bài đăng của bạn bằng mã giả và ai đó (tôi hoặc thành viên khác của trang web) có thể tạo chương trình Python tương ứng.
Trò chơi
Người chạy giải đấu có thể được tìm thấy ở đây: trò chơi ồn ào . Chạy noisy-game.py
để chạy giải đấu. Tôi sẽ giữ cho kho lưu trữ được cập nhật với các bài nộp mới. Chương trình ví dụ có thể được tìm thấy trong basic.py
.
Điểm tổng thể của một chương trình là tổng số điểm của nó trên 100 lượt chơi.
Một trò chơi bao gồm các trận đấu vòng tròn của mỗi người chơi với mỗi người chơi, bao gồm cả chính nó. Một trận đấu bao gồm 100 vòng. Một vòng bao gồm 300 di chuyển, mỗi bước bao gồm đầu ra 'c'
hoặc 'd'
.
Bài dự thi của bạn sẽ diễn ra một trận đấu với mọi bài dự thi, bao gồm bài của bạn. Mỗi trận đấu sẽ bao gồm 100 vòng. Trong mỗi vòng, xác suất lật sẽ được chọn ngẫu nhiên từ [0, 0.5]
.
Mỗi vòng sẽ bao gồm 300 di chuyển. Trong mỗi lần di chuyển, cả hai chương trình sẽ nhận được tất cả các lần phát trước mà chúng đã thử và tất cả các lần phát trước mà chương trình khác đã thực hiện, sau khi lật được áp dụng và một biến trạng thái, là danh sách có thể thay đổi mà chương trình có thể sửa đổi nếu muốn. Các chương trình sẽ xuất ra di chuyển của họ.
Di chuyển được ghi như sau: Nếu một chương trình chơi một 'c'
, chương trình đối lập được 2 điểm. Nếu một chương trình phát một 'd'
, chương trình đó được 1 điểm.
Sau đó, mỗi lần di chuyển được lật độc lập với xác suất bằng xác suất lật và được lưu trữ để hiển thị cho đối thủ.
Sau khi tất cả các vòng đã được chơi, chúng tôi tổng số điểm mỗi người chơi có được trong mỗi trận đấu. Sau đó, chúng tôi sử dụng hệ thống tính điểm sau để tính điểm của từng người chơi cho trò chơi. Việc ghi điểm này được thực hiện sau khi tất cả các trận đấu kết thúc.
Chấm điểm
Chúng tôi sẽ sử dụng tính điểm tiến hóa. Mỗi chương trình bắt đầu với trọng lượng bằng nhau. Sau đó, các trọng số được cập nhật như sau, trong 100 lần lặp, sử dụng tổng số điểm từ trò chơi:
Trọng lượng mới của mỗi chương trình tỷ lệ thuận với sản phẩm của trọng lượng trước đó và tổng điểm trung bình của nó, được cân bằng trọng lượng của đối thủ.
100 bản cập nhật như vậy được áp dụng và các trọng số cuối cùng là điểm số của mỗi chương trình cho lần chạy đó của trò chơi.
Điểm tổng thể sẽ là tổng số hơn 100 lượt chơi.
Người chơi sẽ có tất cả các câu trả lời hợp lệ cho thử thách này, cộng với sáu chương trình cơ bản để giúp chúng tôi bắt đầu.
Hãy cẩn thận
Không sửa đổi các đầu vào. Không cố gắng ảnh hưởng đến việc thực hiện bất kỳ chương trình nào khác, ngoại trừ thông qua hợp tác hoặc đào thoát. Không thực hiện một đệ trình hy sinh mà cố gắng nhận ra một đệ trình khác và mang lại lợi ích cho đối thủ bằng chi phí riêng của mình. Sơ hở tiêu chuẩn bị cấm.
EDIT: Đệ trình có thể không trùng lặp chính xác bất kỳ chương trình cơ bản hoặc bất kỳ đệ trình trước đó.
Nếu bạn có bất kỳ câu hỏi, hãy hỏi.
Kết quả hiện tại
nicht_genug: 40.6311
stealer: 37.1416
enough: 14.4443
wait_for_50: 6.947
threshold: 0.406784
buckets: 0.202875
change_of_heart: 0.0996783
exploit_threshold: 0.0670485
kickback: 0.0313357
tit_for_stat: 0.0141368
decaying_memory: 0.00907645
tit_for_whoops: 0.00211803
slider: 0.00167053
trickster: 0.000654875
sounder: 0.000427348
tit_for_tat: 9.12471e-05
stubborn_stumbler: 6.92879e-05
tit_for_time: 2.82541e-05
jedi2sith: 2.0768e-05
cooperate: 1.86291e-05
everyThree: 1.04843e-05
somewhat_naive: 4.46701e-06
just_noise: 1.41564e-06
growing_distrust: 5.32521e-08
goldfish: 4.28982e-09
vengeful: 2.74267e-09
defect: 3.71295e-10
alternate: 2.09372e-20
random_player: 6.74361e-21
Kết quả chỉ có câu trả lời cho câu hỏi này và các chương trình cơ bản bỏ qua lối chơi của đối thủ:
nicht_genug: 39.3907
stealer: 33.7864
enough: 20.9032
wait_for_50: 5.60007
buckets: 0.174457
kickback: 0.0686975
change_of_heart: 0.027396
tit_for_stat: 0.024522
decaying_memory: 0.0193272
tit_for_whoops: 0.00284842
slider: 0.00153227
sounder: 0.000472289
trickster: 0.000297515
stubborn_stumbler: 3.76073e-05
cooperate: 3.46865e-05
tit_for_time: 2.42263e-05
everyThree: 2.06095e-05
jedi2sith: 1.62591e-05
somewhat_naive: 4.20785e-06
just_noise: 1.18372e-06
growing_distrust: 6.17619e-08
vengeful: 3.61213e-09
goldfish: 3.5746e-09
defect: 4.92581e-10
alternate: 6.96497e-20
random_player: 1.49879e-20
Chiến thắng
Cuộc thi sẽ mở vô thời hạn, vì các bài nộp mới được đăng. Tuy nhiên, tôi sẽ tuyên bố một người chiến thắng (chấp nhận câu trả lời) dựa trên kết quả 1 tháng sau khi câu hỏi này được đăng.
exploit_threshold()
nhiều lần exploit_threshold1()
, v.v. và thêm chúng vào players
danh sách. Tại sao tôi nhận được kết quả rất khác nhau cho các chiến lược giống hệt nhau?