में इस सवाल का , एक खेल का विकास किया गया है जिसमें खिलाड़ी, कैदी की दुविधा में जोड़ी द्वारा जोड़ी बंद एक दूसरे का सामना निर्धारित करने के लिए जो पुनरावृत्ति रणनीति अन्य के खिलाफ उच्चतम अंक प्राप्त होगा।
में इस सवाल का , मैं कई लोगों को एक ही समय में एक दूसरे के खिलाफ कैदियों 'दुविधा खेलने के लिए के लिए एक तरह से तैयार की। इस भिन्नता में, पेऑफ मैट्रिक्स अनावश्यक है, दो खिलाड़ियों के प्रत्येक जोड़ी के बीच प्रत्येक परिणाम के साथ दो कार्यात्मक स्वतंत्र निर्णय का योग है।
आपका कार्य मल्टीप्लेयर कैदी की दुविधा के इस सममित, सामान्यीकृत संस्करण को चलाने के लिए एक एआई का निर्माण करना है जो उच्चतम स्कोर को प्राप्त करेगा।
खेल के नियम
इस मल्टीप्लेयर के प्रत्येक दौर में, मल्टी-राउंड कैदी की दुविधा, एक खिलाड़ी 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खेल में खिलाड़ियों की कुल संख्या है। प्रत्येक खिलाड़ी को बेतरतीब ढंग से से एक आईडी नंबर दिया जाता है1करने के लिएPखेल की शुरुआत में।Dवर्तमान खिलाड़ी की आईडी है।Nजितने राउंड खेले गए हैं।
Nरेखाएँ, प्रत्येक रेखा एक दौर के परिणामों का प्रतिनिधित्व करती है। लाइन परkकीN, वहाँ कुछ नंबर होगाn_kआदेश दिया जोड़े की(a, b), रिक्त स्थान है, जो यह दर्शाते हैं कि आईडी के साथ खिलाड़ी द्वारा अलगaआईडी के साथ खिलाड़ी से "1 ले लिया"bउस दौर में।एक समान रूप से यादृच्छिक संख्या
Rसे0करने के लिए18446744073709551615(2 64 - 1), एक कूट-यादृच्छिक बीज के रूप में कार्य करने के लिए। इन नंबरों को एक पूर्व-निर्मित फ़ाइल से पढ़ा जाएगा, जो टूर्नामेंट के अंत में जारी किया जाएगा ताकि लोग अपने लिए परिणामों को सत्यापित कर सकें।एक अतिरिक्त रेखा जो आपके कार्यक्रम में पढ़ने के लिए राज्य के कुछ रूप का प्रतिनिधित्व करती है, अगर आपके कार्यक्रम ने पिछले दौर में ऐसा उत्पादन किया था। खेल की शुरुआत में, यह रेखा हमेशा खाली रहेगी। इस लाइन को स्कोरिंग कोड या अन्य कार्यक्रमों द्वारा संशोधित नहीं किया जाएगा।
प्रत्येक कार्यक्रम तब मानक उत्पादन के लिए निम्नलिखित उत्पादन करने के लिए अपनी रणनीति का उपयोग करेगा :
Kसंख्याओं की एक सूची , जो इस दौर से "1 लेगी" कार्यक्रमों की आईडी हैं। एक खाली आउटपुट का मतलब है कि यह कुछ नहीं करेगा।वैकल्पिक रूप से, एक अतिरिक्त रेखा बाद के दौरों को पारित करने के लिए राज्य के कुछ रूप का प्रतिनिधित्व करती है। यह सटीक रेखा अगले दौर में कार्यक्रम में वापस आ जाएगी।
नीचे 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जो प्रत्येक प्रोग्राम के लिए अद्वितीय है।
नीचे एक उदाहरण आउटपुट है जिसमें खिलाड़ी 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।
टूर्नामेंट समाप्त होने के बाद, मैं प्रतियोगिता को चलाने के लिए उपयोग की जाने वाली रैंडम सीड फाइल पोस्ट करूंगा, और लोग टूर्नामेंट में उपयोग किए जाने वाले अन्य शीर्ष को पोस्ट करने की कोशिश करना शुरू कर सकते हैं। हालांकि, वे स्वीकृति या इनाम की गणना नहीं करेंगे।
द होस्ट मशीन
मैं अपने कंप्यूटर पर वर्चुअल मशीन पर इन समाधानों को चला रहा हूं। यह वर्चुअल मशीन 2 गीगाबाइट रैम के साथ उबंटू लिनक्स 14.04 चलाएगी। मेरी बेस मशीन में 3.40 गीगाहर्ट्ज़ पर चलने वाला इंटेल i7-2600K प्रोसेसर है।
आवश्यकताएँ
आपके प्रोग्राम को एक ऐसी भाषा में लिखा जाना चाहिए, जिसके लिए एक कंपाइलर या दुभाषिया जो आपके प्रोग्राम को संकलित करेगा, मौजूद है और उबंटू लिनक्स के नवीनतम संस्करण के लिए आसानी से उपलब्ध है, ताकि मैं सभी सबमिशन चला सकूं और उन्हें एक वर्चुअल मशीन में जज कर सकूं।
आपके प्रोग्राम को 2.000 secondsप्रत्येक राउंड को चलाने के लिए अधिक से अधिक नहीं लेना चाहिए । यदि आपका कार्यक्रम समय से बाहर चला जाता है या कोई त्रुटि उत्पन्न करता है, तो इसका उत्पादन उस दौर के लिए खाली माना जाएगा।
आपका कार्यक्रम निर्धारक होना चाहिए; यही है, इसे हमेशा एक ही इनपुट के लिए एक ही आउटपुट वापस करना होगा। छद्म आयामी समाधान की अनुमति है; हालाँकि, उनकी यादृच्छिकता इनपुट के रूप में दिए गए यादृच्छिक बीज पर निर्भर होनी चाहिए और कुछ नहीं। पायथन की मदद से बीज फाइल तैयार की गई os.urandom। इसमें कुल 500 लाइनें शामिल हैं (यदि आवश्यक हो तो अधिक उत्पन्न होगी), और इसका SHA256 हैश है K+ics+sFq82lgiLanEnL/PABQKnn7rDAGmO48oiYxZk=। टूर्नामेंट खत्म होने के बाद इसे यहां अपलोड किया जाएगा।
पौधे
चीजों को किक करने के लिए, शुरुआती भोले रणनीतियों का प्रतिनिधित्व करते हुए, चार "पौधे" होंगे। ये टूर्नामेंट में आपके सबमिशन के साथ खेलेंगे। हालांकि, इस संभावना के मामले में कि उनमें से एक जीतता है, एक पौधे के अलावा किसी खिलाड़ी द्वारा प्राप्त उच्चतम स्कोर को विजेता माना जाएगा।
प्रत्येक पौधे की फ़ाइल के हैश की गणना करने के लिए, 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
इन चार में से केवल 100 राउंड के टूर्नामेंट में, उन्हें स्कोर प्राप्त होता है:
Lazy: -204
Greedy: -100
Wrathful: -199
Envious: -199
कार्यक्रम को देखते हुए
मैंने जज प्रोग्राम पोस्ट किया है जिसका उपयोग मैं गितुब में करूंगा । इसे डाउनलोड करें और इसका परीक्षण करें। (और शायद एक बग या दो को ठीक करें यदि आप एक पाते हैं।: पी)
इसके पास फिलहाल पायथन के अलावा किसी अन्य चीज के लिए संकलन विकल्प नहीं हैं। मैं बाद में उन लोगों में शामिल हो जाऊंगा - यदि लोग अन्य भाषाओं के संकलन या व्याख्या लिपियों में योगदान दे सकते हैं, तो मैं बहुत अधिक बाध्य होऊंगा।
चरण 2: स्रोत कोड सबमिशन
मैंने tournamentप्रतियोगिता के लिए Github रिपॉजिटरी में एक नई शाखा पोस्ट की है , जिसमें pd_rand फ़ाइल और अन्य प्लांट प्रविष्टियाँ हैं। आप या तो अपने स्रोत कोड को यहां पोस्ट कर सकते हैं या पुल शाखा के रूप में उस शाखा में जमा कर सकते हैं।
प्रतियोगियों का क्रम निम्नानुसार होगा:
'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 अंक हैं!
दुर्भाग्य से, इसका स्कोर सकारात्मक नहीं था, लेकिन हम शायद ही कभी कैदी की दुविधा के एक सिमुलेशन में उम्मीद कर सकते हैं कि हर कोई जीतने के लिए खेल रहा है।
कुछ आश्चर्यजनक परिणाम (कम से कम मुझे लगा कि आश्चर्यचकित थे):
टेट के लिए लालची ने अधिक से अधिक स्कोर किया, और वास्तव में, आमतौर पर सभी स्कोररों की तुलना में अधिक था।
न्यायाधीश, जो "नैतिकता प्रवर्तक" चरित्र का एक प्रकार होना चाहिए था (यह मूल रूप से 1 लिया जिसने भी किसी से 1 लिया है, जो उपरोक्त औसत संख्या से 1 बार लिया गया) बल्कि उच्च स्कोरिंग स्कोरिंग समाप्त हो गया, जबकि सिमुलेशन परीक्षण में, यह वास्तव में था। बल्कि कम स्कोर प्राप्त करें।
और अन्य (जो मुझे लगा) इतने आश्चर्य की बात नहीं थी:
रोगी ने द क्रोधी से अधिक 484 अंक पूरे किए। यह वास्तव में उस पहली बार सहयोग करने के लिए भुगतान करता है।
एक प्रतिशत बहुत जल्दी लगभग किसी के पास नहीं था जबकि वे नीचे थे। लगता है कि 1% केवल इस तरह से रह सकते हैं क्योंकि उनके पास खेल में अधिक खिलाड़ी हैं।
वैसे भी, अब टूर्नामेंट खत्म हो चुका है, आप जितने चाहें उतने अतिरिक्त खिलाड़ी पोस्ट करने के लिए स्वतंत्र महसूस कर सकते हैं, और जज प्रोग्राम का उपयोग करके उनके साथ परीक्षण कर सकते हैं।