에서 이 질문에 , 게임은 플레이어가, 죄수의 딜레마에서 쌍 쌍 떨어져 서로 마주 것이 다른 사람에 대한 가장 높은 점수 반복하는 전략 결정하는 고안되었다.
에서 이 질문에 , 나는 여러 사람이 모두 같은 시간에 서로 죄수의 딜레마를 재생할 수있는 방법을 고안했다. 이 변형에서, 지불 행렬은 불필요하며, 두 플레이어의 각 쌍 사이의 각 결과는 기능적으로 독립적 인 두 가지 결정의 합이다.
당신의 임무는 가능한 한 가장 높은 점수를 얻을 수있는 멀티 플레이어 죄수의 딜레마의 대칭, 일반화 버전을 재생하기 위해 AI를 구축하는 것입니다.
게임의 규칙
이 멀티 플레이어, 멀티 라운드 포로의 딜레마의 각 라운드에서 플레이어 A
는 다른 플레이어로부터 "1을 가져 오기"로 결정할 수 있습니다 B
. 이 상황에서 A
의 점수는 1 씩 증가하고 B
점수는 2만큼 감소합니다.이 결정은 각 주문한 플레이어 쌍간에 이루어질 수 있습니다.
이는 각 선수에 대해 유일하게 내려진 결정입니다. 각 선수는 "1 명을 취하거나"1 명을 취하지 않기로 결정합니다. 이는 각각 탈퇴 및 협력과 상동입니다. 두 선수 사이의 효과적인 보수 매트릭스 P1
와 P2
모양은 다음과 같습니다 :
P1/P2 P1 Take1 P1 Don't
P2 Take1 -1/-1 -2/+1
P2 Don't +1/-2 0/ 0
토너먼트 절차
게임은 P * 25
라운드 로 구성되며 , P
참가 선수의 수는 어디 입니까? 모든 플레이어는 점수로 시작 0
합니다. 각 라운드는 다음 절차로 구성됩니다.
라운드가 시작될 때, 각 프로그램은 다음 형식으로 표준 입력에서 이전 라운드의 이력을받습니다 :
3 개 숫자를 포함 한 라인,
P
,D
,와N
.P
게임의 총 플레이어 수입니다. 각 플레이어는 무작위에서 ID 번호를 할당1
하는P
게임의 시작 부분에.D
현재 플레이어의 ID입니다.N
플레이 한 라운드 수입니다.
N
각 라인은 라운드의 결과를 나타냅니다. 행에서k
의N
일부 수있을 것이다n_k
순서쌍의(a, b)
ID와 플레이어가 나타내는 공간으로 구분a
ID와 플레이어에서 "1했다"b
그 라운드.균일 한 난수
R
의0
행18446744073709551615
(2 64 - 1의), 의사 랜덤 씨드로서 작용한다. 이 숫자는 미리 생성 된 파일에서 읽히고 토너먼트 종료시 공개되어 사람들이 결과를 확인할 수 있습니다.프로그램이 이전 라운드에서 이러한 출력을 생성 한 경우 프로그램에 읽을 상태의 형태를 나타내는 하나의 추가 행. 게임이 시작될 때이 줄은 항상 비어 있습니다. 이 줄은 점수 코드 또는 다른 프로그램에 의해 수정되지 않습니다.
각 프로그램은 전략을 사용하여 다음 을 표준 출력 으로 생성합니다 .
K
이 라운드에서 "1"을받는 프로그램의 ID 인 숫자 목록 . 빈 출력은 아무 것도 수행하지 않음을 의미합니다.선택적으로, 다음 라운드로 넘어 가기 위해 어떤 형태의 상태를 나타내는 하나의 추가 라인. 이 정확한 라인은 다음 라운드에서 프로그램으로 피드백됩니다.
아래는 3
4 인용 게임에서 ID 플레이어의 게임 시작에 대한 입력 예 입니다.
4 3 0
4696634734863777023
아래는 몇 라운드가 이미 진행된 동일한 게임에 대한 입력 예입니다.
4 3 2
(1, 2) (1, 3) (1, 4) (4, 2)
(1, 3) (2, 1) (2, 4) (3, 1) (4, 1)
4675881156406346380
각 프로그램은 각 프로그램 D
에 고유 한 ID 번호 를 제외하고 라운드에 대해 정확히 동일한 입력을 받습니다.
아래는 플레이어 3
가 다른 사람으로부터 1을 받는 출력 예 입니다.
1 2 4
필요한 모든 라운드가 끝나면 최종 점수가 가장 높은 플레이어가 승자가됩니다.
타임 라인
이 토너먼트의 코딩은 총 7 일 동안 지속됩니다. 제출 마감일은 2014-05-09 00:00 UTC
입니다.
이 날짜 이전에 실제 프로그램을 게시하지 마십시오 – 프로그램 소스 코드의 SHA256 해시를 확약으로 게시하십시오. 마감일 전에 언제든지이 해시를 변경할 수 있지만 마감일 이후에 게시 된 약속은 판단을 위해 수락되지 않습니다. (내 검증 프로그램이베이스 64를 뱉어 내고보다 컴팩트 한 표기법이므로 해시에 기본 64 표기법을 사용하십시오.)
마감일이 끝나면, 2014-05-10 00:00 UTC
제출할 프로그램의 실제 소스 코드를 게시하는 데 1 일이 걸립니다. 게시 된 소스 코드의 SHA256 해시가 마감일 전에 게시 한 해시와 일치하지 않으면 토너먼트에 코드가 적용되지 않습니다.
그런 다음 모든 제출물을 내 컴퓨터에 다운로드하고이 배틀 로얄에서 모든 토너먼트 참가작을 실행하여 2 일 이내에 결과를 게시 할 예정 2014-05-12 00:00 UTC
입니다.
최고 점수를받은 답변을 수락하고 최종 점수가보다 큰 경우 해당 답변에 +100의 현상금을 부여합니다 0
.
토너먼트가 끝나면 경쟁을 진행하는 데 사용되는 임의의 시드 파일을 게시하고 사람들은 토너먼트에 사용 된 솔루션보다 상위에있는 다른 솔루션을 게시하기 시작할 수 있습니다. 그러나 그들은 수락 또는 현상금으로 계산되지 않습니다.
호스트 머신
이 솔루션을 내 컴퓨터의 가상 머신에서 실행할 것입니다. 이 가상 머신은 2GB의 RAM으로 Ubuntu Linux 14.04를 실행합니다. 기본 시스템에는 3.40GHz에서 실행되는 Intel i7-2600K 프로세서가 있습니다.
요구 사항
귀하의 프로그램은 귀하의 프로그램을 컴파일 할 컴파일러 또는 인터프리터가 존재하는 언어로 작성되어야하며 최신 버전의 Ubuntu Linux에서 즉시 사용할 수 있으므로 모든 제출물을 실행하고 가상 머신에서 판단 할 수 있습니다.
귀하의 프로그램은 2.000 seconds
각 라운드를 실행하는 것 이상 을 가져서는 안됩니다 . 프로그램이 시간이 없거나 오류를 생성하면 해당 라운드에서 출력이 비어있는 것으로 간주됩니다.
프로그램은 결정 론적이어야합니다. 즉, 항상 동일한 입력에 대해 동일한 출력을 반환해야합니다. 의사 랜덤 솔루션이 허용됩니다. 그러나 그 무작위성은 입력으로 주어진 무작위 시드에 의존해야하며 다른 것은 없습니다. 시드 파일은 Python을 사용하여 생성되었습니다 os.urandom
. 총 500 줄이 포함되어 있으며 필요한 경우 더 생성됩니다 K+ics+sFq82lgiLanEnL/PABQKnn7rDAGmO48oiYxZk=
. SHA256 해시는 입니다. 토너먼트가 끝나면 여기에 업로드됩니다.
식물
일을 시작하기 위해 초기 순진 전략을 나타내는 4 개의 "식물"이있을 것입니다. 이들은 귀하의 제출물과 함께 토너먼트에서 진행됩니다. 그러나, 그들 중 하나가 이길 가능성이없는 경우, 식물 이외의 플레이어가 얻은 최고 점수가 승자로 간주됩니다.
각 플랜트 파일의 해시를 계산하려면 여기에서 포맷터가 탭 문자를 좋아하지 않기 때문에 4 개의 공백 그룹을 모두 탭으로 바꿉니다.
게으른 — 아무것도하지 않습니다.
n1bnYdeb/bNDBKASWGywTRa0Ne9hMAkal3AuVZJgovI=
pass
욕심 — 항상 다른 사람으로부터 1을받습니다.
+k0L8NF27b8+Xf50quRaZFFuflZhZuTCQOR5t5b0nMI=
import sys
line1 = sys.stdin.readline()
n = [int(i) for i in line1.split()]
for i in range(n[0]):
if i+1 != n[1]:
print i+1,
print
분노한 자 — 첫 번째 라운드에서 다른 모든 사람으로부터 1을 가져오고 이후 라운드에서 1을 얻은 모든 사람에서 1을 가져옵니다.
Ya2dIv8TCh0zWzRfzUIdFKWj1DF9GXWhbq/uN7+CzrY=
import sys
import re
line1 = [int(i) for i in sys.stdin.readline().split()]
players = line1[0]
pid = line1[1]
rounds = line1[2]
lines = []
if rounds == 0:
for i in range(players):
if i+1 != pid:
print i+1,
print
else:
for i in range(rounds):
lines.append(sys.stdin.readline())
lastline = lines[-1]
takes = re.findall(r'\([0-9]+, [0-9]+\)', lastline)
for take in takes:
sides = [int(i) for i in re.findall(r'[0-9]+', take)]
if sides[1] == pid:
print sides[0],
print
부러워 -현재 최고 점수를 획득 한 플레이어의 50 %에서 1을 내림차순으로 내 립니다.
YhLgqrz1Cm2pEcFlsiIL4b4MX9QiTxuIOBJF+wvukNk=
import sys
import re
line1 = [int(i) for i in sys.stdin.readline().split()]
players = line1[0]
pid = line1[1]
rounds = line1[2]
lines = []
scores = [0] * players
if rounds == 0:
for i in range(players):
if i+1 != pid:
print i+1,
print
else:
for i in range(rounds):
takes = re.findall(r'\([0-9]+, [0-9]+\)', sys.stdin.readline())
for take in takes:
sides = [int(i) for i in re.findall(r'[0-9]+', take)]
scores[sides[0] - 1] += 1
scores[sides[1] - 1] -= 2
score_pairs = [(i+1, scores[i]) for i in range(players)]
score_pairs.sort(key=lambda x:(x[1], x[0]))
score_pairs.reverse()
taken = 0
j = 0
while taken < (players) / 2:
if score_pairs[j][0] != pid:
print score_pairs[j][0],
taken += 1
j += 1
이 4 개의 라운드 중 100 라운드 토너먼트에서 다음과 같은 점수를받습니다.
Lazy: -204
Greedy: -100
Wrathful: -199
Envious: -199
심사 프로그램
Github에 사용할 판사 프로그램을 게시했습니다 . 다운로드하여 테스트하십시오. (그리고 하나를 찾으면 버그를 수정하십시오. : P)
현재 파이썬 이외의 다른 컴파일 옵션이 없습니다. 나는 나중에 그것들을 포함시킬 것이다. 만약 사람들이 다른 언어에 대한 편집이나 해석 스크립트를 제공 할 수 있다면, 나는 많은 의무를지게 될 것이다.
2 단계 : 소스 코드 제출
tournament
pd_rand 파일 및 기타 플랜트 항목이 포함 된 컨테스트의 Github 저장소에 새 브랜치 를 게시했습니다 . 소스 코드를 여기에 게시하거나 풀 요청으로 해당 지점에 제출할 수 있습니다.
참가자의 순서는 다음과 같습니다.
'begrudger'
'regular'
'patient'
'lazy'
'backstab'
'bully'
'lunatic'
'envious'
'titfortat'
'greedy'
'wrathful'
'judge'
'onepercent'
최종 점수
내 테스트 프로그램의 출력 :
Final scores:
begrudger -2862
regular -204
patient -994
lazy -2886
backstab -1311
bully -1393
lunatic -1539
envious -2448
titfortat -985
greedy -724
wrathful -1478
judge -365
onepercent -1921
랭킹 :
1. regular -204
2. judge -365
3. greedy -724
4. titfortat -985
5. patient -994
6. backstab -1311
7. bully -1393
8. wrathful -1478
9. lunatic -1539
10. onepercent -1921
11. envious -2448
12. begrudger -2862
13. lazy -2886
따라서 승자는 실제로 플레이어입니다. -204 포인트로 The Regular입니다!
불행히도 그 점수는 긍정적이지 않았지만, 모두가 승리하기 위해 반복되는 죄수의 딜레마 시뮬레이션에서 거의 기대할 수 없습니다.
몇 가지 놀라운 결과 (적어도 놀랍다 고 생각했습니다) :
Greedy는 Tat의 Tit보다 더 많은 점수를 받았고 실제로 대부분의 득점자보다 일반적으로 더 높습니다.
일종의 "도덕적 집행자"캐릭터로 여겨지는 판사 (기본적으로 평균 이상의 횟수에서 1 명을 얻은 사람 중 1 명을 가져간 사람)는 다소 높은 점수를 얻었습니다. 시뮬레이션 테스트에서는 실제로 다소 낮은 점수를 얻습니다.
그리고 다른 사람들은 (놀랐습니다) 놀라지 않았습니다.
환자는 진노보다 484 점을 더 많이 기록했습니다. 처음으로 협력하는 것은 정말 대가입니다.
한 퍼센트는 그들이 쓰러 졌을 때 거의 아무도 쫓아 낼 수 없었습니다. 1 %는 게임에 더 많은 선수가 있기 때문에 그런 식으로 만 머무를 수 있습니다.
어쨌든 토너먼트가 끝나면 원하는만큼의 추가 플레이어를 자유롭게 게시하고 판사 프로그램을 사용하여 주변을 테스트하십시오.