Prisoner's Dilemma v.3 - Petri Dilemma


17

นักวิทยาศาสตร์บ้าเพิ่งสร้างแบคทีเรียชนิดใหม่! เขาได้ตัดสินใจที่จะตั้งชื่อมันว่าNoblus Gentlemanusหลังจากสังเกตพฤติกรรมของมัน อย่างไรก็ตามแบคทีเรียของเขาหมดอาหารและประกาศสงครามเนื่องจากพวกเขาสามารถเก็บเกี่ยวซากศพของแบคทีเรียอื่นเพื่อเป็นอาหารมากพอที่จะสร้างสำเนาของตัวเอง มีแบคทีเรียหลากหลายชนิดที่มีกลยุทธ์แตกต่างกันในการเล่น Dilemma ซึ่งเป็นเกมโปรดของพวกเขา มีแบคทีเรียห้าตัวจากสายพันธุ์ย่อยที่แตกต่างกัน ในภาวะที่กลืนไม่เข้าคายไม่ออกของนักโทษผู้เล่นสองคนแต่ละคนเลือกข้อบกพร่องหรือร่วมมือกันพร้อมกัน หากผู้เล่นคนใดคนหนึ่งเลือกที่จะร่วมมือกันและผู้เล่นคนอื่นเลือกที่จะเริ่มต้นผู้ defaulter จะได้รับ 2 คะแนนและผู้ประสานงานจะเสีย 3 คะแนน หากผู้เล่นทั้งสองเลือกร่วมมือกันผู้เล่นทั้งสองจะได้ 1 คะแนน หากผู้เล่นทั้งสองเลือกค่าเริ่มต้นผู้เล่นทั้งสองจะเสีย 1 คะแนน

เป็นสุภาพบุรุษประเสริฐพวกแบคทีเรียได้ตัดสินใจที่จะต่อสู้กับสงครามครั้งนี้โดยการเล่นเกมยาว 200 นัดของ Dilemma ของ Iterated Prisoner's ผู้แพ้ของการต่อสู้แต่ละครั้งจะฆ่าตัวตายยอมให้ผู้ชนะทำการโคลนนิ่งตัวเอง ในกรณีที่เน็คไทแบคทีเรียทั้งสองจะมีชีวิตอยู่ แต่จะไม่สามารถทำการโคลนนิ่งได้ นอกจากนี้แบคทีเรียทั้งหมดจากการแข่งขันจะมีคะแนนมากกว่า 10% ในการแข่งขันครั้งต่อไป โคลนดำเนินการผ่านจุดของแบคทีเรียที่ถูกโคลนโดย นอกจากนี้ยังมีโอกาสหนึ่งในสิบทุกครั้งที่แบคทีเรียหนึ่งจะกลายพันธุ์เป็นสายพันธุ์ย่อยอื่นด้วยคะแนนโบนัส 0 (ถ้าฉันได้รับการร้องเรียนเกี่ยวกับการสุ่มนี้ฉันสามารถลบออกได้) หลังจากที่แบคทีเรียได้เล่นดวลเหล่านี้จำนวนเท่ากับจำนวนของเชื้อแบคทีเรียสิบครั้งนักวิทยาศาสตร์บ้าตั้งใจลดจาน Petri ที่แบคทีเรียอาศัยอยู่ และแบคทีเรียทั้งหมดได้รับแหล่งอาหารใหม่สิ้นสุดการดวล สิ่งนี้แตกต่างจากการแข่งขันที่กระอักกระอ่วนซ้ำของนักโทษธรรมดาเนื่องจากมันเกี่ยวข้องกับการดวล 1v1 พร้อมจุดพกพามากกว่าที่จะพยายามทำแต้มให้ได้มากที่สุดโดยรวม สิ่งนี้สร้างความแตกต่างอย่างมากในการกำหนดกลยุทธ์ที่มีประสิทธิภาพ

แบคทีเรียแต่ละตัวจะได้รับการป้อนข้อมูลที่จุดเริ่มต้นของการหมุนในรูปแบบ: (หมายเลขเทิร์น, คะแนนปัจจุบัน, จุดศัตรู, การเคลื่อนไหวก่อนหน้าของคุณ [ในสตริงโดยใช้อักขระ "c" เพื่อความร่วมมือและอักขระ "d" ] ศัตรูก่อนหน้านี้เคลื่อนไหว [ในรูปแบบเดียวกัน])

นี่คือสี่ตัวอย่างกลยุทธ์ที่จะถูกป้อนเข้า ฉันคิดว่า Defector อาจชนะแม้ว่ามันจะง่ายมาก

หัวนมสำหรับตาด

def titfortatfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter==0 or enlist[counter-1] == "c":
        return "c"
    else:
        return "d"

RandomPick

from random import choice
def randompickfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter == 199:
        return "d"
    else:
        return choice(["d", "c"])

cooperator

def cooperatorfunc(counter, mypoints, enpoints, mylist, enlist):
    return "c"

ผู้แปรพักตร์

def defectorfunc(counter, mypoints, enpoints, mylist, enlist):
    return "d"

การส่งทั้งหมดจะต้องอยู่ในรูปแบบของฟังก์ชั่น Python 2.7 ด้วยชื่อที่เป็นชื่อของการส่งที่ไม่มีช่องว่างด้วยfuncในตอนท้าย หากมีคนต้องการส่งคำตอบในภาษาอื่นโปรดป้อนในรหัสเทียมเพื่อให้ฉันแปลงเป็น Python ในการแก้ไขคำตอบของคุณเมื่อฉันมีเวลาหรือให้คำแนะนำในการเชื่อมต่อภาษาของคุณกับคอนโทรลเลอร์ของฉัน อยู่ด้านล่างตั้งค่าสำหรับการส่งทั้งหมด ณ วันที่ 4 มิถุนายน

from titfortat import titfortatfunc
from randompick import randompickfunc
from cooperator import cooperatorfunc
from defector import defectorfunc
from luckytitfortat import luckytitfortatfunc
from randomtitfortat import randomtitfortatfunc
from remorsefulaggressor import remorsefulaggressorfunc
from everyother import everyotherfunc
from niceguy import niceguyfunc
from titfortatbackstab import titfortatbackstabfunc
from gentleDefector import gentleDefectorfunc
from anticapitalist import anticapitalistfunc
from grimtrigger import grimtriggerfunc
from bizzaro import bizzarofunc
from neoanticapitalist import neoanticapitalistfunc
from bittertat import bittertatfunc
from teamer import teamerfunc
from copyfirst import copyfirstfunc
from exploitivetat import exploitativetatfunc
from defectorv2 import defectorv2func
from crazytat import crazytatfunc
from randomchoicev2 import randomchoicev2func
from twotitsforatat import twotitsforatatfunc
from threetitsforatat import threetitsforatatfunc
from fourtitsforatat import fourtitsforatatfunc
from fivetitsforatat import fivetitsforatatfunc
from sixtitsforatat import sixtitsforatatfunc
from tentitsforatat import tentitsforatatfunc
from theelephant import theelephantfunc
from xbittertat import xbittertatfunc
from fifteentitsforatat import fifteentitsfortatfunc
from twentytitsforatat import twentytitsforatatfunc
from fox import foxfunc
from onehundredfortysixtitsforatat import onehundredfourtysixtitsforatatfunc
from gameofthrones import gameofthronesfunc
from boy import boyfunc
from grimace import grimacefunc
from fiftytitsforatat import fiftytitsfortatfunc
from soreloser import soreloserfunc
from everyotherd import everyotherdfunc
from fiftythreetitsfortat import fiftythreetitsfortatfunc
from twentyfivetitsfortat import twentyfivetitsfortatfunc
from handshake import handshakefunc
from anty import antyfunc
from fiftyfourtitsforatat import fiftyfourtitsfortatfunc
from kindatitsfortat import kindatitsfortatfunc

import random

players = 38

rounds = players*10

def runcode(num, points1, points2, history1, history2, cell):
    ans = ""
    if cell == 0:
        ans = titfortatfunc(num, points1, points2, history1, history2)
    elif cell == 1:
        ans = randompickfunc(num, points1, points2, history1, history2)
    elif cell == 2:
        ans = cooperatorfunc(num, points1, points2, history1, history2)
    elif cell == 3:
        ans = defectorfunc(num, points1, points2, history1, history2)
    elif cell == 4:
        ans = luckytitfortatfunc(num, points1, points2, history1, history2)
    elif cell == 5:
        ans = randomtitfortatfunc(num, points1, points2, history1, history2)
    elif cell == 6:
        ans = remorsefulaggressorfunc(num, points1, points2, history1, history2)
    elif cell == 7:
        ans = everyotherfunc(num, points1, points2, history1, history2)
    elif cell == 8:
        ans = niceguyfunc(num, points1, points2, history1, history2)
    elif cell == 9:
        ans = titfortatbackstabfunc(num, points1, points2, history1, history2)
    elif cell == 10:
        ans = gentleDefectorfunc(num, points1, points2, history1, history2)
    elif cell == 11:
        ans = anticapitalistfunc(num, points1, points2, history1, history2)
    elif cell == 12:
        ans = grimtriggerfunc(num, points1, points2, history1, history2)
    elif cell == 13:
        ans = bizzarofunc(num, points1, points2, history1, history2)
    elif cell == 14:
        ans = neoanticapitalistfunc(num, points1, points2, history1, history2)
    elif cell == 15:
        ans = tentitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 16:
        ans = bittertatfunc(num, points1, points2, history1, history2)
    elif cell == 17:
        ans = copyfirstfunc(num, points1, points2, history1, history2)
    elif cell == 18:
        ans = exploitativetatfunc(num, points1, points2, history1, history2)
    elif cell == 19:
        ans = sixtitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 20:
        ans = fifteentitsfortatfunc(num, points1, points2, history1, history2)
    elif cell == 21:
        ans = fivetitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 22:
        ans = twentytitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 23:
        ans = threetitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 24:
        ans = fiftyfourtitsfortatfunc(num, points1, points2, history1, history2)
    elif cell == 25:
        ans = theelephantfunc(num, points1, points2, history1, history2)
    elif cell == 26:
        ans = xbittertatfunc(num, points1, points2, history1, history2)
    elif cell == 27:
        ans = foxfunc(num, points1, points2, history1, history2)
    elif cell == 28:
        ans = gameofthronesfunc(num, points1, points2, history1, history2)
    elif cell == 29:
        ans = boyfunc(num, points1, points2, history1, history2)
    elif cell == 30:
        ans = grimacefunc(num, points1, points2, history1, history2)
    elif cell == 31:
        ans = soreloserfunc(num, points1, points2, history1, history2)
    elif cell == 32:
        ans = everyotherdfunc(num, points1, points2, history1, history2)
    elif cell == 33:
        ans = twentyfivetitsfortatfunc(num, points1, points2, history1, history2)
    elif cell == 34:
        ans = fiftythreetitsfortatfunc(num, points1, points2, history1, history2)
    elif cell == 35:
        ans = handshakefunc(num, points1, points2, history1, history2)
    elif cell == 36:
        ans = antyfunc(num, points1, points2, history1, history2)
    elif cell == 37:
        ans = kindatitsfortatfunc(num, points1, points2, history1, history2)


    return ans

def fight(l1,l2):
    num1,num2=l1[0],l2[0]
    points1,points2=l1[1],l2[1]
    history1 = ""
    history2 = ""

    for num in range(200):
        p1 = runcode(num, points1, points2, history1, history2, num1)
        p2 = runcode(num, points2, points1, history2, history1, num2)

        history1+=p1
        history2+=p2

        if p1 == "c" and p2 == "c":
            points1 += 1
            points2 += 1
        elif p1 == "c" and p2 == "d":
            points1 -= 3
            points2 += 2
        elif p1 == "d" and p2 == "c":
            points1 += 2
            points2 -= 3
        elif p1 == "d" and p2 == "d":
            points1 -= 1
            points2 -= 1

    if points1 > points2:
        return [l1[0], points1/10], [l1[0], points1/10]
    elif points1 < points2:
        return [l2[0], points2/10], [l2[0], points2/10]
    else:
        return [l1[0], points1/10], [l2[0], points2/10]

def rounddoer(bots):
    bots2=[]
    for x in range(len(bots)):
        if x%2==0:
            out1, out2 = fight(bots[x], bots[x-1])
            bots2.append(out1)
            bots2.append(out2)

    return bots2

def gamedoer():

    bots=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0],[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0],[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0],[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0],[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0]]
    random.shuffle(bots)
    counter=0

    while counter < rounds:

        counter += 1
        bots = rounddoer(bots)

        if random.randint(0,10) == 9:
            bots[random.randint(0, players*5)-1] = [random.randint(0, players-1), 0]

        random.shuffle(bots)

##        for item in bots:
##            print str(item[0]) + " with " + str(item[1]) + " bonus points."

    return bots

a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,mycounter=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

while mycounter < 1000:
    mycounter += 1
    bots = gamedoer()

    print "Game: " + str(mycounter)

    for item in bots:
        if item[0]==0:
            a0 += 1
        if item[0]==1:
            a1 += 1
        if item[0]==2:
            a2 += 1
        if item[0]==3:
            a3 += 1
        if item[0]==4:
            a4 += 1
        if item[0]==5:
            a5 += 1
        if item[0]==6:
            a6 += 1
        if item[0]==7:
            a7 += 1
        if item[0]==8:
            a8 += 1
        if item[0]==9:
            a9 += 1
        if item[0]==10:
            a10 += 1
        if item[0]==11:
            a11 += 1
        if item[0]==12:
            a12 += 1
        if item[0]==13:
            a13 += 1
        if item[0]==14:
            a14+=1
        if item[0]==15:
            a15+=1
        if item[0]==16:
            a16+=1
        if item[0]==17:
            a17+=1
        if item[0]==18:
            a18 += 1
        if item[0]==19:
            a19+=1
        if item[0]==20:
            a20+=1
        if item[0]==21:
            a21+=1
        if item[0]==22:
            a22+=1
        if item[0]==23:
            a23+=1
        if item[0]==24:
            a24+=1
        if item[0]==25:
            a25+=1
        if item[0]==26:
            a26+=1
        if item[0]==27:
            a27+=1
        if item[0]==28:
            a28+=1
        if item[0]==29:
            a29+=1
        if item[0]==30:
            a30+=1
        if item[0]==31:
            a31+=1
        if item[0]==32:
            a32+=1
        if item[0]==33:
            a33+=1
        if item[0]==34:

การประกวดนี้เสร็จสิ้นแล้ว

หากคุณต้องการที่จะเพิ่มคำตอบฉันจะดูว่าฉันสามารถไปเพิ่มป้ายบอกคะแนนหลังการแข่งขันสำหรับผู้แข่งขันเดิมได้หรือไม่ ฉันจะเพิ่มอีกหนึ่งรายการทันทีที่โปรแกรมทดสอบเสร็จสิ้น (อาจใช้เวลาอีก 2-3 วัน)

คะแนนสุดท้าย !!!!!

Tit for Tat: 18
Random Pick: 28
Cooperator: 19
Defector: 24
Lucky Tit for Tat: 23
Random Tit for Tat: 23
Remorseful Aggressor: 22
Every Other C: 23
Nice Guy: 18
Tit for Tat Backstab: 15
Gentle Defector: 22
Anticapitalist: 27
Grim Trigger: 19
Bizzaro: 21
NeoAnticapitalist: 24
Ten Tits for a Tat: 240
Bitter Tat: 12
Copy First: 30
Exploitative Tat: 19
Six Tits for a Tat: 16
Thirty Tits for Tat: 4129
Five Tits for a Tat: 22
Forty Tits for a Tat: 1972
Three Tits for a Tat: 22
Fifty Four Tits for a Tat: 25805
The Elephant: 31
Extra Bitter Tat: 28
Fox: 35
Game of Thrones: 11297
The Boy: 31
Grimace: 26
Sore Loser: 39
Every Other D: 18
Twenty Five Tits for a Tat: 2399
Fifty Three Tits for a Tat: 5487
Handshake: 28
Anty: 26
Kinda Tits for Tat: 20
Prudent Defector: 154539
Bizzarro Trigger: 25
Young Mathematician: 21
Older Mathematician: 16
Perfect Gentleman: 1953341

ดังนั้นปรากฏว่า Perfect Gentleman เป็นผู้ชนะ ขอแสดงความยินดีกับ Draco18 ที่สมควรได้รับเครื่องหมายถูกสีเขียวของเขา


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Dennis

1
หมายเหตุ: หากคุณกำลังแก้ไขโปรแกรมของคุณโปรดให้คำแนะนำแก่ฉันดังนั้นฉันจึงสังเกตเห็นหรือไม่ควรวางลงบนสกอร์บอร์ดในขณะที่ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!
กริฟฟอน

อ๊ะ! ฉันเพิ่งรู้ว่ามีการนำเข้ากี่ตัว
Gryphon

1
เฮ้ Gryphon คุณทำงานในอันดับสุดท้ายเหรอ? ;)
Draco18 ไม่ไว้วางใจ SE

ขออภัยฉันลืมเรื่องนี้ ขอให้ฉันวิ่งหน่อยนะ
กริฟฟอน

คำตอบ:


8

สุภาพบุรุษที่สมบูรณ์แบบ

ฉันไม่มีคำอธิบายที่ดีสำหรับบอทนี้ ฉันเข้าสู่การเพิ่มประสิทธิภาพที่เป็นไปได้สองสามอย่างทดสอบทดสอบปรับและจบลงด้วยแบคทีเรียที่ทำลายการแข่งขันอย่างที่สุด แต่ฉันได้แสดงความคิดเห็นรหัสเพื่ออธิบายสิ่งที่มันทำ

import random
def perfectgentlemanfunc(num, i, d, c, en):
    if num>0 and i < 0 and d > 0 and -i%3 == 0 and d%2 == 0 and en[0] == "d":
        #probably very first iteration, probably facing a defector: feed it free points
        #    defector cannot be beaten by *any* bot unless that bot
        #    entered with a point lead. defector does some of our work for us
        if num >= 140:
            #140 threshold restricts how much we feed
            return "d"
        return "c"
    turn_to_betray = 130
    if num > turn_to_betray and en[turn_to_betray -2] == "c" and
     en[turn_to_betray -1] == "c" and en[turn_to_betray] == "d":
        #if self, then sacrifice the lower point bot to raise the points of the higher
        #(better net outcome than "c/c" cooperation)
        #    Handshake independently arrived at this same optimization
        if i == d:
            #max 50% probability of choosing different possible. May as well take it
            #    "ccd" has a 55% chance of choosing the same
            #    better outcomes for splitting early
            return "cd"[random.randint(0,1)]
        if i > d:
            return "d"
        return "c"
    #betray after betray point, or if behind by >200
    #performs 6 percentage points better than not having the condition
    if num >= turn_to_betray or i + 200 < d
        return "d"
    else:
        #be nice the first turn
        if num == 0:
            return "c";
        #finally, be tit-for-tat
        return en[-1]

มีการเลือกค่าหลายค่าตามอำเภอใจพร้อมทางเลือกที่ผ่านการทดสอบและค่าที่นี่ใกล้จะเหมาะสมที่สุด ณ จุดนี้ ต่อต้านการแพร่กระจายของฝ่ายตรงข้ามในปัจจุบันสุภาพบุรุษที่สมบูรณ์แบบประสบความสำเร็จในการปกครองที่สมบูรณ์ (100% ของประชากรแบคทีเรีย) ประมาณ 90% ของเวลา (บวกหรือลบ 3 คะแนนร้อยละ)

ฉันยังไม่ได้เพิ่มนักคณิตศาสตร์ในการทดสอบของฉันอย่างไรก็ตามทั้งสองควรให้บริการเพื่อใช้กลยุทธ์ที่มีอยู่เท่านั้นและไม่เปลี่ยนแปลงผลลัพธ์อย่างมาก

มันจัดการส่วนที่ดีในการควบคุมผ่าน Defpping up แต่นั่นอนุญาตตามกฎ (ตัวอย่างกลยุทธ์คือเกมที่ยุติธรรมสำหรับการกำหนดเป้าหมาย) แต่ก็มีผลข้างเคียงของยังพยุง Game of Thrones แต่นั่นก็ไม่ได้ตั้งใจขณะที่ทั้งสองจะแยกไม่ออกขึ้นอยู่กับเกณฑ์ที่ผมเลือก "ประเภทผู้หลบหนี" เหล่านั้นมีจุดได้เปรียบในรอบที่ 2 และนำเพื่อนบ้านที่มีปัญหาหลายอย่างออกมา (ประเภท N-T4T) และเมื่อพวกเขา reface The Perfect Gentleman พวกเขาได้ใช้ความได้เปรียบอย่างรวดเร็วและหมดไป

มีโอกาสประมาณ 5% ที่ Perfect สุภาพบุรุษทุกคนจะจับคู่กับ Defector-types ในรอบแรกและจบลงด้วยการฆ่าตัวตาย ในกรณีนี้หนึ่งในประเภท n-T4t ได้รับการครอบครองทั้งหมด (196 เซลล์จาก 196) น้อยมากประเภทอื่น ๆ (Game of Thrones, Boy, Grimace, Sore Loser ... ) จัดการที่จะไม่สูญพันธุ์ไปอย่างสมบูรณ์และคะแนนหนึ่งหรือสองจุด

การจำลองปัจจุบัน (อยู่ระหว่างดำเนินการไปจนถึง 200 เกมทั้งหมด) รายการทั้งหมดให้คะแนน 0 ลบ ดูเหมือน Game of Thrones และ 54-T4T แยกรอบ (195 คะแนนระหว่างพวกเขา) หลังจาก PG ถูกกำจัด

Game: 90

Cooperator: 1
Remorseful Aggressor: 1
Copy First: 1
Six Tits for a Tat: 1
Thirty Tits for Tat: 393
Five Tits for a Tat: 1
Fifty Four Tits for a Tat: 538
Game of Thrones: 248
Perfect Gentleman: 16456 (93.2)%

##Simulation Terminated: Adding new bots

Backstabbing Tit สำหรับ Tat (ด้วยการให้อภัย)

โดยทั่วไปแล้วนี่คือ Lucky Tit for Tat (aka Tit สำหรับ Tat ด้วยการให้อภัย) ซึ่งเป็นคำตอบที่ดีที่สุดที่ "แก้ไขแล้ว" (สำหรับค่าบางอย่างของ "lucky") ด้วยการบิด อย่างที่เราทราบกันดีว่าเกมนี้จะอยู่ได้นานเท่าไรแบคทีเรียตัวนี้จะสำรองในรอบสุดท้ายดังนั้นจึงมั่นใจได้ว่าจะได้ผลลัพธ์ที่เป็นประโยชน์สุทธิต่อแบคทีเรีย Tit สำหรับ Tat และ Cooperator อื่น ๆ (เทียบกับตัวมันเองลงท้ายด้วยศูนย์สุทธิ ความร่วมมือ) เนื่องจากการพกพา 10% ทำให้ได้เปรียบในระยะยาว

from random import randint
def titfortatbackstabfunc(num, i, d, c, enlist):
    if num == 199:
        return "d";
    lucky = randint(0, 200)
    if lucky == 0:
        return "c"
    if num == 0 or enlist[-1] == "c":
        return "c"
    else:
        return "d"

ขมตาด

Bitter Tat ใช้ประโยชน์จากความพยายามใด ๆของความร่วมมือที่กำหนดโดยศัตรูเมื่อศัตรูอยู่ข้างหน้าในจุด แบคทีเรียส่วนใหญ่เสนอกิ่งมะกอกอย่างน้อยหนึ่งครั้งในรอบ 200 และเนื่องจาก Bitter Tat อยู่ด้านหลังโดยรวมก็จะให้นม 5 คะแนนในการประมูลที่หมดหวัง

ไม่เช่นนั้นมันจะเป็นการไต่ระดับต่อกลยุทธ์ที่โดดเด่นตามปกติ ยิ่งไปกว่านั้นมันเป็นเรื่องที่ค่อนข้างกระตุกมากกว่าลูกพี่ลูกน้องและย้อนกลับไปก่อนหน้านี้และไม่มีการให้อภัย

def bittertatfunc(num, i, d, c, enlist):
    if i < d:
        return "d";
    if num >= 198:
        return "d";
    if num == 0 or enlist[-1] == "c":
        return "c"
    else:
        return "d"

Bitter Tat ถูกออกแบบมาโดยดูที่พฤติกรรมของบอทอื่น ๆ กับ Tit สำหรับ Tat และรูปแบบที่แสดงในผลลัพธ์เหล่านั้น แต่ไม่ได้ออกแบบมาเพื่อตอบโต้กลยุทธ์เหล่านั้นอย่างชัดเจน: มันยังคงเป็นสูตรวัตถุประสงค์ทั่วไป

ตาดขมพิเศษ

def xbittertatfunc(num, i, d, c, enlist):
    if i < d:
        return "d";
    if num >= 188:
        return "d";
    if num == 0 or enlist[-1] == "c":
        return "c"
    else:
        return "d"

ความขมขื่นเป็นพิเศษด้วยการเอาใจออกห่างเร็ว


1
โปรดเปลี่ยนชื่อฟังก์ชั่นของคุณเนื่องจากสิ่งนี้ได้ถูกใช้ไปแล้ว
Gryphon

@Gryphon อ๊ะขอโทษฉันไม่คิดว่าฉันจะทำอย่างนั้น ฉันไม่ได้เขียนโค้ดใน Python จริง ๆ ฉันเพิ่งทุบโค้ดสองบิตเข้าด้วยกัน
Draco18 ไม่ไว้วางใจ SE

1
I suspect it will outperform NeoAnticapitalist by a small margin. คะแนนมากกว่า 30,000 คะแนน
Gryphon

1
ขอให้เรายังคงอภิปรายนี้ในการแชท
Draco18 ไม่ไว้วางใจ SE

2
ผมขอขอบคุณที่คุณทำเพื่อให้ ธ ปท Koth นี้ไม่ตลกอีกต่อไป
ทำลายมะนาว

8

Anticapitalist

อีกแบบง่าย ๆ สำหรับแมตช์ที่เหมือนกัน (เริ่มที่คะแนนเดียวกัน) จะมีพฤติกรรมคล้ายกับ TitForTat แต่แนวคิดหลักคือพยายามเอาตัวรอดจากการแข่งขัน

def anticapitalistfunc(counter, mypoints, enpoints, mylist, enlist):
    if mypoints >= enpoints:
        return "c"
    else:
        return "d"

ผู้หลบหนีที่อ่อนโยน

ความคิดของฉันที่นี่คือการบกพร่องยกเว้นว่าศัตรูของฉันมักจะให้ความร่วมมือ แม้ว่ามันจะเริ่มให้ความร่วมมือ

def gentleDefectorfunc(counter, mypoints, enpoints, mylist, enlist):
    if enlist.count("d") * 4 > len(enlist):
        return "d"
    else:
        return "c"

NeoAnticapitalist

การปรับปรุงของ Anticapitalist (หรือฉันคิดว่า) ฉันไม่เห็นเหตุผลที่จะร่วมมือกันในเทิร์นสุดท้าย ฉันไม่เห็นเหตุผลที่จะร่วมมือกันเมื่อฉันค่อนข้างแน่ใจว่าคู่ต่อสู้ของฉันจะไม่

def neoanticapitalistfunc(counter, mypoints, enpoints, mylist, enlist):
    if mypoints >= enpoints:
        if counter > 1:
            if counter == 199 or (enlist[-1] != "c" and enlist[-2] != "c"):
                return "d"
        return "c"
    else:
        return "d"

ฉันแปลกใจจริง ๆ ที่ฉันไม่ได้คิดเรื่องนี้ แต่มันยอดเยี่ยม ฉันไม่รู้ว่ามันจะชนะหรือไม่ แต่ฉันคิดว่ามันน่าจะใช้ได้ดีมาก
Gryphon

@Gryphon เพิ่มบอทใหม่ (และรวมสองอันของฉันเข้าด้วยกัน)
Masclins

@Gryphon ขอบคุณสำหรับทั้งสองฉบับ
Masclins

ไม่มีปัญหา @AlbertMasclans
Gryphon

จากแบบจำลองที่ฉันใช้อยู่ NeoAnticapitalist ดูเหมือนจะเป็นผู้นำของ Backstabbing Tit สำหรับ Tat
Gryphon

6

ผู้รุกรานที่สำนึกผิด

from random import randint
def remorsefulaggressorfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter == 0:
        return "d"
    if (counter > 195 and mylist[-1] == "d"):
        return "d"
    if ((counter == 1 or counter > 2) and enlist[-1] == "d"):
        return "d"
    if (counter == 2 and enlist[-1] == "d" and enlist[-2] == "d"):
        return "d"
    if (counter >= 195 and randint(0, 200 - counter) == 0):
        return "d"
    else:
        return "c"

สิ่งนี้ได้รับการออกแบบมาเพื่อ "ไล่ตาม" กับ Defector โดยการลบล้างทุกครั้งที่มีต่อมันและเพื่อเอาชนะกลยุทธ์ที่ใช้หัวนม

แนวคิดพื้นฐานคือการที่เราเริ่มต้นด้วยการหลบหนี แต่ถ้าฝ่ายตรงข้ามให้ความร่วมมือในเทิร์นที่ 1 เราจะร่วมมือกันสองครั้งเพื่อหลีกเลี่ยงวงจรการฟ้องร้องซึ่งกันและกันดังนั้นการหลีกเลี่ยงจุดโทษที่มากเกินไป (หากฝ่ายตรงข้ามมีข้อบกพร่องในภายหลังเราจะไม่ทำลายวงจรของเราเองเราจะทำให้พวกเขาทำและน่าจะเสียเกมไป) เมื่อจบเกมเราจะสุ่มเลือกเวลา ภายใน 5 ครั้งที่ผ่านมาหันหลังให้ศัตรูให้การเอาใจออกห่างมากกว่าพวกเขาหนึ่งครั้งและทำให้เรามีความหมายว่าตราบใดที่เราไม่ได้อยู่ห่างจากจุดพกพามากเกินไปเราก็ชนะได้โดยไม่ต้องเสียสละมากนักในแง่ของกระบวนการ . (การสุ่มช่วงเวลาหมายความว่าเรามีโอกาสมากที่จะได้รับ backstab เป็นอันดับแรกและกลยุทธ์นี้ไม่สามารถ "ปรับ" โดยมีเป้าหมายที่จะหนุนหลังมันก่อนหน้านี้)


ยินดีด้วยกับหมายเลข 3 ของคุณ! +1
Gryphon

6

Grim Trigger

บอแบบง่าย ๆ เพื่อลองและเติมเต็มการแข่งขัน

มันจะให้ความร่วมมือเว้นแต่ศัตรูจะเสียซึ่งในกรณีนี้มันจะผิดพลาดอย่างไม่คาดฝัน

def grimtriggerfunc(I, Do, Not, Care, enlist): return "d" if "d" in enlist else "c"

ดูเหมือนว่านี่จะไม่ได้ผลเพราะ ntitsfortat meta ของ defecting เร็ว


ยินดีด้วยกับหมายเลข 5 สปอตของคุณ +1
Gryphon

@Sleafar ฉันสงสัยว่าใครจะเป็นเช่นนั้น; _; ตกลง
มะนาวที่ถูกทำลายได้

5

Game of Thrones

def gameofthronesfunc(counter, mypoints, enpoints, mylist, enlist):
    turn_to_betray = 140
    if counter >= turn_to_betray or mypoints > enpoints or "d" in enlist:
        return "d"
    else:
        return "c"

แนวคิดที่นี่คือคุณไม่เคยแพ้โดยการทรยศดังนั้นเหตุผลเดียวที่ให้ความร่วมมือคือถ้าคุณอยู่เบื้องหลัง นอกจากนี้ยังมีกรอบทั่วไปของคำตอบ T4T อื่น ๆ (โดยไม่มีการให้อภัยใด ๆ เพราะฉันไม่แน่ใจว่ามีจุดมากขึ้นกับคู่แข่งอื่น ๆ ที่นี่)

การหันหลังให้กับการทรยศนั้นอาจต้องเปลี่ยนเป็นผู้ชนะเนื่องจากในการแข่งขันคู่ T4Ter ที่การทรยศครั้งแรกจะเป็นผู้ชนะ แต่เมื่อเทียบกับบอทที่ร่วมมือกันมากคุณจะพลาดคะแนนชีวิตบางช่วง ฉันไม่แน่ใจว่ายอดที่เหมาะสมสำหรับเนินเขานี้ดังนั้นฉันจะไปสำหรับ 140 ฉันจะไม่แปลกใจถ้ามันก่อนหน้านี้มาก

หากสิ่งนี้จบลงในจาน Petri กับ T4Ter ที่ทรยศก่อนหน้านี้หรือ defector (เช่น 146 T4T) แล้วมันขึ้นอยู่กับว่า GoT นั้นอยู่ข้างหน้า (มันจะอยู่ข้างหน้า) หรือหากพวกเขายัง / GoT อยู่ข้างหลัง ในกรณีนี้ผู้ชนะก่อนจะชนะ


ยินดีด้วยกับอันดับสามของคุณ! +1
Gryphon

และตอนนี้ถึงสอง!
Gryphon

Game of Thrones กำลังต่อสู้กับบอทที่ฉันกำลังทดสอบอยู่ กลยุทธ์ง่าย ๆ ทำงานได้ดีสำหรับมัน
Draco18 ไม่ไว้วางใจ SE

4

Lucky Tit For Tat

import os
def luckytitfortatfunc(num, i, d, c, enlist):
    lucky = ord(os.urandom(1))
    lucky = int(round(200 * float(lucky - 0) / 255.0))
    if lucky == 0:
        return "c"
    if num == 0 or enlist[-1] == "c":
        return "c"
    else:
        return "d"

ฉันค่อนข้างแน่ใจว่าฉันอ่านที่ไหนสักแห่งที่หัวนมสำหรับทททเป็นกลยุทธ์ที่ดีที่สุด ฉันตัดสินใจที่จะทำให้เป็นไปได้สำหรับโปรแกรมอื่น ๆ ที่จะไถ่ถอนตัวเองเพื่อเพิ่มความหลากหลาย ขณะนี้มีตัวสร้างตัวเลขสุ่มที่เหมาะสม (มันให้ประโยชน์แก่ฉันใช่ไหม)


โดยทั่วไปนี่คือกลยุทธ์การชนะโดยไม่ตั้งใจตลอดเวลาตามที่ระบุไว้ในวิกิพีเดีย ความแปรปรวนเพียงอย่างเดียวคือความน่าจะเป็นที่จะเกิดวงจรข้อบกพร่อง tit-for-tat (ซึ่งขึ้นอยู่กับการจับคู่ของรายการอื่น ๆ ทั้งหมด)
Draco18 ไม่ไว้วางใจ SE

1
@ Draco18s มันเป็นกลยุทธ์การชนะสำหรับระบบการให้คะแนนที่แตกต่างกันนั่นคือระบบการให้คะแนนรวม Tit-for-tat พื้นฐานไม่สามารถชนะรอบได้หากไม่ได้แต้มบางจุดเข้าไปในรอบดังนั้นมันจะไม่ทำได้ดี
isaacg

@isaacg ถูกต้องซึ่งเป็นสาเหตุที่ทำให้กลยุทธ์นี้ในวันที่ 14 จาก 18 (แม้ว่าฉันไม่มีสิทธิ์ที่จะตำหนิ AH L สำหรับรายการนี้เนื่องจากโปรแกรมที่ 18 เป็นของฉัน)
Gryphon

4

ช้าง

ช้างไม่เคยลืม!

import re
def theelephantfunc(counter, mypoints, enpoints, mylist, enlist):
    interwoven = "".join(i for j in zip(mylist, enlist) for i in j)
    backwoven = interwoven[::-1]
    predict = re.match("^((?:..)*).*?(.).\\1(?:..)*$",backwoven)
    if(predict is None):
        return "c"
    predict = predict.groups()[1]
    if(predict == "d"):
        return "d"
    if(mypoints - enpoints >= 6):
        return "c"
    return "d"

ช้างมองไปที่ประวัติศาสตร์ของการต่อสู้และพยายามที่จะคิดออกว่าสิ่งที่ศัตรูได้วางแผนไว้ เขาดูทั้งการเคลื่อนไหวและศัตรูของเขา!

เขาพยายามค้นหากลุ่มที่เกิดขึ้นพร้อมกันนานที่สุดที่ตรงกับสิ่งที่เพิ่งเกิดขึ้นและใช้สิ่งที่ศัตรูทำหลังจากนั้น

หากเขาทำไม่ได้ช้างก็จะร่วมมือกันเพราะมิตรภาพเป็นคำตอบเสมอ

หากเขาคิดว่าคู่ต่อสู้ของเขาจะบกพร่องเขาก็จะบกพร่องเช่นกันและไม่ต้องการเสียคะแนนที่ได้รับอย่างหนัก

หากเขาคิดว่าคู่ต่อสู้ของเขาจะร่วมมือกัน แต่มีแต้มน้อยกว่าหรือเท่ากับ 6 แต้มเขาก็จะเสียเปรียบ

และสุดท้ายถ้าเขาคิดว่าคู่ต่อสู้ของเขาจะร่วมมือกันและเขามีผู้นำที่แข็งแกร่งเขาก็จะร่วมมือ


ฉันกำลังรออะไรเช่นนี้ที่ทำงานได้ดีกว่า Nice Guy อย่างไรก็ตามฉันจะไม่สามารถทดสอบได้ประมาณ 8 ชั่วโมงดังนั้นฉันควรจะอัปเดตในประมาณ 12-13 ชั่วโมง
Gryphon

4

54 นมสำหรับตาด

def fiftyfourtitsfortatfunc (NUM, มากกว่า, สนุก, ฉัน, en):
    นม = 54
    ถ้า "d" ใน en [-tits:] หรือ num> = (200-tits):
        ส่งคืน "d"
    ส่งคืน "c"

ฉันสงสัยว่าจะชนะหรือไม่
Gryphon

ตอนนี้ดูเหมือนว่าจะชนะในตอนนี้!
Gryphon

ขอแสดงความยินดีคุณจะชนะบอททั้งสองของฉันได้อย่างหวุดหวิด!
Gryphon

@Gryphon ฉันจะทำให้ 5 หัวนมสำหรับทททถ้าฉันไม่ได้แนบมาเพื่อให้บอทอื่น ๆ ของฉัน :)
อเล็กซ์

ฉันคิดว่ามันจะข้ามไปอีกด้านหนึ่งของเส้นโค้ง ฉันอาจทดสอบด้วยตัวเอง!
Gryphon

3

ผู้ชายที่ดี

def niceguyfunc(counter, mypoints, enpoints, mylist, enlist):
  if counter < 2:
    return "c"

  mylast = mylist[-1]
  enlast = enlist[-1]
  last_found_index = -1

  for i, item in enumerate(mylist):
    if i == counter - 1:
      break
    if mylist[i] == mylast and enlist[i] == enlast:
      last_found_index = i

  if last_found_index == -1:
    return "c"
  else:
    if enlist[last_found_index + 1] == "c":
      return "c"
    else:
      return "d"

พยายามทำนายเอาท์พุทของคู่แข่งโดยดูที่ประวัติ ตัวอย่างเช่นหากการเคลื่อนไหวครั้งสุดท้ายเป็น ( cศัตรูd) ก็จะพยายามค้นหาการเกิดขึ้นครั้งสุดท้ายของการเคลื่อนไหวเดียวกันที่แน่นอน


3

คนขับรถแท็กซี่ [ถูกตัดสิทธิ์ตามที่คาดไว้]

ตกลงนี่อาจจะถูกตัดออกจากการแข่งขัน แต่ฉันรู้สึกอยากลอง:

def hackmanfunc(counter, mypoints, enpoints, mylist, enlist):
        if enlist.count("#") > 0:
                return "c"
        elif counter >= 2 and enpoints > mypoints:
                return "d"
        elif counter == 198:
                return "d"
        elif counter == 199:
                return "#"
        elif counter == 0 or enlist[-1] == "c":
                return "c"
        elif counter >= 2 and enlist[-2] != "c":
                return "#"
        else:
                return "d"

ที่นี่ฉันใช้เป็นฐาน BackstabbingTitForTat ที่พิสูจน์แล้วว่าดีที่สุดในแบบจำลองของฉัน นอกจากนี้ยังมีการใช้สัญลักษณ์ที่ไม่ได้ใช้เป็นอย่างมาก"#" (นั่นคือเหตุผลที่ฉันบอกว่ามันอาจถูกตัดออก)

ตอนนี้ให้ฉันอธิบายเงื่อนไขที่นี่:

วันที่ 1: ตรวจสอบให้แน่ใจว่าแฮ็กแมนสองคนร่วมมือกันหากมีอะไรผิดพลาด

2nd: ถ้าฉันจะแพ้บอทที่ต่างออกไปอย่างน้อยก็ทำให้เขาเสียคะแนนให้ได้มากที่สุดดังนั้นจึงไม่ใช่ศัตรูใหญ่ในภายหลัง

3rd: หักหลังหนึ่งรอบก่อนดังนั้นจึงชนะกับ Backstabbing

การใช้ "#" แทน "d" ทำให้ฉันได้รับ 0 คะแนนแทนที่จะเป็น -1 และสื่อสารกับแฮ็กแมนคนอื่นที่มีคะแนนน้อยกว่า


2
ขออภัยมีสิทธ์ สิ่งนี้นับว่ายุ่งเกี่ยวกับกระบวนการตัดสิน คุณต้องส่งคืน "c" หรือ "d" ทุกเทิร์น
Gryphon

2
อย่างไรก็ตามนี่เป็นสิ่งประดิษฐ์ที่ค่อนข้างสวยดังนั้นฉันต้องขออภัยที่ต้องตัดสิทธิ์
Gryphon

3

bizzaro

ทำตรงกันข้ามกับหัวนมแน่นอนสำหรับททท. เมื่อมีคนใจดีต่อเขาเขาแสดงความรักของเขาด้วยการเป็นคนชั่วและเมื่อมีคนหมายความว่าเขาแสดงความแก้แค้นโดยเป็นคนดี อย่างหนักตามหัวนมสำหรับททท.

def bizzarofunc(counter, mypoints, enpoints, mylist, enlist):
    if counter==0 or enlist[counter-1] == "c":
        return "d"
    else:
        return "c"

น่าสนใจ สิ่งนี้จะถูกสังหารโดย Defector แม้ว่า
Gryphon

@Gryphon Lmao จริง ๆ แล้วไม่รู้ว่า แต่เฮ้ Bizzaro ไม่ทราบความแตกต่างระหว่างถูกและผิดชนะและแพ้
TitusLucretius

ใช่นี่จะเป็นผู้หลบหนีไปสู่ผู้ประสานงานและผู้ร่วมมือไปสู่ผู้หันเหออกซึ่งอาจทำให้เกิดความเป็นไปได้ที่น่าสนใจ มันไม่สามารถอยู่ร่วมกับสิ่งอื่นรวมถึงตัวมันเองได้
Gryphon

@Gryphon ใช่มันควรจะเป็น 0 เมื่อมันเล่นเอง สงสัยว่าจะเกิดอะไรขึ้นกับ Gentle Defector
TitusLucretius

สงสัยว่าจะเกิดอะไรขึ้นเมื่อเผชิญกับแทงข้างหลังสำหรับทททซึ่งเป็นสิ่งที่ชนะก่อนที่จะส่งเพลงนี้
Gryphon

3

6 หัวนมสำหรับตาด

def sixtitsforatatfunc (NUM, มากขึ้น, สนุก, ฉัน, en):
    ถ้า "d" ใน en [-6:] หรือ num> = 194:
        ส่งคืน "d"
    ส่งคืน "c"

Tit สำหรับการแข่งขันแขน Tat เกิดขึ้น :)


ฉันรู้สึกว่าเรากำลังจะไปลงน้ำและผู้หลบหนีจะขโมยจุดสูงสุด
Gryphon

3

สิบหัวนมสำหรับตาด

def tentitsforatatfunc(num, more, fun, me, en):
    if "d" in en[-10:] or num >= 190:
        return "d"
    return "c"

ข้อบกพร่องก่อนหน้านี้และยังมีข้อบกพร่องหากฝ่ายตรงข้ามเสียในรอบสิบรอบสุดท้าย

CopyFirst

def copyfirstfunc(num, mypoints, enpoints, myhistory, enhistory):        
    if num == 0 or num >= 197:
        return "d"
    else:
        return enhistory[0]

ข้อบกพร่องนี้ในรอบแรกจากนั้นทำสิ่งที่คู่ต่อสู้ทำในรอบแรกจนถึงรอบที่ 197 เมื่อมันถอยหลัง

สี่สิบหัวนมสำหรับตาด

def fourtytitsforatatfunc(num, mypoints, enpoints, myhistory, enhistory):
    if "d" in en[-40:] or num >= 150:
        return "d"
    return "c"

หากฝ่ายตรงข้ามเสียเปรียบในรอบ 40 รอบสุดท้ายให้ถอยหรือให้ความร่วมมือเป็นอย่างอื่น Backstab ใน 50 รอบที่ผ่านมา

สามหัวนมสำหรับตาด

หากฝ่ายตรงข้ามเสียเปรียบใน 3 รอบสุดท้ายให้เปลี่ยนข้อบกพร่องเป็นอย่างอื่นให้ความร่วมมือ Backstab ในการหมุน 5 ครั้งล่าสุด โปรแกรมนี้ได้ขโมยความเป็นผู้นำจาก Tit for Two Tats ด้วยระยะขอบที่แคบ

def threetitsforatatfunc(num, mypoints, enpoints, myhistory, enhistory):
    if num == 0 or num==1 and enhistory[-1]=="c" or num==2 and enhistory[-1]=="c" and enhistory[-2]=="c":
        return "c"
    if enhistory[-1] == "d" or enhistory[-2] == "d" or enhistory[-3] == "d" or num >= 195:
        return "d"
    else:
        return "c"

ห้าหัวนมสำหรับตาด

def fivetitsforatatfunc(num, more, fun, me, en):
    if "d" in en[-5:] or num >= 194:
        return "d"
    return "c"

หากคุณไม่สามารถเข้าใจได้ว่าสิ่งนี้ทำอะไรคุณเป็นคนงี่เง่า ถอยกลับหนึ่งรอบก่อนหน้านี้ด้วย


IMO อย่าลังเลที่จะส่งผลงานของคุณเอง
Draco18 ไม่ไว้วางใจ SE

แค่ไม่แน่ใจว่ามันถือว่ายุติธรรมหรือไม่
Gryphon

อย่างไรก็ตามสิ่งที่มักพบบ่อยคือคำตอบที่ดีที่สุดคือบอทที่ชนะ
Masclins

มันจะเป็นฉันจะไม่เพียงแค่เลือกคำตอบของฉันเอง แน่นอนว่าจะไม่ยุติธรรม
Gryphon

ฉันขอโทษฉันไม่ได้ตระหนักว่าฉันตอบรับโดยไม่ตั้งใจ ตอนนี้ไม่เป็นที่ยอมรับและฉันจะยอมรับคำตอบที่ดีที่สุด ณ วันที่ 1 กรกฎาคม
Gryphon

3

หน้าตาบูดบึ้ง

def grimacefunc(I, Do, Not, Care, enlist):
    if round < 123: return "d" if "d" in enlist else "c"
    return "d"

มันให้ความรู้สึกเหมือนคำตอบที่ "ดีที่สุด" สำหรับเนินเขานี้คือทำสิ่งนี้ (T4nT ที่มี n> 5 เป็นพื้นฐานนี้) และเพียงเพิ่มประสิทธิภาพรอบเมื่อมันทรยศ สิ่งที่สร้างสรรค์มากขึ้นจะถูกทำลาย
Robert Fraser

3

ทุก ๆ D

def everyotherdfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter % 2 == 0:
        return "d"
    else:
        return "c"

ค. อื่น ๆ

def everyotherdfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter % 2 == 0:
        return "c"
    else:
        return "d"

บางทีคุณควรส่งรายการอื่นที่เริ่มต้นด้วยความร่วมมือ
กริฟฟอน

แค่คิดว่ามันอาจจะน่าสนใจ
กริฟฟอน

3

นักคณิตศาสตร์ที่คาดการณ์ได้:

นักคณิตศาสตร์หนุ่ม

ใหม่สำหรับความโหดเหี้ยมของโลก

import math
def ymathfunc(num, mpoints, enpoints, mlist, enlist):
  if(math.sin(num) + 0.8 > 0):
    return 'c'
  else:
    return 'd'

นักคณิตศาสตร์อาวุโส

มีประสบการณ์มากขึ้นในเรื่องเหล่านี้

import math
def omathfunc(num, mpoints, enpoints, mlist, enlist):
  if(math.cos(num) + 0.8 > 0):
    return 'd'
  else:
    return 'c'

ฉันสงสัยว่าสิ่งเหล่านี้จะทำได้ดี แต่อย่างน้อยพวกเขาก็จะเพิ่มวิธีให้ผู้อื่นได้รับคะแนน!


ทั้งสองอย่างนี้ไม่ได้ไปกันเลยเฮ้ สิ่งที่พวกเขาทำคือให้อาหารผู้ทำลายส่วนใหญ่
Draco18 ไม่ไว้วางใจ SE

2

Titized สุ่มสำหรับ Tat

import os
def randomtitfortatfunc(forgot, ten, var, iables, enlist):
    luck = enlist.count("d") + 1
    choice = ord(os.urandom(1))
    choice = int(round(luck * float(choice - 0) / 255.0))
    if choice == 0:
        return "c"
    return "d"

Tit สำหรับ Tat แต่สุ่ม นี่จะไม่ชนะรางวัลใด ๆ (เว้นแต่ฉันจะโชคดีจริงๆ) ขณะนี้มีตัวเลขสุ่มที่สร้างจากแหล่งที่เหมาะสม


2

การใช้ประโยชน์จากตาด

ททท. Exploitative พยายามที่จะเล่นกลยุทธ์ต่อไปนี้:

  • ข้อบกพร่องเมื่ออยู่ข้างหลัง มันเป็นวิธีเดียวที่จะไล่ตาม

  • ร่วมมือกับกลยุทธ์ tit-for-tat และกลยุทธ์ที่คล้ายคลึงกัน มันเป็นวิธีเดียวที่จะได้รับคะแนนระยะยาวที่ดี

  • ข้อบกพร่องกับผู้ประสานงานตลอดเวลาและการสับอื่น ๆ

  • ข้อบกพร่อง 5 รอบก่อน

นี่คือรหัส:

def exploitativetatfunc(num, mypoints, enpoints, mylist, enlist):
    if mypoints < enpoints:
        return "d"
    if num >= 195:
        return "d"
    if num == 0:
        return "c"
    # Test defect, and keep defecting as long as they'll allow
    if (num == 5 or num >= 8) and all(choice == "c" for choice in enlist):
        return "d"
    # Recover if that goes wrong, and they were nice.
    if (num == 6 or num == 7) and all(choice == "c" for choice in enlist[:4]):
        return "c"
    # Otherwise, tit for tat.
    return enlist[-1]

ฉันประหลาดใจที่นี่ไม่ได้ดีไปกว่าอันดับที่ 8 แต่ฉันคิดว่ามันเป็นเวลาที่ผิดและมันก็เข้ามาในเวลาเดียวกันกับ Two Tits for a Tat
Gryphon

2

30 หัวนมสำหรับตาด

def สามสิบtitsfortatfunc (NUM, มากขึ้น, สนุก, ฉัน, en):
    นม = 30
    ถ้า "d" ใน en [-tits:] หรือ num> = (200-tits):
        ส่งคืน "d"
    ส่งคืน "c"

2

แต่ถ้าหาก ... คำตอบต่อไปไม่ใช่ทริกเกอร์ที่น่ากลัวหรือบางอย่างสำหรับททท

ฉันนำเสนอ

แอนตี้

def antyfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter > 150: return "d"
    if not "c" in enlist[-2:]:
        return "d"
    if enpoints >= mypoints:
        return "d"
    else:
        return "c"

การทดสอบจะเริ่มเมื่อฉันกลับถึงบ้าน
กริฟฟอน

2

จิ้งจอก

def foxfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter > enpoints:
        return "d"
    return "c"

ข้อบกพร่องหากจำนวนรอบมากกว่าคะแนนศัตรูให้ร่วมมือกันเป็นอย่างอื่น

บอย

def boyfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter!=0 and enlist[-1]=="c" and counter <= 194 or enpoints+10<mypoints:
        return "c"
    return "d"

Cooperates รอบแรกจากนั้นทำหน้าที่เป็นหัวนมสำหรับททท แต่หนุนหลังในห้ารอบสุดท้ายและข้อบกพร่องหากยังไม่ถึงสิบคะแนน

53 หัวนมสำหรับททท

def fiftythreetitsfortatfunc(num, more, fun, me, en):
    tits = 53
    if "d" in en[-tits:] or num >= (200-tits):
        return "d"
    return "c"

คุณทุกคนรู้ว่านี่คืออะไร :)


2

Twentyfivetitsforatat

def twentyfivetitsfortatfunc(num, more, fun, me, en):
    tits = 25
    if "d" in en[-tits:] or num >= (200-tits):
        return "d"
    return "c"

Kinda titsforatat

def kindatitsfortatfunc(num, more, fun, me, en):
    tits = 54  
    if "c" in en[-tits:] or num >= (200-tits):
        return "c"
    return "d"

ครั้งต่อไปที่คุณแก้ไขเพื่อเพิ่มโปรแกรมโปรดเพิ่มความคิดเห็นเพื่อให้ฉันได้รับการแจ้งเตือน ขอบคุณ!
Gryphon

@Gryphon โอ้ขอโทษ
Christopher

2

ผู้ทรยศที่ชาญฉลาด

def PrudentBetrayer(counter, mypoints, enpoints, mylist, enlist):
    # Am I ahead, even if he betrays first?
    if mypoints > enpoints + 5:
        if counter == 0:
            return "c"
        else:
            return enlist[-1]
    # Can I catch up if I betray first?
    elif mypoints + 5 > enpoints:
        if counter == 0:
            return "c"
        elif counter > 130:
            return "d"
        else:
            return "d" if "d" in enlist else "c"
    # can't win -> kill his score
    else:
        return "d"

สมมติว่ามันกำลังต่อสู้กับn-tits-for-a-tatบอท หากมีคะแนนที่จะถูกหักหลังและยังคงชนะมันจะปล่อยให้บอตอื่น ๆ ชนก่อน (เล่นเป็น tit สำหรับตาด) หากสามารถชนะได้ก็ต่อเมื่อมันวางเดิมพันก่อนมันจะหักหลังที่รอบ 130 ก่อนหน้าปัจจุบัน บอท หากมีหลายจุดที่อยู่ด้านหลังของฝ่ายตรงข้ามก็จะเล่น defector ในความพยายามที่จะลดคะแนนบอทไม่สงสัย


การจับมือกัน

import random
def handshakefunc(num, me, him, m, en):
    handshake = "cdccd"
    # For the first few rounds, give the handshake.
    if num < len(handshake):
        if m == en:
            return handshake[num]
        return "d"
    if en[:len(handshake)] == handshake:
        if me > him:
            return "d"
        if me == him:
            return "ccd"[random.randint(0,2)]
        return "c"
    return "d"

ใช้รูปแบบcdccdในห้ารอบแรกเพื่อดูว่าเป็นของตัวเองหรือไม่ ถ้าเป็นเช่นนั้นมันจะพยายามเพิ่มคะแนนให้สูงสุดโดยให้บอทที่มีคะแนนมากขึ้นมีข้อบกพร่องอยู่เสมอ หากพบว่ามีการต่อสู้กับศัตรูก็จะเล่น defector

ในการทดสอบของฉันฉันพบว่าปริมาณดีถ้ามันเป็นส่วนสำคัญของประชากร เมื่อปริมาณรังสีไม่มีโอกาสที่จะต่อสู้กับตัวเองมันจะถูกลดระดับเป็นผู้หลบหนี

แก้ไข: เห็นได้ชัดจากคะแนนที่พวกเขาจะบอทจำนวนมากเพื่อให้ทำงานได้ดี มันจะยังคงชนะถ้าการต่อสู้เพียงไม่กี่อันดับ ...


Bizzaro Trigger

def bizzaroTriggerfunc(round,ms,ts,mm,tm):
  if round==1:return 'c'
  if 'c' in tm:return'd'
  return 'c'

ให้ความร่วมมือเสมอเว้นแต่คู่ต่อสู้ของคุณจะร่วมมือกับคุณในกรณีที่คุณบกพร่อง เสมอ.


@Gryphon ผู้แพ้เจ็บถูกลบออกและบอทใหม่เพิ่ม!
MegaTom

ในการทดสอบฉันกำลังเล่นบอทฉันยังไม่ได้โพสต์จับมืออยู่ในอันดับที่ 2 หลังจากเกม 390 (5338 รอดชีวิตบอท) เอาชนะ 54-T4T โดยประมาณ 1200 บอทใหม่ของฉันแข็งแกร่งกว่านั้นแม้ว่า . การทดสอบเบื้องต้นให้คะแนน 196 จาก 196 แม้ว่าในระยะยาวจะมีคะแนนเฉลี่ยอยู่ที่ประมาณ 124 เกมต่อเกม ที่น่าสนใจมากพอพื้นฐานของการจับมือกันคือสิ่งที่ฉันจะลองต่อไปกลายเป็นว่าคุณเอาชนะฉันได้โดยที่ไม่รู้ตัว
Draco18 ไม่ไว้วางใจ SE

0

FakeShake

ใช้ประโยชน์จากการจับมือกัน - จับมือกันแล้วก็เกิดข้อผิดพลาดในขณะที่จับมือไว้ใจ เมื่อมันเข้าหากันมันจะจับมือ 'ของจริง' ถ้ามันตรงกับบอทที่แตกต่างกันมันจะเล่นหัวนมสำหรับทททโดยมีการทรยศต่อท้าย รู้สึกว่ามันหมายถึง ...

import random
def fakeshakefunc(num, i, d, m, enlist):
      secret_handshake="cdccdd"
      handshake= "cdccd"
      #checks if it is meeting itself
      if enlist[:len(secret_handshake)] == secret_handshake:
          if me > him:
            return "d"
          if me == him:
             return "ccd"[random.randint(0,2)]
          return "c"
      #does handshake's handshake,if the bot is not handshake or fakeshake it plays T4T
      if num < len(handshake):
            if m == enlist:
                return handshake[num]
            if i < d or num>= 198:
                return "d";
            if num == 0 or enlist[-1] == "c":
                return "c"
            else:
                return "d"
            if enlist[:len(handshake)] == handshake:
                return "d"
            if i < d or num>= 198:
                return "d";
            if num == 0 or enlist[-1] == "c":
                return "c"
            else:
                return "d"

ปัญหาอย่างหนึ่งของเรื่องนี้ก็คือถ้ามันจับมือกันและมีคะแนนมากขึ้นมันก็คิดว่ามันเล่นเอง ฉันเป็นมือใหม่กับงูหลามและไซต์นี้ (อันที่จริงนี่คือคำตอบแรกของฉัน) ดังนั้นโปรดบอกฉันหากฉันทำผิดพลาดใด ๆ ที่โง่!


ยินดีต้อนรับสู่ PPCG!
Laikoni

@Laikoni ขอบคุณ!
Arkine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.