Muchas personas consideran que RPS es un juego de azar. Si ambos jugadores juegan de forma impredecible, la mejor estrategia es jugar al azar. Sin embargo, vamos a introducir un poco de previsibilidad.
Cada bot tendrá la oportunidad de decirle al otro bot qué va a jugar simultáneamente. Luego hay una pausa en la que cada bot sabrá lo que anunció el otro jugador. Si juega esa arma, anunció que anotará un punto además de sus puntos por una derrota ganadora o un empate.
Una victoria vale dos puntos, un empate, un punto y una pérdida de 0 puntos.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
Le conviene ser honesto (pero también asegurarse de que su oponente no le crea).
Los partidos se jugarán en formato round robin, y el objetivo será maximizar su propia puntuación total en los partidos que juegue.
Formato de E / S:
- Su bot será una función Python 2.7 que toma 4 argumentos y debe tener un nombre único (que se utilizará para representar su envío).
- Los dos primeros argumentos siempre serán, en orden: los movimientos pasados del oponente, seguidos de sus movimientos pasados. Esta será una lista en orden desde la primera ronda hasta la más reciente, con cada índice que contiene una lista con el movimiento que el oponente afirmó que haría, seguido del movimiento que realmente hicieron.
- Los siguientes dos argumentos permitirán que su bot determine si se trata de una ronda "honesta" o una ronda "real". Si es una ronda "honesta", ambos serán Ninguno. Si es una ronda "real", serán, en orden, el movimiento que tu oponente declaró que harían, seguido del movimiento que declaraste que harías.
- Todos los argumentos o porciones de argumentos que representan movimientos usarán "R", "P" y "S" para representar piedra, papel y tijera, respectivamente.
- Su función debe devolver una "R" para piedra, una "P" para papel o una "S" para tijeras. Los bots que tengan la capacidad de devolver otros valores serán descalificados.
- Cada bot se ejecutará contra cualquier otro bot 200 veces, y a sí mismo 100 veces. El objetivo es ser el bot con más puntos al final de la competencia.
- En lo que respecta a la discusión en los comentarios, las presentaciones no pueden leer ni escribir en ningún archivo, ni de ninguna manera sabotear o leer el código del oponente.
Ejemplos:
Estos son cuatro bots de ejemplo que armé rápidamente. Se unirán a la competencia como bots adicionales. Si pierde con el último, tiene trabajo que hacer.
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:
Y aquí está el controlador que usaré. Las nuevas presentaciones se importarán al principio y se agregarán al diccionario 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
Puntajes finales:
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
fuente
Respuestas:
Masón
Intenta recoger información sobre otros bots, como cuán honestos son y cómo se ven afectados por mi primer movimiento. Luego trato de encontrar otros bots obvios que sigan un patrón y los explote para darme más puntos. Finalmente, el masón tiene un arma secreta: el conocimiento de una sociedad secreta en la que ambos bots que participan mutuamente van a un sorteo completo, ganando 500 puntos cada uno. Desafortunadamente, el secreto es más bien ... Bueno, secreto y cambia cada vez que lo hace Mason.
fuente
Rlbot: aprendizaje por refuerzo
Utiliza un enfoque de aprendizaje de refuerzo, abordando este juego de una manera similar al problema del bandido armado n. Lo hace de dos maneras: intenta aprender qué declaración es mejor contra cada oponente y se adhiere a esa (útil contra bots constantes), e intenta aprender el resultado de varios movimientos en situaciones similares anteriores (similar en lo que respecta a las jugadas relativas , por ejemplo, piedra vs papel es similar a un papel anterior vs tijera). Los supuestos iniciales son optimistas, por lo que este jugador asumirá que ser honesto le dará 3 puntos y mentir dará 2, y por lo tanto siempre será honesto hasta que se demuestre lo contrario.
Actualización: Los primeros resultados del torneo resaltaron un problema con este bot, que era su incapacidad para detectar patrones en las declaraciones de sus oponentes (lo que lo hacía jugar subóptimamente contra los rotadores). Luego agregué un componente de coincidencia de patrones al código para las rondas honestas, que usa una expresión regular para buscar el sufijo más largo en la historia de las declaraciones del oponente que está presente en algún lugar anteriormente en esa historia, y qué movimiento se jugó después de eso. . Asumimos que el oponente volverá a jugar el mismo movimiento y usaremos el aprendizaje de refuerzo como antes para decidir cuál debería ser la mejor respuesta.
Pruébalo en línea!
fuente
Nunca he usado mucho Python, así que estoy seguro de haber cometido un error en alguna parte.
Debería verificar las últimas 10 rondas para ver con qué frecuencia mintió el oponente, luego elegir una respuesta diferente dependiendo de eso.
fuente
Aquí está mi bot adaptativo. Analiza los últimos 2 movimientos del oponente para determinar si es un bot honesto o no y juega en consecuencia:
Edición 1: si el otro bot es un bot constante (es decir, siempre juega la misma arma), este bot lo aplasta al jugar el arma ganadora y ser honesto al mismo tiempo.
Edición 2: Detector de bot constante mejorado para trabajar también con bots rotadores.
fuente
csbot
Sé honesto mientras el otro jugador lo sea y detecta bots deterministas simples. Juega el movimiento que maximiza el valor esperado, donde generalmente vamos por nuestros puntos, pero también nos gusta no darle puntos al otro jugador. Pero los puntos propios son mejores por un factor de diez, de ahí los números inusuales en la
value
función. Los movimientos de los oponentes se esperan de acuerdo con la frecuencia con la que los hemos visto antes en esta situación (movimientos declarados), pero los movimientos vistos recientemente se ponderan más que los movimientos vistos anteriormente. Para movimientos iniciales aleatorios (situaciones nunca antes vistas) y algo de confusión adicional, los pesos incluyen pequeños números aleatorios adicionales.Actualización: Utilice los resultados esperados también en la ronda honesta. Para poder hacer esto, normalice y tome en cuenta el punto adicional que el oponente puede tener por honestidad: no pudo influir en nuestra decisión en la ronda real, pero es necesario ahora. Pensé en hacer esto desde el principio, pero erróneamente pensé que no valdría la pena. Vi que sería posible dar
trusting_bot
menos puntos (pero ese bot no es un oponente fuerte de todos modos), pero fallé que podría ganar puntos extrarockbot
con un buen juego en la ronda honesta a pesar de que su juego en esta ronda es aleatorio.fuente
if mydecl == None:
es erróneo.Traición
La idea es que durante los primeros 50 movimientos juego honestamente, y luego, una vez que he atraído al oponente a pensar que soy honesto, juego deshonestamente, tratando de jugar lo que contrarrestaría lo que jugará el oponente (en función de si fue honesto o deshonesto). en el pasado). Cuando llego al punto en el que jugué tan a menudo honestamente que deshonestamente, cambio las tácticas y elijo el movimiento más probable del oponente según las configuraciones conocidas anteriores.
fuente
fuente
Nombre del bot: recuerdo cómo mientes
Probado para varias carreras de 100 rondas, y resultó que el ganador obtiene alrededor de 220 en promedio. Más bien honesto, creo;)
Es la primera vez que participo en KOTH desafíos, por lo que creo que todavía hay margen de mejora
fuente
Tal para cual
El clásico concursante axelrodiano: esperanzado, pero mezquino; Simple, pero robusto. Este no es el dilema del prisionero y no intenté predecir el movimiento del oponente, por lo que dudo mucho que sea realmente competitivo. Pero "cooperar" todavía produce la mayor cantidad de puntos generales para los concursantes, así que creo que al menos lo hará de manera mediana.
fuente
Dos tercios
Utiliza la estrategia que Peter Taylor mencionó en el Sandbox y en este comentario .
Utiliza el equilibrio de Nash .
fuente
random.choice
basa en elegir un número de índice aleatorio y luego devolver el objeto en la lista en ese índice. Como los conjuntos no tienen un orden, tampoco admiten la indexación y, por lo tanto, no funcionanrandom.choice
. Una solución simple para esto sería convertir el conjunto en una lista antes de llamarrandom.choice
.Pensamiento profundo
Solo algunas notas al respecto:
Soy nuevo en ambos, koth y Python, así que dime si me equivoqué en este bot. No creo que pueda vencer el aprendizaje reforzado (porque supongo que aprenderá mis movimientos demasiado rápido), pero vamos a intentarlo.
Me gusta este desafío, y si encuentro algo de tiempo, me gustaría agregar un enfoque de computación orgánica (aunque tal vez haya menos presión en las dimensiones superiores). ¿Está permitido agregar múltiples sugerencias? ¿O está prohibido evitar elegir su bot principal insertando algunos que solo tengan como objetivo perder a su primario?
EDITAR: Se corrigió el error tipográfico que me caracterizaba como hablante de inglés no nativo
fuente
return result
requiere una sangría adicional. Creo que debería estar dentro de la gigantesca declaración if inmediatamente después, ya que la variablereturn
solo se declara en esa declaración. Hice esta modificación en mi código, y ahora se ejecuta sin error. Si no te importa hacer ese cambio aquí, sería genial.R=random.Random(seed)
y utilizar de esta manera:R.choice(...)
.{}
botón en la barra de herramientas para sangrar automáticamente cada línea.fuente
hemos estado aqui antes
Simplemente pregunta "hemos estado aquí antes", y elige el movimiento que habría dado el mejor resultado promedio en cualquiera de esos juegos anteriores.
Editar: Honestidad Club. He agregado un pequeño bloque de código porque a otro bot (albañil) le ha ido extremadamente bien al formar un club secreto consigo mismo. Sin embargo, tenga en cuenta que jugar honestamente contra oponentes honestos tiene, en promedio, exactamente la misma recompensa cuando juega contra uno mismo, y ¿tal vez también existan beneficios mutuos más amplios?
Edit2: Al momento de escribir, los dos bots delante de mí explotan los rotadores, por lo que agregaré otro bloque de código para saltar también en ese carro. Supongo que mi código debe parecer bastante antiguo: apegarse a construcciones familiares que se encuentran en cualquier lenguaje de programación porque realmente no conozco Python.
fuente
THEbot: EL EXPLOTADOR HONESTO
fuente
Thompson
fuente
Mirrorbot
Probaré un bot simple que rehaga la última jugada de su oponente en estas condiciones
fuente
La idea aquí es maximizar el puntaje mientras juegas a ti mismo mientras sigues siendo aleatoriamente competitivo durante otras etapas contra otros robots malos.
fuente
is
es una palabra clave, por lo tanto, no es válida.Dx
Solo escribí este bot para poder tener una carita sonriente en mi nombre de bot xD.
fuente
Todos mienten
Miente sobre su movimiento ("¡Jugaré a las Tijeras!"), Y asume que el oponente también estaba mintiendo y que tratarán de vencer lo que dije que sería mi movimiento ("hmm, Rock vence a las Tijeras, así que estoy jugando eso "), pero en realidad juego el movimiento que supera ese movimiento (" ¡Papel! ¡Sorpresa! ").
fuente
Bot de confianza
Siempre afirma tirar tijeras, pero hará lo que sea mejor que lo que dijo el oponente. Dibujará confiablemente consigo mismo.
fuente
Nombre del bot: mentiroso mentiroso
No puedo parar de mentir.
fuente
RockBot
Asume que el oponente será honesto e intenta vencerlo, pero se niega a tocar rock.
fuente
Nombre del bot: dontlietome
Determina si el oponente está mintiendo o no, dependiendo de cuántas veces haya mentido en las últimas 10 rondas. Selecciona el movimiento dependiendo de si el oponente está mintiendo o no. Si se determina que el oponente está mintiendo, entonces juega lo que fue la pista.
fuente
lost_against_map
, y fija la sentencia if comprobar si es redondo honesta)fuente
Promediador
fuente
Solo un poco mejor que mi entrada anterior ...
fuente
csbot con esteroides
Creo que se debe seguir la sugerencia que @ user1502040 hace en los comentarios. De lo contrario, este bot tendría una ventaja que consideraría injusto. Lo presento para que se pueda evaluar la diferencia que hace. Con la siembra aleatoria sugerida, los esteroides se neutralizarían y el bot sería equivalente a
csbot
, por lo que solo uno debería participar en el concurso.fuente