Concurso abierto permanentemente - Actualizado el 10 de agosto de 2017
A pesar de que el 5 de junio de 2017 declaró un ganador (que se mantendrá como la mejor respuesta), estaré buscando nuevos bots y actualizando los resultados.
Resultados del 5 de junio
Felicidades usuario1502040
Como no hay empates, solo muestro el% de partidos ganados.
Statistician2
- 95.7%
Fitter
- 89.1%
Nash
- 83.9%
Weigher
- 79.9%
ExpectedBayes
- 76.4%
AntiRepeater
- 72.1%
Yggdrasil
- 65.0%
AntiGreedy
- 64.1%
Reactor
- 59.9%
NotHungry
- 57.3%
NashBot
- 55.1%
Blodsocer
- 48.6%
BestOfBothWorlds
- 48.4%
GoodWinning
- 43.9%
Rockstar
- 40.5%
ArtsyChild
- 40.4%
Assassin
- 38.1 %
WeightedRandom
- 37.7%
Ensemble
- 37.4%
UseOpponents
- 36.4%
GreedyPsychologist
- 36.3%
TheMessenger
- 33.9%
Copycat
- 31.4%
Greedy
- 28.3%
SomewhatHungry
- 27.6%
AntiAntiGreedy
- 21.0%
Cycler
- 20.3%
Swap
- 19.8%
RandomBot
- 16.2%
Creé una hoja de Google con la cuadrícula de resultados de cada emparejamiento: https://docs.google.com/spreadsheets/d/1KrMvcvWMkK-h1Ee50w0gWLh_L6rCFOgLhTN_QlEXHyk/edit?usp=sharing
Gracias al Dilema de Petri, pude manejar a este Rey de la Colina.
El juego
El juego es un simple "Piedra-Papel-Tijera" con un giro: los puntos ganados con cada victoria aumentan durante el partido (su R, P o S se cargan).
- El papel gana roca
- Tijeras gana papel
- Rock gana tijeras
El ganador obtiene tantos puntos como su carga en su juego.
El perdedor aumenta en 1 la carga en su juego.
En caso de empate, cada jugador aumenta la carga en su juego en 0.5.
Después de 100 jugadas, el que tenga más puntos es el ganador.
Por ejemplo: P1 tiene cargas [10,11,12] (piedra, papel, tijeras) y P2 [7,8,9]. P1 juega R, P2 juega P. P2 gana y obtiene 8 puntos. Las cargas P1 se convierten en [11,11,12], las cargas P2 permanecen igual.
Especificaciones de desafío
Su programa debe estar escrito en Python (lo siento, no sé cómo manejarlo de otra manera). Debe crear una función que tome cada una de estas variables como argumento en cada ejecución:
my_points, opp_points, my_loaded, opp_loaded, my_history, opp_history
points
- Puntos actuales (tuyo y tu opp)
loaded
- Matriz con cargas (en orden RPS) (la suya y su opp)
history
- Cadena con todas las jugadas, el último personaje es la última jugada (la tuya y tu opp)
Debes volver "R"
, "P"
o "S"
. Si devolvieras algo diferente, sería una pérdida automática del partido.
Reglas
No puede cambiar las funciones integradas.
Pruebas
Mantendré un Git actualizado con el código y todos los bots que compitan: https://github.com/Masclins/LoadedRPS
Juzgar
El ganador se decidirá seleccionando a la persona con la mayor cantidad de partidos ganadores después de 1000 round-robin completos. Los empates se romperán por partidos empatados. Se juegan 1000 partidos en lugar de uno porque espero mucha aleatoriedad, y de esa manera la aleatoriedad sería menos relevante.
Puedes enviar hasta 5 bots.
El concurso finaliza el 4 de julio (que será el último día en que aceptaré cualquier respuesta), y el 5 de julio publicaré las clasificaciones finales (podría intentar publicar un avance antes).
Como este es mi primer KOTH, estoy 100% abierto a cambiar cualquier cosa para mejorar, como la cantidad de partidos jugados contra cada bot.
Editado a 1000 coincidencias, ya que veo que realmente hay bastante aleatoriedad involucrado.
fuente
runcode
ybots
)?Respuestas:
Estadístico(ya no juega)Cambia entre algunas estrategias simples basadas en el rendimiento pasado esperado
Estadístico 2
Nash
Calcula un equilibrio aproximado de Nash por gradiente de descenso.
fuente
Pesador
Perdí la noción del razonamiento mientras experimentaba con el código, pero la idea básica es estimar la probabilidad de movimiento del oponente en los últimos 3 movimientos usando algunos pesos y multiplicarlos por otro peso que depende de las cargas. Pensé que también podría usarlo de alguna manera
my_loaded
, pero no podía decidir cómo, así que lo dejé fuera.Satán
Probablemente será descalificado, porque es una especie de trampa y hace algunas suposiciones sobre la función de prueba (tiene que tener la función del oponente en una variable en su marco de pila), pero técnicamente no rompe las reglas actuales, no lo hace. redefinir o reescribir cualquier cosa. Simplemente usa magia negra para ejecutar la función del oponente para ver qué turno hicieron / harán. No puede lidiar con la aleatoriedad, pero los bots deterministas no tienen oportunidad de derrotar a Satanás.
fuente
my_loaded
podría agregar un peso que valore el movimiento que perdería contra su último movimiento (s). Es como asumir que tu oponente hará algo similar a lo que hiciste y, por lo tanto, castigarlo por asumir que seguirás jugando lo mismo. Algo así como:for i, m in enumerate(reversed(my_history[-3:])): sc[(idx[m]+1)%3] += (K / (1 + i))
Ajustador
Este bot mejora el patrón y lo fusiona con Economist (Pattern and Economist ya no participará)
La mejora del Patrón es que el Bot ahora busca dos tipos de patrones: el oponente que reacciona a su última jugada y el oponente que reacciona a mi última jugada. Luego evalúa ambas predicciones para usar la que mejor se ajuste.
A partir de ese patrón, el Bot tiene ahora la probabilidad de R, P y S. Teniendo eso en cuenta y el valor esperado de cada jugada (como hizo Economist), el Bot juega el que da el mayor valor.
Aquí están los dos códigos antiguos.
Patrón(ya no se reproduce)El Patrón intenta encontrar patrones en su oponente. Se ve lo que el oponente había jugado después de la última jugada que hizo (dando más peso a las últimas jugadas). A través de eso, adivina lo que jugará el oponente, y juega el contraataque a eso.
Economista(ya no juega)The Economist hace lo siguiente: Adivina la probabilidad de cada jugada del oponente observando lo que había jugado los últimos 9 turnos. A partir de eso, calcula el beneficio esperado de cada jugada y va con el que tiene el mejor valor esperado.
fuente
Yggdrasil
Esto se llama "Yggdrasil" porque mira hacia adelante en el árbol del juego. Este bot no realiza ninguna predicción del oponente, simplemente intenta mantener una ventaja estadística si se le da una (equilibrando las ganancias actuales y futuras). Calcula una estrategia mixta aproximadamente ideal y devuelve un movimiento seleccionado al azar con esos pesos. Si este bot fuera perfecto (que no lo es, porque la función de valoración del estado es bastante mala y no se ve muy lejos), entonces sería imposible vencer a este bot más del 50% del tiempo. No sé qué tan bien le irá a este bot en la práctica.
fuente
Anti-Repetidor
Selecciona papel en el primer turno, después de lo cual devuelve lo que sea mejor que lo que el oponente haya hecho más, recogiendo papel en caso de empate.
Imitador
Simplemente copia el último movimiento de los oponentes.
Anti-Anti-codicioso
Elige lo que pierde ante la elección más pesada del oponente.
Algo hambriento
fuente
El mensajero
Estrella de rock
Asesino
Explicación
Ahora, puedes pensar que estos bots son completamente estúpidos.
no del todo cierto, estos en realidad se basan en la idea, de acumular una gran bonificación, y el enemigo hace un paso en falso y es golpeado con él.
ahora, estos bots juegan de manera muy similar a los codiciosos, sin embargo, son más simples y no se seleccionan al azar hasta que obtienen una carga en un arma, se quedan con su arma de elección.
Otra cosa a tener en cuenta: cada uno de ellos vencerá a los codiciosos aproximadamente la mitad del tiempo, atrayendo un tercio del tiempo y perdiendo un sexto del tiempo. cuando ganen, tenderán a ganar mucho. ¿Por qué es esto?
Codicioso, hasta que pierda una ronda, elegirá un arma al azar. Esto significa que cuando no gane una ronda, volverá a elegir un arma al azar, que podría volver a ser ganadora. si el codicioso empata o pierde, se queda con esa arma. si codicioso gana al menos una ronda, luego elige la misma arma que el bot, codicioso gana. si codicioso elige el arma perdedora en algún momento, nuestro bot gana, porque la carga en nuestra arma habría sido más alta que la puntuación que codicioso tiene.
Asumir que codicioso no siempre elige el arma ganadora a través de una gran oportunidad, esto significará que las posibilidades son:
1/3: {1/2 victoria (1/6 total). 1/2 perder (1/6 en total). }
1/3 de sorteo
1/3 de victoria
Entonces: 1/3 de probabilidad de empatar, 1/6 de probabilidad de pérdida, 1/2 de probabilidad de ganar.
esto probablemente muestra que necesitas hacer múltiples juegos de múltiples rondas
estos son principalmente para poner en marcha el desafío
fuente
Reactor
Realiza la jugada que habría ganado la ronda anterior.
fuente
opp_history[len(opp_history)-1]
conopp_history[-1]
.Niño artístico
Este bot actúa como un niño jugando artes y manualidades, comenzará con papel y usará papel o tijeras al azar, pero no usará tijeras después de piedra o tijeras porque necesita usar las tijeras en papel. Le arrojará una piedra a cualquiera que la arroje a ella.
fuente
Aquí los tres Bots que he creado para probar:
RandomBot
Codicioso
Simplemente elige su opción más cargada.
Antigueria
Asume que el oponente jugará con avaricia y juega la alternativa ganadora.
fuente
Sin hambre
Esto es literalmente lo contrario de Greedy, elige la opción de puntos más bajos disponible.
fuente
Use el favorito del oponente
Para el primer turno, elige un elemento aleatorio. Para cada otro turno, usa la opción más común del oponente. Si hay un empate, el valor predeterminado es la primera opción más común.
// Robé el código de aquí
Ganar es bueno
Devuelve la elección del ganador de la ronda anterior. Si la ronda anterior fue un empate, verifica recursivamente la ronda anterior. Si fue solo empate, o es la primera ronda, devuelve una elección aleatoria.
fuente
Lo mejor de ambos mundos
Este bot básicamente combina Anti-Greedy y Greedy (de ahí el nombre).
fuente
find
es para cuerdas.my_loaded
yopp_loaded
son ambas listas.index
debería ser bueno para lo que quieres.NashBot
Elige aleatoriamente entre las tres opciones de tal manera que el oponente estadísticamente no tiene preferencia entre movimientos con respecto a cuánto anota; en otras palabras, tanto Greedy como Not Hungry deberían tener el mismo puntaje promedio esperado en su contra.
fuente
EBays esperados
Editar: Clasificación actualizada
Este es el nuevo ranking superior después de la inclusión de Expectedbayes:
Explicaciones
(Nota: envío posterior al 05/06/2017)
Este bot intenta maximizar el valor esperado de su próximo movimiento:
Las probabilidades se actualizan cada diez movimientos. El número de movimientos pasados utilizados para calcular las probabilidades se ha establecido en 10 para cada bot (es decir, 20 características en general). Probablemente esto esté sobreajustando los datos, pero no intenté verificar más.
Se basa en la biblioteca de scikit para calcular las probabilidades de movimiento del oponente (lo digo en caso de que haya leído mal las reglas y, de hecho, no estaba permitido).
Fácilmente gana contra bots que siempre toman la misma decisión. Sorprendentemente, es bastante efectivo contra el bot aleatorio con una tasa de ganancia del 93% (creo que esto se debe al hecho de que limita el número de puntos que puede obtener su oponente mientras maximiza su propio número de puntos posibles para cada ronda).
Intenté rápidamente con 100 turnos y solo un número limitado de bots, y esto es lo que obtuve de result_standing:
¡Lo cual no es tan malo!
fuente
Ciclista
0 0
fuente
Conjunto
Varios algoritmos competidores votan sobre la mejor solución.
Intercambiar
Hace un movimiento aleatorio, pero sin repetir el último movimiento lo hizo.
fuente
blodsocer
socery
Le di una solución, así que probablemente debería funcionar ahora, espero
Arruiné algo de nuevo, así que lo borré y lo borré. Estoy haciendo muchos problemas.
fuente
if opp_history[1] == "S": return "R" elif opp_history[1] == "R": return "R" else: return "P"
¿Qué clase de socery es este?elif min(opp_history.count(i) for i in "RPS")/max(opp_history.count(i) for i in "RPS") >0.8 and len(my_history)>30:
"RPS"[my_loaded.index(max(my_loaded))+len(my_history)%2]
pero parece fuera de rango (y también lo harán las líneas adicionales).Aleatorio ponderado
Al igual que RandomBot, pero elige solo 2 para lanzar cada vez que se invoca. A veces vencerá a Rockstar o Assassin, pero aumentará los puntajes del otro (por ejemplo, si vence a Rockstar, le da a Assassin un aumento de puntos).
fuente
Psicólogo codicioso
Nombrado eso porque por defecto es codicioso, pero si no puede decidir, contrarresta lo que sea que haga el oponente si usara la estrategia codiciosa. Si aún no puede decidir, va al azar.
fuente