Muitas pessoas consideram o RPS um jogo de sorte. Se ambos os jogadores jogam imprevisivelmente, a melhor estratégia é jogar aleatoriamente. No entanto, vamos apresentar um pouco de previsibilidade.
Cada bot terá a chance de dizer ao outro bot o que será reproduzido simultaneamente. Depois, há uma pausa em que cada bot saberá o que o outro jogador anunciou. Se jogar essa arma, anunciou que marcará um ponto, além dos pontos, por perda ou empate.
Uma vitória vale dois pontos, um empate, um ponto e uma perda de 0 pontos.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
É do seu interesse ser honesto (mas também para garantir que seu oponente não acredite em você).
As partidas serão disputadas no formato round robin, e o objetivo será maximizar sua própria pontuação total nas partidas que você jogar.
Formato de E / S:
- Seu bot será uma função Python 2.7 que recebe 4 argumentos e deve ter um nome exclusivo (que será usado para representar sua submissão).
- Os dois primeiros argumentos sempre serão, em ordem: os movimentos passados do oponente, seguidos pelos movimentos passados. Essa será uma lista da ordem da primeira à rodada mais recente, com cada índice contendo uma lista com a jogada que o oponente afirmou que faria, seguida pela jogada que realmente fez.
- Os próximos dois argumentos permitirão ao seu bot determinar se esta é uma rodada "honesta" ou uma rodada "real". Se for uma rodada "honesta", os dois serão Nenhum. Se for uma rodada "real", eles serão, em ordem, o lance que o seu oponente declarou que faria, seguido pelo lance que você declarou que faria.
- Todos os argumentos ou partes de argumentos que representam movimentos usarão "R", "P" e "S" para representar pedra, papel e tesoura, respectivamente.
- Sua função deve retornar um "R" para pedra, um "P" para papel ou um "S" para tesoura. Os robôs que têm a capacidade de retornar outros valores serão desqualificados.
- Cada bot será executado 200 vezes contra todos os outros bot e 100 vezes. O objetivo é ser o bot com mais pontos no final da competição.
- No que diz respeito à discussão nos comentários, as submissões não podem ser lidas ou gravadas em nenhum arquivo, nem sabotar ou ler o código do oponente.
Exemplos:
Estes são quatro exemplos de bots que eu montei rapidamente. Eles entrarão na competição como bots adicionais. Se você perder para o último, terá algum trabalho a fazer.
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"])
Controlador:
E aqui está o controlador que eu vou usar. Novos envios serão importados no início e adicionados ao dicionário 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
Pontuações finais:
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
fonte
Respostas:
Pedreiro
Tenta coletar informações sobre outros bots, como quão honestos eles são e como são afetados pelo meu primeiro movimento. Em seguida, tento encontrar outros bots óbvios que seguem um padrão e os exploro para me dar mais pontos. Finalmente, o Mason tem uma arma secreta: o conhecimento de uma sociedade secreta na qual os dois robôs participantes se empolgam mutuamente, ganhando 500 pontos cada. Infelizmente, o segredo é bastante ... Bem secreto e muda toda vez que o maçom muda.
fonte
Rlbot: aprendizagem por reforço
Utiliza uma abordagem de aprendizado reforçado, enfrentando esse jogo de maneira semelhante ao problema dos bandidos n-armados. Ele o faz de duas maneiras: tenta aprender qual declaração é melhor contra cada oponente e se mantém fiel àquela (útil contra robôs constantes) e tenta aprender o resultado de vários movimentos em situações semelhantes anteriores (semelhante em relação às jogadas relativas , por exemplo, pedra x papel é semelhante a um papel anterior x tesoura). As premissas iniciais são otimistas, então esse jogador assume que ser honesto dará 3 pontos e mentir dará 2 e, portanto, sempre será honesto até prova em contrário.
Atualização: Os primeiros resultados do torneio destacaram um problema com este bot, que era sua incapacidade de detectar padrões nas declarações de seus oponentes (o que o fazia jogar subótimamente contra rotadores). Em seguida, adicionei um componente de correspondência de padrão ao código para as rodadas honestas, que usa uma expressão regular para procurar o sufixo mais longo da história das declarações do oponente que está presente em algum lugar anteriormente nessa história, e qual jogada foi executada depois disso . Assumimos que o oponente fará o mesmo movimento novamente e use o aprendizado por reforço como antes para decidir qual deveria ser a melhor resposta.
Experimente online!
fonte
Eu realmente nunca usei muito python, então tenho certeza que cometi um erro em algum lugar.
Ele deve checar as últimas 10 rodadas para ver com que frequência o oponente mentiu e escolher uma resposta diferente, dependendo disso.
fonte
Aqui está o meu bot adaptável. Ele analisa os 2 últimos movimentos do oponente para determinar se é um bot honesto ou não e joga de acordo:
Edit 1: Se o outro bot é um bot constante (ou seja, sempre joga a mesma arma), ele esmaga-o jogando a arma vencedora e sendo honesto ao mesmo tempo.
Edit 2: Detector de bot constante aprimorado para trabalhar também com bots do rotador.
fonte
csbot
Seja honesto enquanto o outro jogador for e detecte bots determinísticos simples. Jogue a jogada que maximiza o valor esperado, onde costumamos buscar nossos pontos, mas também gostamos de não dar pontos ao outro jogador. Mas os próprios pontos são melhores por um fator de dez, daí os números incomuns na
value
função. Os movimentos adversários são esperados de acordo com a frequência com que os vimos antes nesta situação (movimentos declarados), mas os movimentos vistos recentemente são mais ponderados do que os movimentos vistos anteriormente. Para movimentos iniciais aleatórios (situações nunca vistas antes) e alguma distorção extra, os pesos incluem pequenos números aleatórios extras.Atualização: use os resultados esperados também na rodada honesta. Para poder fazer isso, normalize e leve em consideração o ponto adicional que o oponente pode considerar pela honestidade - ele não pode influenciar nossa decisão na rodada real, mas é necessário agora. Eu pensei em fazer isso desde o começo, mas pensei erroneamente que não valeria a pena. Eu vi que seria possível dar
trusting_bot
menos pontos (mas esse bot não é um oponente forte de qualquer maneira), mas perdi que pontos extras poderiam ser ganhosrockbot
com um bom jogo na rodada honesta, mesmo que o jogo nesta rodada seja aleatório.fonte
if mydecl == None:
está errado.Traição
A idéia é que, nos primeiros 50 movimentos, eu jogo honestamente e, depois de convencer o oponente a pensar que sou honesto, jogue desonestamente, tentando jogar o que contraria o que o oponente jogará (com base em sua honestidade ou desonestidade). no passado). Quando chego ao ponto em que joguei com tanta honestidade quanto desonestidade, mudo de tática e escolho a jogada mais provável do oponente com base nas configurações conhecidas anteriores.
fonte
fonte
Nome bot: Lembro-me de como você mente
Testado para várias rodadas de 100 rounds, e o vencedor obteve cerca de 220 em média. Bastante honesto, eu acho;)
Primeira vez que participei dos desafios do KOTH, acho que ainda há espaço para melhorias
fonte
Olho por olho
O clássico concorrente axelrodiano: esperançoso, mas mesquinho; simples, mas robusto. Este não é o dilema do prisioneiro e não fiz nenhuma tentativa de prever a jogada do oponente, por isso duvido que seja realmente competitivo. Mas "cooperar" ainda produz os pontos mais gerais para os competidores, então acho que pelo menos será mediano.
fonte
Dois terços
Usa a estratégia que Peter Taylor mencionou na Sandbox e neste comentário .
Ele usa o equilíbrio de Nash .
fonte
random.choice
depende de escolher um número de índice aleatório e retornar o objeto na lista nesse índice. Como os conjuntos não têm um pedido, eles também não suportam indexação e, portanto, não funcionamrandom.choice
. Uma correção simples para isso seria converter o conjunto em uma lista antes de chamarrandom.choice
.Pensamento profundo
Apenas algumas notas:
Eu sou novo em ambos, koth e Python, então me diga se eu errei alguma coisa neste bot. Não acho que ele possa superar o aprendizado reforçado (porque acho que ele aprenderá meus movimentos muito rapidamente), mas vamos tentar.
Gosto desse desafio e, se encontrar algum tempo, gostaria de adicionar uma abordagem de computação orgânica (embora possa haver muito menos pressão nas dimensões mais altas). É permitido adicionar várias sugestões? Ou é proibido impedir o booster do seu bot principal inserindo alguns que só visam perder o seu principal?
EDIT: Corrigido erro de digitação que me caracterizava como falante de inglês não nativo
fonte
return result
requer um recuo adicional. Eu acredito que deveria estar dentro da gigantesca declaração if imediatamente após, pois a variávelreturn
é declarada apenas nessa declaração. Fiz essa modificação no meu código e agora é executada sem erros. Se você não se importasse de fazer essa mudança aqui, seria ótimo.R=random.Random(seed)
e usá-lo como este:R.choice(...)
.{}
botão na barra de ferramentas para recuar automaticamente todas as linhas.fonte
have_we_been_here_before
Simplesmente pergunta "já estivemos aqui antes" e escolhe a jogada que daria o melhor resultado médio em jogos anteriores.
Edit: Clube da Honestidade. Eu adicionei um pequeno bloco de código porque outro bot (pedreiro) se saiu extremamente bem ao formar um clube secreto consigo mesmo. Observe, no entanto, que jogar honestamente contra oponentes honestos tem, em média, exatamente o mesmo resultado quando se joga contra si mesmo, e talvez também haja benefícios mútuos mais amplos?
Edit2: No momento em que escrevi os dois bots à minha frente, ambos exploravam rotadores, então adicionarei outro bloco de código para pular nesse movimento também. Eu acho que meu código deve parecer bastante antigo - aderindo a construções familiares encontradas em qualquer linguagem de programação, porque eu realmente não conheço Python.
fonte
THEbot: O Honesto Explorador
fonte
Thompson
fonte
mirrorbot
Vou tentar um bot simples que refaça a última jogada de seu oponente nessas condições
fonte
A idéia aqui é maximizar a pontuação enquanto se joga enquanto ainda é aleatoriamente competitivo durante outras etapas contra outros bots ruins.
fonte
is
é uma palavra-chave, portanto, isso é inválido.Dx
Eu só escrevi este bot para que eu possa ter um smiley no meu nome de bot xD.
fonte
Todos mentem
É sobre o seu movimento ("Vou jogar Scissors!"), E assume que o oponente também estava mentindo e que eles tentarão vencer o que eu disse que meu movimento seria ("hmm, Rock bate Scissors, então eu estou jogando isso "), mas na verdade eu jogo a jogada que supera essa jogada (" Paper! Surprise! ").
fonte
Confiando no Bot
Sempre afirma jogar uma tesoura, mas fará o que bater o que o oponente disse. Irá desenhar de forma confiável consigo mesmo.
fonte
Nome bot: Mentiroso Mentiroso
Não consigo parar de mentir.
fonte
RockBot
Supõe que o oponente será honesto e tenta vencê-lo, mas se recusa a tocar rock.
fonte
Nome bot: dontlietome
Determina se o oponente está mentindo ou não, dependendo de quantas vezes o oponente mentiu nas últimas 10 rodadas. Seleciona o movimento dependendo se o oponente está mentindo ou não. Se o oponente está determinado a mentir, então joga qual foi a dica.
fonte
lost_against_map
, e fixou a declaração se verificar se rodada honesto)fonte
Averager
fonte
Apenas um pouco melhor do que a minha entrada anterior ...
fonte
csbot em esteróides
Eu acho que a sugestão que @ user1502040 faz nos comentários deve ser seguida. Caso contrário, esse bot teria uma vantagem que eu consideraria injusta. Eu o envio para que a diferença que ele faz possa ser avaliada. Com a semeadura aleatória sugerida, os esteróides seriam neutralizados e o bot seria equivalente a
csbot
, portanto, apenas um deveria participar do concurso.fonte