Resultados (22 de mayo de 2017 21:40:37 UTC)
Master
ganó 18 rondas, perdió 2 rondas y empató 0 rondas
Save One
ganó 15 rondas, perdió 3 rondas y empató 2 rondas
Machine Gun
ganó 14 rondas, perdió 3 rondas y empató 3 rondas
Monte Bot
ganó 14 rondas, perdió 3 rondas y empató 3 rondas
Amb Bot
ganó 12 rondas, perdió 8 rondas y empató 0 rondas
Coward
ganó 11 rondas, perdió 3 rondas y empató 6 rondas
Pain in the Nash
ganó 11 rondas, perdió 9 rondas y empató 0 rondas
Nece Bot
ganó 10 rondas, perdió 7 rondas y empató 3 rondas
Naming Things is Hard
ganó 10 rondas, perdió 7 rondas y empató 3 rondas
The Procrastinator
ganó 10 rondas, perdió 8 rondas y empató 2 rondas
Yggdrasil
ganó 10 rondas, perdió 10 rondas y empató 0 rondas
Simple Bot
ganó 9 rondas, perdió 4 rondas y empató 7 rondas
Table Bot
ganó 9 rondas, perdió 6 rondas rondas y empató 5 rondas
Prioritized Random Bot
ganó 8 rondas, perdió 7 rondas y empató 5 rondas
Upper Hand Bot
ganó 7 rondas, perdió 13 rondas y empató 0 rondas
Aggressor
ganó 6 rondas, perdió 10 rondas y empató 4 rondas
Insane
ganó 5 rondas, perdió 15 rondas y empató 0 rondas
The Ugly Duckling
ganó 4 rondas, perdió 16 rondas y empató 0 rondas
Know Bot
ganadas 3 rondas, perdió 14 rondas y empató 3 rondas
Paranoid Bot
ganó 0 rondas, perdió 19 rondas y empató 1 ronda
Panic Bot
ganó 0 rondas, perdió 19 rondas y empató 1 ronda
Lamentablemente, no pude probar The Crazy X-Code Randomess porque no puedo ejecutarlo desde bash en Linux. Lo incluiré si puedo hacer que funcione.
Salida de controlador completo
El juego
Este es un juego de KoTH muy simple. Es una pelea de bolas de nieve uno a uno. Tiene un contenedor inicialmente vacío que puede soportar k
bolas de nieve. Puedes agacharte hasta j
veces. En cada turno, se les pide a ambos jugadores que den simultáneamente la opción de qué movimiento hacer. Hay tres movimientos:
- recargar: te da otra bola de nieve (hasta
k
) - tirar: lanza una bola de nieve, que matará al otro jugador si deciden recargar. Si ambos jugadores lanzan una bola de nieve, nadie muere (tienen tan buena puntería que golpearán las bolas de nieve del otro)
- pato: no hace nada y evita ser golpeado si el otro jugador lanza una bola de nieve. Si no te quedan más patos, entonces no pasa nada y si el otro jugador lanza una bola de nieve, mueres.
Objetivo
No te mueras
Especificaciones de Challlenge
Su programa se puede escribir en cualquier idioma. Debe tomar cada una de estas variables como argumento en cada ejecución:
[turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs]
turn
- cuántas vueltas han transcurrido ( 0
en la primera iteración)
snowballs
- cuántas bolas de nieve tienes
opponent_snowballs
- cuántas bolas de nieve tiene el oponente
ducks
- cuántas veces más puedes esquivar
opponent_ducks
- cuántas veces más puede esquivar el oponente
max_snowballs
- la cantidad máxima de bolas de nieve que puedes tienda ( k
)
La salida de la función clave debe ser 0
para recargar, 1
para lanzar y 2
para agacharse. Debe generar su movimiento, nueva línea terminada. No genere movimientos no válidos, pero el controlador es muy resistente y no se romperá si genera movimientos no válidos (incluso si su movimiento ni siquiera es un número entero). Sin embargo, debe ser terminado en línea nueva. Si el movimiento no está activado [0, 1, 2]
, su movimiento estará predeterminado 0
. El ganador se decidirá como el jugador con la mayor cantidad de victorias de un torneo completo de todos contra todos.
Reglas
Puede leer / escribir desde / a un archivo para el almacenamiento de memoria entre iteraciones. Su bot se colocará en su propio directorio para que no ocurran conflictos de nombre de archivo. No puede cambiar las funciones integradas (como el generador aleatorio). Fue bastante divertido la primera vez que se hizo , pero ya no lo será. Su programa no está autorizado a hacer cosas que son simplemente un estancamiento de ejecución flagrante. Se aplican lagunas estándar .
Pruebas
El código fuente del controlador se puede encontrar aquí . Ejemplo de ejecución: java Controller "python program1/test1.py" "python program2/test2.py" 10 5
para 10 bolas de nieve y 5 patos.
Juzgar
El ganador se decidirá seleccionando a la persona con más victorias después de un round robin completo. Si bien esto es un empate, elimine a todas las personas que no tienen la mayor cantidad de victorias. Luego, repita hasta que una persona gane. El estándar de evaluación será de 50 bolas de nieve y 25 patos.
Happy KoTHing!
EDITAR : El juego se declarará empatado si pasan 1000 rondas. Su bot puede asumir eso turn < 1000
.
fuente
Respuestas:
Maestro, C #
Entrené una pequeña red neuronal (usando Sharpneat ). Parece que le gusta recoger bolas de nieve y agacharse ...
En una versión anterior del controlador, incluso encontró un error. Pasó de 0% de victorias a 100% cuando descubrió cómo ganar haciendo trampa.
Editar: Olvidé restablecer el estado interno de la red y entrené la red de manera incorrecta. La red recién entrenada es mucho más pequeña.
fuente
Save One, Python
Lanza la mayoría de sus bolas de nieve de inmediato, pero siempre guarda una en caso de que el oponente esté buscando falta de munición. Luego, se agacha el mayor tiempo posible (nuevamente, guardando 1) antes de recargar, a menos que haya una recarga segura garantizada o muerte garantizada.
fuente
PrioritizedRandomBot, Java
Este bot selecciona un número entero aleatorio en el rango
0
deos + od
, y luego elige lanzar, agacharse o recargar, con los umbrales determinados por su número actual de bolas de nieve y patos.Una cosa que es importante tener en cuenta es que una vez que un bot tiene más bolas de nieve que el otro tiene bolas de nieve + patos, puede forzar una victoria. A partir de esto, podemos llegar al concepto de "puntos":
Si cualquiera de estos números se vuelve positivo, entonces ese jugador puede forzar una victoria.
La tabla de "diferencia en puntos" forma la base de la teoría del juego para esta competencia. No captura toda la información, pero muestra cómo las bolas de nieve son fundamentalmente más valiosas que los patos (ya que las bolas de nieve son ofensivas y defensivas). Si el oponente lanza una bola de nieve y tú te agachas con éxito, entonces estás un paso más cerca de una victoria forzosa, ya que tu oponente agotó un recurso más valioso. Esta tabla también describe lo que debe hacer en muchos casos especiales, como cuando ciertas opciones de movimiento no están disponibles.
La tabla de "suma de puntos" muestra cómo, con el tiempo, la suma de puntos se acerca a cero (a medida que ambos jugadores se quedan sin patos), momento en el cual el primer jugador comete un error (recarga cuando no era necesario) pierde
Ahora, intentemos extender esta estrategia forzada a casos en los que no es realmente forzoso (como en el caso de que estemos ganando por un amplio margen, pero la lectura mental del oponente nos vencerá). Básicamente, tenemos
s
bolas de nieve, pero necesitamos bolas de nieve a nuestro oponentes+1
(os+2
, etc.) tiempo consecutivamente para ganar. En este caso, queremos realizar algunos patos o algunas recargas para comprarnos algo de tiempo.En este momento, este robot siempre intenta colarse en algunos patos, simplemente porque no corre el riesgo de una pérdida inmediata: suponemos que el oponente está siguiendo una estrategia similar de lanzar tantas bolas de nieve como sea posible, por lo que intentar recargar es realmente peligroso. Además, para evitar la previsibilidad, queremos escabullirlos siguiendo una distribución aleatoria uniforme: la probabilidad de esquivar está relacionada con cuántos patos debemos realizar en relación con la cantidad de bolas de nieve que necesitamos lanzar.
Si estamos perdiendo mucho, en cuyo caso
s + d < os + od
, necesitamos escabullir algunas recargas además de usar todos nuestros patos, en este caso, queremos recargar al azar, pero solo las veces que necesitemos.Esta es la razón por la cual nuestros bots priorizan en el orden de lanzar, agacharse y recargar, y los usan
os + od
para generar el número aleatorio, ya que ese es el número umbral de movimientos que necesitamos hacer.Hay un caso de borde, y otros dos casos especiales, que el bot maneja actualmente. El caso límite es cuando el oponente no tiene bolas de nieve ni patos, por lo que la aleatorización no funciona, por lo que tiramos si es posible, de lo contrario, volvemos a cargar. Otro caso especial es cuando el oponente no puede recargar, por lo que no hay beneficio en lanzar (ya que el oponente se agachará o lanzará), por lo que siempre nos agachamos (ya que salvar nuestras bolas de nieve es más valioso que salvar a nuestros patos). El último caso especial es si el oponente no tiene bolas de nieve, en cuyo caso jugamos a lo seguro y lo recargamos si es posible.
fuente
NeceBot - Python
Aquí está la tabla de teoría de juegos para el juego:
Donde
~
significa que no hay ventaja,W
es ganar,L
es perder,+-S
significa que se gana / pierde una bola de nieve sobre el oponente, y+-D
significa que se gana / pierde un pato sobre el oponente. Este es un juego completamente simétrico.Tenga en cuenta que mi solución no tiene en cuenta esa tabla. Porque soy malo en matemáticas.
Se llama NeceBot porque primero intenta reducir lo que es necesario. Tiene algunas estrategias arbitrarias después de eso, que espero funcionen.
fuente
<3
s lol. +1 por tener una mesa de juego y luego no usarla: P Pero buena solución :)3 + opponent_snowballs <3
esto puede ser un error?<3
correosCobarde - Scala
Lanza, si el oponente no tiene munición, de lo contrario (en orden de prioridad) se agacha, lanza o recarga.
fuente
TheUglyDuckling - Python
Siempre se agachará hasta que no pueda, entonces intenta lanzar si el oponente está vacío o recargar si ambos están vacíos. Utilizará la recarga como último recurso.
fuente
SimpleBot - Python 2
Cosas simples
fuente
El bot Naming-things-is-hard - VB.NET
Nombrar cosas es difícil, y no estoy seguro de tener una estrategia coherente para nombrarlo.
Intenta apostar las primeras rondas para obtener una victoria temprana. Después de eso, juega más seguro el resto del tiempo, tratando de ganar por desgaste.
fuente
MachineGun, Python 3
Intenta ahorrar bolas de nieve hasta que se garantice la muerte del oponente o hasta que se quede sin patos (en cuyo caso, comienza a disparar a ciegas todas sus bolas de nieve, como una ametralladora)
También se agacha cuando el oponente tiene una bola de nieve, porque no quiere morir.
fuente
Knowbot, Python3
Mantiene la frecuencia de seguimiento de movimientos anteriores, asume que el oponente volverá a hacer el más frecuente y se defiende contra eso.
** Actualizado para no esperar movimientos que el oponente no puede hacer **
fuente
Braingolf , el agresor
¡El agresor no es cobarde! Si tiene una bola de nieve, ¡lanzará! Si no tiene bolas de nieve, ¡hará más!
Braingolf , el loco
Esto no es en realidad un bot, es solo un programador que secuestré y forcé a portar todos los proyectos que ha realizado a braingolf. Ya no tiene ni una pizca de cordura.
Genera un número aleatorio menor que 3 y genera
t % r
donde t es el turno actual yr es el número aleatorioPara ejecutarlos, deberá descargar
braingolf.py
desde github, luego guardar el código de braingolf en un archivo y ejecutaro simplemente inserte el código directamente así
Las entradas son bastante irrelevantes siempre que el segundo argumento después del código / nombre de archivo sea la cantidad de bolas de nieve que tiene el agresor.
Nota: El agresor en realidad se comporta de manera idéntica a TestBot, solo quería hacer una entrada en braingolf
Braingolf , The Brainy [Roto en este momento]
fuente
TestBot - Python
Este es un envío de prueba para mostrarle cómo puede ser un envío válido. La estrategia: recarga alternativa y lanzamiento. Es una estrategia bastante mala, pero te da una idea de cómo debería funcionar tu programa.
fuente
_, turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs = sys.argv
los argumentos?sys.argv[1:]
si no quiere meterse con eso_
UpperHandBot, Python 3
Este bot intenta recolectar más bolas de nieve que su oponente, y en ese punto comienza a lanzar. Si en algún momento UHB no tiene más bolas de nieve que su oponente, hará lo siguiente:
fuente
Yggdrasli, Java
Llamé a este bot "Yggdrasil" porque en realidad mira hacia abajo en el árbol del juego y realiza una valoración del estado, a partir del cual puede calcular una estrategia mixta aproximadamente ideal. Debido a que se basa en estrategias mixtas, es muy no determinista. No sé qué tan bien funcionará esto en una competencia real.
Algunas cosas sobre este bot:
fuente
Dolor en el Nash (C ++)
Llamado así porque el hecho de que tenía que escribir mi propio solucionador de equilibrio de Nash era un verdadero dolor. ¡Estoy sorprendido de que no haya bibliotecas de resolución de Nash fácilmente disponibles!
Compilar como C ++ 11 o mejor. Para el rendimiento, es bueno compilar con soporte OpenMP (pero esto es solo por velocidad; no es obligatorio)
Esto usa equilibrios de Nash para decidir qué hacer en cada turno, lo que significa que en teoría siempre ganará o empatará a largo plazo (en muchos juegos), sin importar qué estrategia use el oponente. Si ese es el caso en la práctica depende de si cometí algún error en la implementación. Sin embargo, dado que esta competencia de KoTH solo tiene una ronda contra cada oponente, probablemente no le vaya muy bien en la clasificación.
Mi idea original era tener una función de valoración simple para cada estado del juego (por ejemplo, cada bola vale + b, cada pato es + d), pero esto lleva a problemas obvios al determinar cuáles deberían ser esas valoraciones, y significa que no puede actuar en rendimientos decrecientes de reunir más y más bolas, etc. Por lo tanto, esto analizará todo el árbol del juego , trabajando hacia atrás desde el turno 1000, y completará las valoraciones reales en función de cómo podría funcionar cada juego.
El resultado es que no tengo absolutamente ninguna idea de qué estrategia usa esto, excepto por un par de comportamientos "obvios" codificados (lanzar bolas de nieve si tiene más bolas de las que su oponente tiene bolas + patos, y recargar si ambos están fuera de bolas de nieve). Si alguien quiere analizar el conjunto de datos que produce, ¡imagino que hay un comportamiento interesante por descubrir!
Probar esto contra "Save One" muestra que sí gana a largo plazo, pero solo por un pequeño margen (514 victorias, 486 derrotas, 0 empates en el primer lote de 1000 juegos y 509 victorias, 491 derrotas, 0 dibuja en el segundo).
¡Importante!
Esto funcionará de forma inmediata, pero esa no es una gran idea. Se tarda unos 9 minutos en mi computadora portátil con especificaciones de desarrollador moderado para generar el árbol completo del juego. Pero guardará las probabilidades finales en un archivo una vez que se generan, y después de eso cada turno solo genera un número aleatorio y lo compara con 2 bytes, por lo que es súper rápido.
Para atajar todo eso, simplemente descargue este archivo (3.5MB) y póngalo en el directorio con el ejecutable.
O puede generarlo usted mismo ejecutando:
Lo que ahorrará un archivo por turno, hasta la convergencia. Tenga en cuenta que cada archivo tiene 3.5MB y convergerá en el turno 720 (es decir, 280 archivos, ~ 1GB), y dado que la mayoría de los juegos no se acercan al turno 720, los archivos de preconvergencia tienen muy poca importancia.
fuente
Swift - TheCrazy_XcodeRandomness
Lamentablemente, esto solo se puede ejecutar localmente, en Xcode, porque contiene el
Foundation
módulo y su funciónarc4random_uniform()
,. Sin embargo, puedes decir cuál es el algoritmo:fuente
swift
comando y luego compruebe si funcionaFoundation
, lo siento: /TableBot, Python 2
Llamado TableBot porque fue creado al implementar esta tabla:
Un 1 representa tener 1 o más, un 0 representa no tener ninguno.
El bot:
Pruébalo en línea!
fuente
AmbBot - Esquema de raquetas
Principalmente quería probar usando
amb
, porque es genial. Este bot ordena aleatoriamente las opciones (recargar, lanzar y agacharse), filtra las que no tienen sentido y elige la primera opción. ¡Pero conamb
, podemos usar continuaciones y retroceder!También hice un pequeño programa de prueba para ejecutar dos de estos bots uno contra el otro. Parece que el segundo bot gana con más frecuencia, por lo que es posible que haya cometido un error en alguna parte.
fuente
MonteBot, C ++
Básicamente tomé el código de este koth y lo modifiqué para este desafío. Utiliza el algoritmo desacoplado UCT Monte Carlo Tree Search. Debería estar bastante cerca del equilibrio nash.
Instrucciones de compilación para Linux:
Guardar en
MonteBot.cpp
.Ejecutar
g++ -o -std=c++11 MonteBot MonteBot.cpp
.Comando para ejecutar:
./MonteBot <args>
fuente
El procrastinador - Python 3
El procrastinador postergará jugando salvando los primeros turnos. De repente, el monstruo de pánico quiere evitar perder la guerra de recursos al contrarrestar el movimiento más utilizado por los oponentes.
fuente
ParanoidBot y PanicBot - ActionScript3 ( RedTamarin )
Desde un lenguaje de nicho poco adecuado (con extensiones para proporcionar argumentos de línea de comandos), saltea ParanoidBot asustadizo y su aliado aburrido, PanicBot.
ParanoicoBot
ParanoidBot está perdiendo la cabeza y tiene una estrategia innecesariamente específica de la que depender. Primero, lanza bolas de nieve hasta que se alcanza un umbral, manteniendo algunas en reserva. Luego, después de tres patos de advertencia, se produce la paranoia y el robot intenta acumular más bolas de nieve entre patos al azar. Después de reponer su suministro, ParanoidBot vuelve a lanzar a ciegas. Debido a las voces en su cabeza, ParanoidBot puede decir si está garantizado para ganar o perder, y "creará una estrategia" en consecuencia.
Los frenos son un poco torpes para ayudar a condensar el tamaño
PanicBot
Habiéndose vuelto loco, PanicBot reacciona por miedo instintivo. Después de quedarse sin patos por el miedo, PanicBot arroja ciegamente todas sus bolas de nieve, luego hace y lanza desesperadamente más bolas de nieve hasta que (probablemente) sea derrotado.
Esta es una de las menos de 15 entradas que usan AS3 aquí en PPCG. Algún día, quizás este lenguaje posiblemente exótico encuentre un rompecabezas para dominar.
fuente
snow.as
, lo siguiente debería funcionar en bash:$ ./redshell snow.as -- 0 50 50 25 25
chmod +x redshell
es tu amigo aquí ...Defensor, Python
Se recarga cuando ninguno de los jugadores tiene bolas de nieve. Si tiene bolas de nieve, arroja. Si no tiene bolas de nieve, pero el oponente las tiene, se agacha si puede, de lo contrario se recarga.
Nota: aún no probado
fuente