গোলমাল ইটরেটেড বন্দিদের দ্বিধা


35

এই চ্যালেঞ্জের মধ্যে আপনি কোলাহলপূর্ণ পুনরাবৃত্তি হওয়া বন্দীর দ্বিধা খেলবেন।

বন্দীদের দূর্দশা সহযোগিতা, অথবা খুঁত: খেলা তত্ত্ব যেখানে একটি দৃশ্যকল্প দুই খেলোয়াড়, দুটি বিকল্প সঙ্গে প্রতিটি আছে হয়। প্রতিটি খেলোয়াড় তাদের পক্ষে সহযোগিতা করার চেয়ে ত্রুটিযুক্ত থাকলে তারা তাদের পক্ষে আরও ভাল কাজ করে তবে উভয় খেলোয়াড়ই ফলাফলটিকে পছন্দ করবে যেখানে উভয় খেলোয়াড়ই যেখানে দুজন খেলোয়াড় ত্রুটিযুক্ত সেখানে এক সাথে সহযোগিতা করে।

পুনরাবৃত্তি হওয়া বন্দির দ্বিধা একই খেলা, আপনি একই প্রতিপক্ষের বিরুদ্ধে বারবার না খেলে এবং আপনি জানেন যে আপনার প্রতিপক্ষ অতীতে কী খেলেছে। আপনার প্রতিপক্ষ যেভাবেই হোক না কেন আপনার উদ্দেশ্য সর্বদা নিজের জন্য সর্বোচ্চ স্কোর সংগ্রহ করা।

কোলাহলপূর্ণ পুনরাবৃত্তি হওয়া বন্দীর দ্বিধা যোগাযোগের মধ্যে কিছু আওয়াজ দেয় noise আপনার প্রতিপক্ষ অতীতে কী খেলেছে সে সম্পর্কে আপনার জ্ঞানের কিছুটা শব্দ শোনানো হবে। আপনি অতীতে কী পদক্ষেপ নিয়েছেন তাও জানতে পারবেন। শব্দের হার একই প্রতিপক্ষের বিরুদ্ধে একটি রাউন্ডের উপরে ধ্রুবক, তবে বিভিন্ন রাউন্ডের মধ্যে পৃথক।

চ্যালেঞ্জ

এই চ্যালেঞ্জের মধ্যে আপনি কোলাহলপূর্ণ পুনরাবৃত্তি হওয়া বন্দীর দ্বিধা খেলতে পাইথন 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'

আপনি যদি পাইথন না জানেন তবে সিউডোকোডে আপনার জমাটি লিখুন এবং কেউ (আমি বা সাইটের অন্য সদস্য) সংশ্লিষ্ট পাইথন প্রোগ্রামটি তৈরি করতে পারেন।

গেমপ্লের

টুর্নামেন্টের রানারটি এখানে পাওয়া যাবে: গোলমাল-খেলা । চালান noisy-game.pyটুর্নামেন্ট চালানোর জন্য। আমি নতুন জমাগুলি দিয়ে সেই সংগ্রহস্থলটিকে আপডেট রাখব। উদাহরণস্বরূপ প্রোগ্রামগুলি পাওয়া যাবে basic.py

একটি প্রোগ্রামের সামগ্রিক স্কোর হল তার গেমের 100 টির বেশি নাটকের মোট স্কোর।

একটি গেম প্রতিটি খেলোয়াড়ের সাথে নিজের খেলোয়াড়ের বিপরীতে রাউন্ড-রবিন ম্যাচআপগুলি নিয়ে গঠিত। একটি ম্যাচআপ 100 রাউন্ড নিয়ে গঠিত। একটি রাউন্ডে 300 টি মুভ থাকে, যার প্রতিটিটিতে আউটপুটিং 'c'বা জড়িত 'd'

আপনার জমাটি আপনার নিজের সহ প্রতিটি জমা দেওয়ার বিপরীতে ম্যাচআপ খেলবে। প্রতিটি ম্যাচআপ 100 টি রাউন্ড নিয়ে গঠিত। প্রতিটি রাউন্ডের সময় থেকে, এড়াতে এলোমেলোভাবে একটি ফ্লিপ সম্ভাবনা বেছে নেওয়া হবে [0, 0.5]

প্রতিটি রাউন্ডে 300 টি পদক্ষেপ থাকবে। প্রতিটি পদক্ষেপে, উভয় প্রোগ্রামই পূর্ববর্তী সমস্ত নাটকগুলি চেষ্টা করেছে এবং অন্যান্য প্রোগ্রামগুলি পূর্বের সমস্ত নাটকগুলি ফ্লিপ প্রয়োগ করার পরে এবং একটি রাষ্ট্র পরিবর্তনশীল, যা একটি পরিবর্তনীয় তালিকা যা প্রোগ্রামটি চাইলে তা পরিবর্তন করতে পারে receive প্রোগ্রামগুলি তাদের চলনগুলি আউটপুট করবে।

চালগুলি নীচে স্কোর করা হয়: যদি কোনও প্রোগ্রাম একটি খেলে '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 মাস পরে ফলাফলের ভিত্তিতে বিজয়ী (একটি উত্তর গ্রহণ করুন) ঘোষণা করব।


বিরোধী খেলাকে কীভাবে উপেক্ষা করবেন?
LyricLy

@ লিরিকলাই আমি ধরে নিলাম বিভাগটি আইজ্যাকের দেওয়া বেসিক প্রোগ্রামগুলিকে বোঝায় যা তাদের বিরোধীদের উপেক্ষা করে।
FryAmTheEggman

1
আমি কি ঠিক বুঝতে পেরেছি যে আপনি আপনার সমস্ত চলনগুলি জমা দেওয়ার সময় রেকর্ড করতে আপনি রাষ্ট্রের পরিবর্তনশীলটি ব্যবহার করতে পারেন, এবং সুতরাং আপনার সত্য পদক্ষেপ এবং উল্টানো চালগুলি উভয়ই জানেন এবং ফ্লিপের সম্ভাবনাটি অনুমান করতে পারেন?
xnor

1
@ এক্সনর আপনি সর্বদা আপনার আসল চাল সম্পর্কে বলে যান। এটি কেবল প্রতিপক্ষের পদক্ষেপ যা উল্টে যেতে পারে।
মনমোনিক

1
@ আইস্যাচজি আমি ইত্যাদি exploit_threshold()হিসাবে কয়েকবার অনুলিপি করে চেষ্টা exploit_threshold1()করেছি এবং সেগুলি playersতালিকায় যুক্ত করেছি । অভিন্ন কৌশলগুলির জন্য কেন আমি বিস্তৃত ফলাফল পেতে পারি?
এনজিএন

উত্তর:


4

জেনুগ 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

আমি একটি স্টেট ভেরিয়েবল যুক্ত করেছি, যা আপনি যদি এটি ব্যবহার করতে না চান তবে আপনি তা উপেক্ষা করতে পারেন।
isaacg

9

হৃদয়ের পরিবর্তন

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

অবিচ্ছিন্নভাবে হৃদয়ের পরিবর্তন হয়েছে। আশ্চর্যজনকভাবে ভাল করে।


নেতৃত্ব / দ্বিতীয় স্থান গ্রহণের জন্য অভিনন্দন। আমি প্রভাবিত এবং অবাক হয়েছি যে প্রতিপক্ষ কৌশলটি উপেক্ষা করে এত ভাল করে।
isaacg

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'

পিপিসিজিতে আপনাকে স্বাগতম!
জিউসেপ

নেতৃত্ব দেওয়ার জন্য অভিনন্দন!
isaacg

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"

আপনি যদি আমার বেশিরভাগ সময় ব্যথা করে থাকেন তবে আমি আপনাকে কেবল আঘাত করব। সম্ভবত।


ভাল জমা! আপনি বর্তমানে প্রতিপক্ষ সচেতন বেসিক প্রোগ্রামগুলি ছাড়াই প্রথম স্থানে রয়েছেন।
ইসাহাক

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

@ স্মারক আমি মনে করি আমি এটি কীভাবে বাস্তবায়ন করতে জানি। আমি এটি ঘূর্ণি দেব।
isaacg

আমি একটি রাজ্যের ভেরিয়েবল যুক্ত করেছি, যা মূলত একটি খালি তালিকা এবং যা আপনি পরিবর্তন করতে পারেন।
isaacg

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'

'সি' দিয়ে শুরু হয় এবং ধীরে ধীরে 'ডি' এর দিকে বা দূরে সরে যায়।


রাষ্ট্রের ভেরিয়েবলটি ব্যবহার করতে আমি এর কার্যকারিতা সমতুল্য পুনর্লিখন করেছি, কারণ এটি বেশ ধীরে ধীরে চলছিল। তবে আপনাকে কিছু পরিবর্তন করার দরকার নেই।
isaacg

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মোটামুটি যায় ।


নেতৃত্ব দেওয়ার জন্য অভিনন্দন!
isaacg

6

গোল্ডফিশ বট

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

একটি সোনারফিশ কখনও ক্ষমা করে না, তবে তা দ্রুত ভুলে যায়।


6

চালবাজ (আবার পুনঃস্থাপন)

কেবলমাত্র শেষ দশটি নাটকই হিসাবরক্ষিত হয় তবে পাঁচটি দুটি ব্লকে বিভক্ত হয়, যার গড় ভাল বা খারাপ হিসাবে শ্রেণিবদ্ধ করা হয়।

প্রতিপক্ষ যদি গড়ে "দুর্দান্ত" খেলে তবে চালক কম এবং কম সুন্দর খেলেন। ফলাফলগুলি অস্পষ্ট হলে প্রতিপক্ষকে সুরক্ষায় প্ররোচিত করার জন্য চালাকিটি দুর্দান্ত খেলে। যদি প্রতিপক্ষটি "খারাপ" খেলছে বলে প্রতীয়মান হয় তবে চালক প্রতিশোধ নেয়।

ছদ্মবেশী ব্যক্তিদের প্রাথমিক পর্যায়ে ধরা পড়ার সময় নির্দোষ খেলোয়াড়দের কাছ থেকে এখন এবং তারপরে পয়েন্ট সংগ্রহ করা ধারণা The

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
যে কাজ করবে না। প্রতিটি বাঁকের পরে, সিদ্ধান্ত নেওয়া হয় যে বর্তমান পদক্ষেপটি উল্টানো হয়েছে কিনা (দুটি খেলোয়াড়ের জন্য স্বতন্ত্রভাবে)। তারপরে সিদ্ধান্তটি স্থির হয়। আপনি সর্বদা একই প্রথম পদক্ষেপটি দেখতে পাবেন যা উল্টানো বা নাও হতে পারে, তবে এটি পরিবর্তন হবে না।
খ্রিস্টান সিভর্স 9:38

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"

কিছু অস্পষ্ট ধারণা ...


অভিযোজিত বেসিক বানানগুলি সরানো হয়েছে এমন সংস্করণে নেতৃত্ব দেওয়ার জন্য অভিনন্দন।
isaacg

ধন্যবাদ। আমি মনে করি এটি আশ্চর্যজনক যে দুটি ফলাফল কত আলাদা!
খ্রিস্টান সিভর্স 6:18

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'

আমি কেবল ধরে নেব যে আপনি যদি শেষ এন-তে ফ্লিপ সম্ভাবনা (মোটামুটি) এর চেয়ে কম ত্রুটিযুক্ত হন টার্নে এটি শব্দ ছিল এবং আপনি যে বোঝাতে চেয়েছেন তা নয়!

সেরা এন খুঁজে পাওয়া যায় নি , এটি আরও তাকান।


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

buckets

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, রিটার্ন ডি ফিরে আসে এবং এর মধ্যে একটি লিনিয়ার সম্ভাব্যতা ফাংশনটি এলোমেলোভাবে চয়ন করে। শেষ 50, ত্রুটি। এটি গত 10 এ ছিল তবে শেষ 50 টি ত্রুটি রয়েছে।

এখানে প্রথমবার তাই কিছু নির্দিষ্ট করার দরকার আছে কিনা তা আমাকে জানান (বা আমি কীভাবে এটি পরীক্ষা করতে পারি)।


আপনি যদি স্থানীয়ভাবে জিনিসগুলি পরীক্ষা করতে চান তবে আপনি সংগ্রহস্থলটিকে ক্লোন করতে পারেন এবং গোলমাল-গেম.পি চালাতে পারেন। এটি কিছুক্ষণ সময় নেয়, তাই আপনি playersদ্রুত পুনরাবৃত্তির জন্য বিরোধীদের কিছু সরিয়ে নিতে পারেন ।
isaacg

ধন্যবাদ আইজ্যাক - আমাকে এটির সাথে খেলতে হবে এবং কিছু টিঙ্কারিং করতে হবে।
bian_t

1

চামচিকা জন্য তাত্ক্ষণিকবাজার

প্রতিপক্ষের অর্ধেকেরও বেশি সময় ত্রুটিযুক্ত হলে ত্রুটিগুলি।

def tit_for_stat(m, t, s):
  if t.count('d') * 2 > len(m):
    return 'd'
  else:
    return 'c'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.