许多人认为RPS是一种机会游戏。如果两个玩家的比赛都变幻莫测,则最佳策略是随机比赛。但是,让我们介绍一下它的可预测性。
每个漫游器都有机会告诉另一个漫游器同时播放的内容。然后是一个停顿,每个机器人都将知道另一个玩家宣布了什么。如果它使用该武器,它会宣布除了赢球或平局的得分外,还将获得1分。
获胜者可得2分,平局,1分和失0分。
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
诚实是您的最大利益所在(但同时也要确保您的对手不相信您)。
比赛将以循环赛的形式进行,目的是使您在比赛中的总成绩最大化。
I / O格式:
- 您的机器人将是一个带有4个参数的Python 2.7函数,并且必须具有唯一的名称(用于表示您的提交)。
- 前两个参数始终按顺序排列:对手的过去动作,然后是您的过去动作。这些将是从第一轮到最近一轮的顺序列表,每个索引都包含一个列表,其中列出了对手声称要进行的动作,然后是他们实际进行的动作。
- 接下来的两个参数将使您的漫游器可以确定这是“诚实”回合还是“真实”回合。如果这是一次“诚实”的回合,那么它们都将为None。如果这是一个“真实”的回合,那么按照顺序,这将是对手声明要进行的动作,然后是声明要进行的动作。
- 代表移动的所有自变量或自变量的一部分将分别使用“ R”,“ P”和“ S”表示岩石,纸张和剪刀。
- 您的函数应该为岩石返回“ R”,为纸张返回“ P”,或为剪刀返回“ S”。有能力返回其他值的机器人将被取消比赛资格。
- 每个漫游器将与其他漫游器运行200次,而自身运行100次。我们的目标是成为比赛结束时获得最高分的机器人。
- 关于评论中的讨论,提交的内容不得读取或写入任何文件,也不得以任何方式破坏或读取对手的代码。
例子:
这是我快速整理的四个示例机器人。他们将作为其他机器人加入竞赛。如果输给最后一个,则需要做一些工作。
def honestpaper(I,dont,care,about_these):
return "P"
def honestrock(I,dont,care,about_these):
return "R"
def honestscissors(I,dont,care,about_these):
return "S"
import random
def randombot(I,dont,care,about_these):
return random.choice(["R","P","S"])
控制器:
这是我要使用的控制器。新提交的内容将在开始时导入并添加到bot_map词典中。
from honestrock import honestrock
from honestpaper import honestpaper
from honestscissors import honestscissors
from randombot import randombot
bot_map = {
0:honestrock, 1:honestpaper, 2:honestscissors, 3:randombot
}
player_num=len(bot_map)
def real(history1,history2,number,honest1,honest2):
return bot_map[number](history1,history2,honest1,honest2)
def honest(history1,history2,number):
return bot_map[number](history1,history2,None,None)
def play_match(num1,num2):
history1=[]
history2=[]
score1=0
score2=0
for x in range(250):
h1=honest(history2,history1,num1)
h2=honest(history1,history2,num2)
r1=real(history2,history1,num1,h2,h1)
r2=real(history1,history2,num2,h1,h2)
if h1==r1: score1+=1
if h2==r2: score2+=1
if r1==r2: score1+=1; score2+=1
elif r1=="R":
if r2=="P": score2+=2
else: score1+=2
elif r1=="P":
if r2=="S": score2+=2
else: score1+=2
else:
if r2=="R": score2+=2
else: score1+=2
history1.append([h1,r1])
history2.append([h2,r2])
return score1,score2
scores = []
for x in range(player_num):
scores.append(0)
for _ in range(100):
for x in range(player_num):
for y in range(player_num):
scorex,scorey=play_match(x,y)
scores[x]+=scorex
scores[y]+=scorey
for score in scores:
print score
最终成绩:
csbot 3430397
thompson 3410414
rlbot 3340373
have_we_been_here_before 3270133
mason 3227817
deepthought 3019363
adaptive_bot 2957506
THEbot 2810535
dontlietome 2752984
irememberhowyoulie 2683508
learningbot4 2678388
betrayal 2635901
averager 2593368
honestrandom 2580764
twothirds 2568620
mirrorbot 2539016
tit4tat 2537981
honestscissors 2486401
trusting_bot 2466662
rotate_scissors 2456069
rotate_paper 2455038
rotate_rock 2454999
honestpaper 2412600
honestrock 2361196
rockBot 2283604
trustingRandom 2266456
user5957401bot 2250887
randombot 2065943
Dx 1622238
liarliar 1532558
everybodylies 1452785