शोरगुल ने कैदी की दुविधा को खत्म कर दिया


35

इस चुनौती में, आप शोरगुल वाले कैदी की दुविधा को निभाएंगे।

कैदी की दुविधा सहयोग करते हैं, या दोष: गेम थ्योरी में एक परिदृश्य में जहाँ दो खिलाड़ियों, दो विकल्पों के साथ प्रत्येक देखते हैं है। यदि वे सहयोग करते हैं तो प्रत्येक खिलाड़ी उनके लिए बेहतर प्रदर्शन करता है, लेकिन दोनों खिलाड़ी उस परिणाम को पसंद करेंगे, जहां दोनों खिलाड़ी उस स्थान पर सहयोग करते हैं, जहां दोनों खिलाड़ी दोष करते हैं।

पुनरावृत्त कैदी की दुविधा वही खेल है, जिसे छोड़कर आप एक ही प्रतिद्वंद्वी के खिलाफ बार-बार खेलते हैं, और आप जानते हैं कि आपके प्रतिद्वंद्वी ने अतीत में क्या खेला है। आपका उद्देश्य हमेशा अपने आप के लिए उच्चतम स्कोर जमा करना है, चाहे आपका प्रतिद्वंद्वी कैसा भी हो।

शोर कैदी की दुविधा संचार में कुछ शोर का परिचय देता है। आपके प्रतिद्वंद्वी ने अतीत में जो कुछ खेला है उसका आपका ज्ञान कुछ शोर पेश करेगा। आपको यह भी पता चल जाएगा कि आपने अतीत में क्या कदम उठाए हैं। एक ही प्रतिद्वंद्वी के खिलाफ एक राउंड में शोर की दर लगातार होती है, लेकिन विभिन्न राउंड के बीच भिन्न होती है।

चुनौती

इस चुनौती में, आप शोरगुल वाले कैदी की दुविधा को निभाने के लिए पायथन 3 प्रोग्राम लिखेंगे।

आपके कार्यक्रम को तीन इनपुट प्राप्त होंगे:

  • यादृच्छिक चालन के बिना आपकी अपनी चाल ।

  • रैंडम फ्लैप के साथ आपके प्रतिद्वंद्वी की चाल।

  • एक राज्य चर, जो प्रत्येक दौर में एक खाली सूची के रूप में शुरू होता है, और जिसे आप चाहें तो संशोधित कर सकते हैं। यदि आप इसका उपयोग नहीं करना चाहते हैं तो आप इसे अनदेखा कर सकते हैं।

आपका कार्यक्रम 'c'सहयोग करने के लिए या 'd'दोष के लिए आउटपुट होना चाहिए ।

उदाहरण के लिए, यहां एक कार्यक्रम है जो सहयोग करता है यदि प्रतिद्वंद्वी ने अतीत में कम से कम 60% समय का सहयोग किया है, यादृच्छिक फ़्लिप लागू होने के बाद, और पहले 10 फ़्लिप के लिए:

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'

यदि आप पायथन को नहीं जानते हैं, तो अपने जमाव को pseudocode में लिखें, और कोई व्यक्ति (मुझे या साइट का कोई अन्य सदस्य) संबंधित पायथन प्रोग्राम बना सकता है।

गेमप्ले

टूर्नामेंट धावक यहाँ पाया जा सकता है: शोर-खेलnoisy-game.pyटूर्नामेंट चलाने के लिए दौड़ें। मैं उस रिपॉजिटरी को नए सबमिशन के साथ अपडेट करता रहूंगा। उदाहरण कार्यक्रम में पाया जा सकता है basic.py

एक कार्यक्रम का कुल स्कोर खेल के 100 से अधिक नाटकों का कुल स्कोर है।

एक खेल में प्रत्येक खिलाड़ी के खिलाफ प्रत्येक खिलाड़ी के राउंड-रॉबिन मैचअप शामिल हैं, जिसमें स्वयं भी शामिल है। एक मैचअप में 100 राउंड होते हैं। एक दौर में 300 चालें होती हैं, जिनमें से प्रत्येक में आउटपुट 'c'या शामिल होता है 'd'

आपका सबमिशन आपके स्वयं सहित, हर सबमिशन के विरुद्ध एक मैचअप होगा। प्रत्येक मैचअप में 100 राउंड शामिल होंगे। प्रत्येक दौर के दौरान, एक फ्लिप संभावना को समान रूप से यादृच्छिक रूप से चुना जाएगा [0, 0.5]

प्रत्येक दौर में 300 चालें शामिल होंगी। प्रत्येक चाल पर, दोनों कार्यक्रमों को वे सभी पिछले नाटक प्राप्त होंगे जो उन्होंने प्रयास किए हैं, और सभी पिछले नाटकों ने अन्य कार्यक्रम बनाए हैं, फ़्लिप लागू होने के बाद, और एक राज्य चर, जो एक परिवर्तनशील सूची है जिसे प्रोग्राम संशोधित कर सकता है यदि वह चाहता है। कार्यक्रम उनकी चाल का उत्पादन करेंगे।

मूव्स निम्नानुसार किए जाते हैं: यदि कोई प्रोग्राम खेलता है 'c', तो विरोधी प्रोग्राम को 2 अंक मिलते हैं। यदि कोई प्रोग्राम निभाता है 'd', तो उस प्रोग्राम को 1 अंक मिलता है।

फिर, प्रत्येक कदम फ्लिप संभावना के बराबर संभावना के साथ स्वतंत्र रूप से फ़्लिप किया जाता है, और प्रतिद्वंद्वी को दिखाने के लिए संग्रहीत किया जाता है।

सभी राउंड खेले जाने के बाद, हम प्रत्येक मैचअप में प्रत्येक खिलाड़ी को मिलने वाले अंकों की संख्या का योग करते हैं। फिर, हम खेल के लिए प्रत्येक खिलाड़ी के स्कोर की गणना करने के लिए निम्नलिखित स्कोरिंग प्रणाली का उपयोग करते हैं। यह स्कोरिंग सभी मैचअप के पूरा होने के बाद किया जाता है।

स्कोरिंग

हम विकासवादी स्कोरिंग का उपयोग करेंगे। प्रत्येक कार्यक्रम समान वजन के साथ शुरू होता है। फिर, खेल से बिंदु योगों का उपयोग करते हुए, 100 पुनरावृत्तियों के लिए, वज़न को निम्नानुसार अपडेट किया जाता है:

प्रत्येक कार्यक्रम का नया वजन उसके पिछले वजन के उत्पाद और उसके औसत बिंदु के अनुपात में होता है, जो कि उसके विरोधियों के वजन से होता है।

इस तरह के 100 अपडेट लागू होते हैं, और गेम के उस रन के लिए अंतिम वेट प्रत्येक प्रोग्राम का स्कोर होता है।

कुल मिलाकर स्कोर खेल के 100 से अधिक रन होंगे।

खिलाड़ी इस चुनौती के सभी वैध जवाब होंगे, साथ ही हमें शुरू करने के लिए छह बुनियादी कार्यक्रम

चेतावनियां

इनपुट्स को संशोधित न करें। किसी भी अन्य कार्यक्रम के क्रियान्वयन को प्रभावित करने का प्रयास न करें, सिवाय सहयोग या दोष के। एक बलिदान प्रस्तुत न करें जो किसी अन्य सबमिशन को पहचानने का प्रयास करता है और उस प्रतिद्वंद्वी को अपने खर्च पर लाभान्वित करता है। मानक खामियों पर रोक लगाई जाती है।

संपादित करें: प्रस्तुतियाँ मूल कार्यक्रमों या किसी भी पहले प्रस्तुत की नकल नहीं कर सकते हैं ।

यदि आपका कोई प्रश्न है, तो कृपया पूछिए।

वर्तमान परिणाम

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

इस प्रश्न और मूल कार्यक्रमों के केवल उत्तर के साथ परिणाम जो प्रतिद्वंद्वी के खेल को अनदेखा करते हैं:

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

जीतना

नई प्रस्तुतियाँ पोस्ट किए जाने पर प्रतियोगिता अनिश्चित काल तक खुली रहेगी। हालांकि, मैं इस प्रश्न के पोस्ट किए जाने के 1 महीने बाद परिणामों के आधार पर एक विजेता (एक उत्तर स्वीकार करूंगा) की घोषणा करूंगा।


कैसे tit_for_whoops प्रतिद्वंद्वी के खेल को अनदेखा करता है?
LyricLy

@LyricLy मुझे लगता है कि श्रेणी इसहाक द्वारा प्रदान किए गए बुनियादी कार्यक्रमों को संदर्भित करती है जो उनके विरोधियों की उपेक्षा करते हैं।
FryAmTheEggman

1
क्या मैं सही समझता हूं कि आप अपनी सभी चालों को रिकॉर्ड करने के लिए राज्य चर का उपयोग कर सकते हैं जैसे कि आप उन्हें सबमिट करते हैं, और इसलिए अपनी सच्ची चाल और फ़्लिप चाल दोनों को जानते हैं, और फ्लिप संभावना का अनुमान लगाते हैं?
xnor

1
@xnor आपको हमेशा अपनी सही चाल बताई जाती है। यह केवल विरोधियों की चाल है जो फ़्लिप हो सकती है।
मेमनोनिक

1
@ आइसाकग मैंने exploit_threshold()कई बार नकल करने की कोशिश की exploit_threshold1(), आदि और उन्हें playersसूची में जोड़ा । समान रणनीतियों के लिए मुझे अलग-अलग परिणाम क्यों मिलते हैं?
NGN

जवाबों:


4

Genug ist nicht genug

(भी बुलाया जा सकता है enough2या stealback)

def nicht_genug(m,t,s):
    if not s:
        s.append("c")
        return "c"
    if s[0]=="t":
        return "d"
    if m[-42:].count("d")>10 or len(t)+t.count("d")>300:
        s[0]="t"
        return "d"
    if t[-1]=="d":
        if s[0]=="d":
            s[0]="c"
            return "d"
        else:
            s[0]="d"
            return "c"
    else:
        if t[-3:].count("d")==0:
            s[0]="c"
        return "c"

मैंने सीखा कि दो चमगादड़ों के लिए मूल शीर्षक ने दो लगातार चमगादड़ों की प्रतीक्षा की tit_for_whoops, और वास्तव में ऐसा लगता है कि हमें क्षमा करना चाहिए और (अच्छी तरह से, लगभग ...) पहले के चमगादड़ को भूल जाना चाहिए। और अंतिम राउंड में बहुत सारे खिलाड़ी खराब हो जाते हैं। मैं तब भी अच्छा होना पसंद करता हूं जब अब तक सब कुछ ठीक रहा है, लेकिन बॉट की सहनशीलता कम होती जा रही है।


11

तैसा-लिए-ओह

Ncase.me/trust की रणनीति से प्रेरित

def tit_for_whoops(m, t, s):
    if len(t) < 2:
        return 'c'
    else:
        return 'd' if all([x == 'd' for x in t[-2:]]) else 'c'

गलतफहमी को रोकने के लिए केवल अगर दूसरे खिलाड़ी ने लगातार दो बार हार मानी है, तो दोष।


आपकी प्रस्तुति के लिए धन्यवाद! ध्यान रखें कि फ्लिप प्रायिकता औसत 1/4 होने के बाद, हर 16 चालों में एक बार डबल-फ्लिप होने जा रहा है।
isaacg

मैंने एक स्टेट वैरिएबल जोड़ा है, जिसे आप इग्नोर कर सकते हैं अगर आप इसका इस्तेमाल नहीं करना चाहते हैं।
इसहाक

9

हृदय परिवर्तन

def change_of_heart(m, t, s):
    return 'c' if len(t) < 180 else 'd'

के माध्यम से हृदय के हिस्से का परिवर्तन होता है। आश्चर्यजनक रूप से अच्छा करता है।


लीड / दूसरा स्थान लेने के लिए बधाई। मैं प्रभावित और हैरान हूं कि रणनीति की अनदेखी करने वाला एक प्रतिद्वंद्वी इतना अच्छा करता है।
ईसैक

9

रणनीति चुराने वाला

पर्याप्त, चेंज_ऑफ_हार्ट और टाइट-फॉर-वूप्स से प्रेरित। थोड़ा और क्षमाशील होना चाहिए। मैंने सर्वोत्तम परिणामों के लिए संख्याओं को बदलने की कोशिश की, लेकिन वे बहुत कुछ बदलना नहीं चाहते थे।

def stealer(mine, theirs, state):
    if len(mine) == 0:
        state.append('c')
        return 'c'
    elif len(mine) > 250:
        return "d"
    elif state[0] == 't':
        return 'd'
    elif mine[-40:].count('d') > 10:
        state[0] = 't'
        return 'd'
    elif theirs[-1] == 'd':
        if state[0] == 'd':
            state[0] = 'c'
            return 'd'
        else:
            state[0] = 'd'
            return 'c'
    elif all([x == 'c' for x in theirs[-3:]]):
        state[0] = 'c'
        return 'c'
    else:
        return 'c'

PPCG में आपका स्वागत है!
Giuseppe

लीड लेने के लिए बधाई!
इसहाक

8

तैसा-के लिए समय

def tit_for_time(mine, theirs, state):
    theirs = theirs[-30:]
    no_rounds = len(theirs)
    return "c" if no_rounds < 5 or random.random() > theirs.count("d") / no_rounds else "d"

यदि आप ज्यादातर समय मुझे चोट पहुँचाते हुए बिता रहे हैं, तो मैं आपको वापस चोट पहुँचाऊँगा। शायद।


अच्छा प्रस्तुत! आप वर्तमान में प्रतिद्वंद्वी-जागरूक बुनियादी कार्यक्रमों के बिना 1 स्थान पर हैं।
इसहाक

7

बढ़ता हुआ डिस्ट्रॉस्ट

import random

def growing_distrust(mine, theirs, state):
    # Start with trust.
    if len(mine) == 0:
        state.append(dict(betrayals=0, trust=True))
        return 'c'

    state_info = state[0]

    # If we're trusting and we get betrayed, trust less.
    if state_info['trust'] and theirs[-1] == 'd':
        state_info['trust'] = False
        state_info['betrayals'] += 1

    # Forgive, but don't forget.
    if random.random() < 0.5 ** state_info['betrayals']:
        state_info['trust'] = True

    return 'c' if state_info['trust'] else 'd'

जितना अधिक प्रतिद्वंद्वी मुझे धोखा देता है, उतना ही मैं भरोसा कर सकता हूं कि यह सिर्फ शोर था।


हाँ, कोई भी राज्य की बात दुर्भाग्यपूर्ण नहीं है, लेकिन मैं चाहता था कि प्रस्तुतियाँ एक समान हों, इसलिए यह सबसे अच्छा है जो मैं सोच सकता था। क्या आपके पास राज्य को जोड़ने के लिए कोई विचार है?
isaacg

बस एक stateतर्क है कि डिफ़ॉल्ट रूप से एक सूची है? सूचियाँ परिवर्तनशील हैं, इसलिए राज्य आसानी से परिवर्तनीय होगा।
LyricLy

ऐसा कैसे? मैं नहीं देखता कि यह कैसे हो सकता है।
LyricLy

@ मेनोनिक मुझे लगता है कि मुझे पता है कि इसे कैसे लागू किया जाए। मैं इसे एक चक्कर दूँगा।
इसहाक

मैंने एक स्टेट वैरिएबल जोड़ा, जो आंतरिक रूप से एक खाली सूची है, और जिसे आप संशोधित कर सकते हैं।
इसहाक

7

Jedi2Sith

सभी अच्छे और निस्वार्थ शुरू करता है, लेकिन समय के साथ अंधेरे पक्ष का प्रभाव लगातार मजबूत होता है, जब तक कि कोई वापसी नहीं। इस प्रभाव को कोई रोक नहीं रहा है, लेकिन सभी बुरी चीजें जो सिर्फ घटित होती हैं, वे अंधेरे पक्ष की शक्ति में योगदान करती हैं ...

def jedi2sith(me, them, the_force):
  time=len(them)
  bad_things=them.count('d')
  dark_side=(time+bad_things)/300
  if dark_side>random.random():
    return 'd'
  else:
    return 'c'

इसे ऑनलाइन आज़माएं!


6

स्लाइडर

def slider(m, t, s):
    z = [[2, 1], [0, 1], [2, 3], [2, 1]]
    x = 0
    for y in t:
      x = z[x][y == 'c']
    return 'c' if x < 2 else 'd'

'C' से शुरू होता है, और धीरे-धीरे 'd' से दूर या दूर की ओर स्लाइड करता है।


मैंने राज्य चर का उपयोग करने के लिए इसे कार्यात्मक रूप से समकक्ष फिर से लिखा, क्योंकि यह बहुत धीरे-धीरे चल रहा था। हालाँकि आपको कुछ भी बदलने की आवश्यकता नहीं है।
ईसैक

6

जिद्दी ठोकर

def stubborn_stumbler(m, t, s):
    if not t:
        s.append(dict(last_2=[], last_3=[]))
    if len(t) < 5:
        return 'c'
    else:
        # Records history to state depending if the last two and three
        # plays were equal
        s = s[0]
        if t[-2:].count(t[-1]) == 2:
            s['last_2'].append(t[-1])
        if t[-3:].count(t[-1]) == 3:
            s['last_3'].append(t[-1])
    c_freq = t.count('c')/len(t)
    # Checks if you've consistently defected against me
    opp_def_3 = s['last_3'].count('d') > s['last_3'].count('c')
    opp_def_2 = s['last_2'].count('d') > s['last_2'].count('c')
    # dist func from 0 to 1
    dist = lambda x: 1/(1+math.exp(-5*(x-0.5)))
    # You've wronged me too much
    if opp_def_3 and opp_def_2:
        return 'd'
    # Otherwise, if you're consistently co-operating, co-operate more
    # the less naive you are
    else:
        return 'c' if random.random() > dist(c_freq) - 0.5 else 'd'

दोष और ज्यादातर सहयोग के बीच स्विच करने के लिए केवल सुसंगत नाटकों के साथ रखी गई आपकी शोषण सीमा रणनीति के आधार पर

अद्यतन: दोनों लगातार और तीन लगातार नाटकों का ट्रैक रखता है, केवल कठोर परिस्थितियों में सजा देता है और सुनिश्चित नहीं होने पर यादृच्छिक विकल्प जोड़ता है

अद्यतन 2: निकाले गए शर्त और अतिरिक्त वितरण फ़ंक्शन


लीड लेने के लिए पहला प्रोग्राम लिखने पर बधाई!
isaacg

6

शोर बॉट

def just_noise(m,t,s):
    return 'c' if random.random() > .2 else 'd'

मैं निश्चित रूप से बॉट का सहयोग कर रहा हूं। वह सिर्फ शोर है।


6

अब बहुत हो गया है

def enough(m,t,s):
    if not s:
        s.append("c")
        return "c"
    if s[0]=="t":
        return "d"
    if m[-42:].count("d")>10:
        s[0]="t"
        return "d"
    if t[-1]=="d":
        if s[0]=="d":
            s[0]="c"
            return "d"
        else:
            s[0]="d"
            return "c"
    else:
        return "c"

दो टैट्स के लिए टाइट के रूप में शुरू होता है, जहां दो टैट्स को लगातार (विपरीत tit_for_whoops) नहीं होना पड़ता है । अगर इसे dबहुत बार खेलना है, तो यह d-total हो जाता है ।


लीड लेने के लिए बधाई!
ईसैक

6

सुनहरी बोट

def goldfish(m,t,s):
    return 'd' if 'd' in t[-3:] else 'c'

एक सुनहरी मछली कभी माफ नहीं करती है, लेकिन यह जल्दी से भूल जाती है।


6

चालबाज (फिर से बहाल)

केवल अंतिम 10 नाटकों का ही हिसाब दिया जाता है, लेकिन पाँच के दो खंडों में विभाजित किया जाता है, जिन्हें प्रत्येक अच्छे या बुरे के रूप में वर्गीकृत किया जाता है।

यदि प्रतिद्वंद्वी औसत "अच्छा" खेलता है, तो चालबाज कम और कम अच्छा खेलता है। यदि परिणाम अस्पष्ट हैं तो चालबाज विरोधी को सुरक्षा में फुसलाकर अच्छा खेलता है। यदि प्रतिद्वंद्वी "बुरा" खेलता है तो चालबाज पलटवार करता है।

धोखेबाजों को जल्द पकड़ने के लिए, अब भोले खिलाड़ियों से अंक इकट्ठा करने का विचार है।

import random
def trickster(player,opponent,state):
    pBad = 0.75
    pNice = 0.8
    pReallyBad =0.1
    decay = 0.98
    r = random.random()
    if len(player)<20: #start off nice
        return 'c' 
    else: #now the trickery begins
        last5 = opponent[-5:].count('c')/5.0 > 0.5
        last5old = opponent[-10:-5].count('c')/5.0  > 0.5
        if last5 and last5old: #she is naive, punish her
            pBad = pBad*decay #Increase punishment
            if r<pBad:
                return 'c'
            else:
                return 'd'
        elif last5 ^ last5old: #she is changing her mind, be nice!
            if r<pNice:
                return 'c'
            else:
                return 'd'
        else: #she's ratting you out, retaliate
            pReallyBad = pReallyBad*decay #Retaliate harder
            if r<pReallyBad:
                return 'c'
            else:
                return 'd'

डिस्क्लेमर: मैंने पहले कभी यहां पोस्ट नहीं किया, अगर मैं कुछ गलत कर रहा हूं तो कृपया मुझे बताएं और मैं सही कर दूंगा।


साइट पर आपका स्वागत है! दुर्भाग्य से, आपका कोड वर्तमान में काम नहीं करता है। आपके पास एक के बाद एक एलिफ हैं। क्या आप इसे ठीक कर सकते हैं? धन्यवाद
isaacg

मैं अनुमान लगा रहा हूं कि एलिफ़ से सब कुछ एक बार फिर इंडेंट होना चाहिए?
ईसैक

सही है, मैं इंडेंट करूंगा।
हेक्टर-वार्टगार्ड

@isaacg मैंने एक नए कोड के साथ अपना उत्तर अपडेट किया है। प्रश्न-टिप्पणियों में यह बताने के लिए मेरे पास पर्याप्त प्रतिष्ठा नहीं है। मुझे यकीन नहीं है कि मैं राज्य चर का सही ढंग से उपयोग कर रहा हूं, मुझे लगता है कि यह एक खाली सूची है जिसे मैं जो चाहता हूं, सही कर सकता हूं?
हेकटोर-वार्टगार्ड

2
यह काम नहीं करेगा। प्रत्येक मोड़ के बाद, यह तय किया जाता है कि वर्तमान चाल फ़्लिप है या नहीं (स्वतंत्र रूप से दोनों खिलाड़ियों के लिए)। उसके बाद यह तय हो जाता है। आपको हमेशा वही पहला कदम दिखाई देगा जो फ़्लिप किया जा सकता है या नहीं, लेकिन यह नहीं बदलेगा।
क्रिश्चियन सिवर्स

5

स्मृति क्षय

def decaying_memory(me, them, state):
    m = 0.95
    lt = len(them)

    if not lt:
        state.append(0.0)
        return 'c'

    # If it's the last round, there is no reason not to defect
    if lt >= 299: return 'd'

    state[0] = state[0] * m + (1.0 if them[-1] == 'c' else -1.0)

    # Use a gaussian distribution to reduce variance when opponent is more consistent
    return 'c' if lt < 5 or random.gauss(0, 0.4) < state[0] / ((1-m**lt)/(1-m)) else 'd'

हाल के इतिहास को अधिक तौलता है। धीरे-धीरे अतीत को भूल जाता है।


5

वापसी

def kickback(m, t, s):
  if len(m) < 10:
    return "c"
  td = t.count("d")
  md = m.count("d")
  f = td/(len(t)+1)
  if f < 0.3:
    return "d" if td > md and random.random() < 0.1 else "c"
  return "c" if random.random() > f+2*f*f else "d"

कुछ अस्पष्ट विचार ...


संस्करण में लीड लेने के लिए बधाई जहां अनुकूली मूल मंत्र हटा दिए जाते हैं।
इसहाक

धन्यवाद। मुझे लगता है कि यह आश्चर्यजनक है कि दो परिणाम कितने अलग हैं!
क्रिश्चियन सेवर्स

4

वास्तव में संपूर्ण "शोर" नहीं मिलता है

def vengeful(m,t,s):
    return 'd' if 'd' in t else 'c'

देशद्रोही को कभी माफ नहीं करता।


4

जंगली सूअर का बच्चा:

संपादित करें: संभवतः कम शोर परिदृश्यों में प्रतिशोध जोड़ा गया

मूल रूप से, यदि सभी 4 पहले कदम सहयोग करते हैं, तो इसका मतलब है कि हमें सामान्य से कम शोर की उम्मीद करनी चाहिए। दोष हर बार तो थोड़ा कम करने के लिए हम कभी नहीं दोष से मिल जाएगा, और यह शोर पर दोषी ठहराया जा करने में सक्षम हो जाएगा। अगर वे हमारे खिलाफ दोष लगाते हैं तो हम भी जवाबी कार्रवाई करते हैं

अगर हमारे प्रतिद्वंद्वी उन बारी (2 या अधिक) में बहुत सारे दोष करते हैं, तो हम सिर्फ उन पर पीछे हटते हैं। यदि यह सिर्फ शोर होता, तो शोर वैसे भी हमारी चाल को प्रभावित करता।

अन्यथा, यदि केवल 1 चाल दोष था, तो हम खेल के बाकी हिस्सों के लिए केवल साधारण शीर्षक करते हैं।

def sounder(my, their, state):
    if len(my)<4:
        if their.count("d")>1:
            return "d"
        return "c"
    elif len(my) == 4:
        if all(i == "c" for i in their):
            state.append(0)
            return "d"
        elif their.count("c") == 3:
            state.append(1)
            return "c"
        else:
            state.append(2)
    if state[0] == 2:
        return "d"
    if state[0] == 0:
        if not "d" in my[-4:]:
            return "d"
        return their[-1]
    else:
        return their[-1]

3

वैकल्पिक

def alternate(m, t, s):
    if(len(m)==0):
        return 'c' if random.random()>.5 else 'd'
    elif(len(m)>290):
        return 'd'
    else:
        return 'd' if m[-1]=='c' else 'c'

पहले दौर में बेतरतीब ढंग से चुभता है, फिर बारी-बारी से। हमेशा अंतिम 10 राउंड में दोष।


3

50 की प्रतीक्षा करें

def wait_for_50(m, t, s):
  return 'c' if t.count('d') < 50 else 'd'

50 दोषों के बाद, उन्हें इसे करने दो!


मैंने आपकी मंशा को बचाते हुए आपका अजगर तय किया।
isaacg

तीसरे स्थान पर जाने के लिए बधाई।
isaacg

2

भोले भोले

def somewhat_naive(m, t, s):
    p_flip = 0.25
    n = 10
    if len(t) < n:
        return 'c' if random.random() > p_flip else 'd'
    d_freq = t[-n:].count('d')/n
    return 'c' if d_freq < p_flip else 'd'

मैं सिर्फ यह मानूंगा कि यदि आपने अंतिम n घुमावों में फ्लिप प्रायिकता (मोटे तौर पर) से कम का बचाव किया है, तो यह शोर था और ऐसा नहीं है कि आप मतलब नहीं हैं!

सबसे अच्छा n बाहर आंकड़े नहीं है , उस में आगे देख सकते हैं।


2

हर तीन

def everyThree(me,him,s):
    if len(me) % 3 == 2:
        return "d"
    if len(me) > 250:
        return "d"
    if him[-5:].count("d")>3:
        return "d"
    else:
        return "c"

हर तीन की परवाह किए बिना बदल जाता है। साथ ही पिछले 50 घुमावों को भी समाप्त कर देता है। यह भी पता चलता है कि अगर उसके प्रतिद्वंद्वी ने आखिरी राउंड के 5 में से 4 को हराया है।


2

बाल्टी

def buckets(m, t, s):
    if len(m) <= 5:
        return 'c'
    if len(m) >= 250:
        return 'd'
    d_pct = t[-20:].count('d')/len(t[-20:])
    if random.random() > (2 * d_pct - 0.5):
        return 'c'
    else:
        return 'd'

शुरू करने के लिए अच्छा खेलता है। उनके अंतिम 20 को देखता है, यदि <25% d, रिटर्न c,> 75% d, रिटर्न d, और बीच में एक रैखिक प्रायिकता फ़ंक्शन के साथ यादृच्छिक रूप से चुनता है। अंतिम 50, दोष। यह पिछले 10 में था, लेकिन पिछले 50 दोषों के बहुत सारे देखा।

पहली बार यहाँ इसलिए मुझे बताएं कि क्या कुछ तय करने की आवश्यकता है (या मैं इसे कैसे परीक्षण कर सकता हूं)।


यदि आप स्थानीय रूप से चीजों का परीक्षण करना चाहते हैं, तो आप रिपॉजिटरी को क्लोन कर सकते हैं , और noisy-game.py चला सकते हैं। इसमें कुछ समय लगता है, इसलिए आप कुछ विरोधियों को playersत्वरित पुनरावृत्तियों के लिए निकालना चाहते हैं ।
isaacg

धन्यवाद इसहाक - मुझे इसके साथ खेलना होगा और कुछ छेड़छाड़ करनी होगी।
brian_t

1

तैसा-लिए-स्टेट

दोष अगर प्रतिद्वंद्वी आधे से अधिक समय से खराब हो गया है।

def tit_for_stat(m, t, s):
  if t.count('d') * 2 > len(m):
    return 'd'
  else:
    return 'c'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.