REMARQUE: ce défi est actuellement mort, car je ne peux pas installer les langues nécessaires pour exécuter une correspondance. Si quelqu'un d'autre a le temps et l'intérêt de le faire, je ne m'y oppose pas.
Voir le bas du message pour un classement.
Il s'agit d'un défi semi-coopératif du roi de la colline, où les bots construisent des chemins à travers un graphique en grille à deux dimensions. Le bot qui contrôle les nœuds avec le plus de trafic est le gagnant. Cependant, il faut plus de ressources d'un bot pour réellement construire un chemin de connexion, donc les bots devront travailler ensemble - dans une certaine mesure.
Gameplay
Dans ce qui suit, N > 0
soit le nombre de bots en jeu.
La grille
Le jeu se joue sur une grille entière bidimensionnelle de taille , dont la coordonnée en bas à gauche est à . Chaque coordonnée avec comporte des bords sortants vers les trois coordonnées , et au- dessus, où les -coordinates sont prises modulo . Cela signifie que la grille s'enroule sur les bords est et ouest. Chaque coordonnée inférieure est une source et chaque coordonnée supérieure est un puits .⌊4/3N2⌋ × ⌊4/3N2⌋
(0,0)
(x,y)
0 ≤ y < ⌊4/3N2⌋-1
(x-1,y+1)
(x,y+1)
(x+1,y+1)
x
⌊4/3N2⌋
(x,0)
(x,⌊4/3N2⌋-1)
L'image suivante montre une 8 × 8
grille.
Chaque sommet du graphique est inactif , actif ou cassé . Tous les sommets commencent inactifs et peuvent être activés par des bots, qui seront alors leurs propriétaires. De plus, les bots peuvent casser des sommets et ne peuvent pas être réparés.
Tournez l'ordre
Un tour consiste en une phase de destruction et une phase d'activation . Dans la phase de destruction, chaque bot peut casser un sommet inactif. Ce sommet est brisé à partir de ce moment et ne peut être activé par personne. Dans la phase d'activation, chaque bot peut activer un sommet inactif. À partir de ce moment, ils possèdent ce sommet, et il ne peut être réactivé par personne d'autre. Plusieurs robots peuvent posséder un seul sommet, s'ils l'activent tous au même tour. Dans chaque phase, les sélections de sommets sont effectuées simultanément.
Notation
Un tour dure exactement les tours. Après cela, le tour est marqué comme suit. À partir de chaque sommet source actif, nous effectuons fois une recherche aléatoire en profondeur d'abord le long des sommets actifs (ce qui signifie que les enfants de chaque sommet sont visités dans un ordre aléatoire). Si un chemin est trouvé de la source vers un puits, alors pour tous les sommets le long de ce chemin, chaque propriétaire du sommet obtient un point.N2
N
Le jeu entier dure 100 tours, et le bot avec le plus de points au total est le gagnant. Je peux augmenter ce nombre, si la variance des scores est trop élevée.
Règles supplémentaires
- Pas de problème avec le contrôleur ou d'autres soumissions.
- Au plus une soumission par candidat.
- Aucune ressource externe, à l'exception d'un fichier texte privé, nettoyé au début du jeu.
- Ne concevez pas votre bot pour battre ou soutenir des adversaires spécifiques.
- Fournissez des commandes pour compiler et exécuter votre bot. Tout compilateur / interprète librement disponible pour Debian Linux est acceptable.
Le controlle
Le contrôleur est écrit en Python 3 et se trouve dans GitHub . Voir le fichier README pour des instructions détaillées. Voici une API pour vous aider à démarrer:
- Les bots commencent au début de chaque manche et persistent jusqu'à la fin de la manche. La communication avec le contrôleur via STDIN et STDOUT, à l'aide de messages terminés par une nouvelle ligne.
BEGIN [num-of-bots] [num-of-turns] [side-length]
est entrée au début.DESTROY [turn]
est entré au début de chaque phase de destruction. Votre bot doit répondre soitVERTEX x,y
pour choisir un sommet, soitNONE
.BROKEN [turn] [your-choice] [other-choices]
est entré à la fin de chaque phase de destruction. L'ordre des autres bots est aléatoire au début de chaque partie, mais reste fixe pendant celui-ci. Les choix sont présentés commex,y
ouN
.ACTIVATE [turn]
etOWNED [turn] [your-choice] [other-choices]
sont les équivalents de ce qui précède pour la phase d'activation, et ont la même sémantique.SCORE [your-score] [other-scores]
est entré à la fin de la partie.- Votre bot a 1 seconde pour analyser les résultats d'une phase et choisir le sommet suivant, et 1 seconde pour quitter après avoir obtenu le score. Je vais tester les soumissions sur mon ordinateur portable relativement vieux, il est donc préférable de laisser une marge ici.
N'oubliez pas de vider votre tampon de sortie. Ne pas le faire peut bloquer le contrôleur dans certains environnements.
Classement
Mise à jour 13/03/2015
Peacemaker est opérationnel et Funnelweb a également reçu une mise à jour. Les scores ont bondi d'un ordre de grandeur. Le connecteur a dépassé la limite de temps dans deux jeux.
Funnelweb: 30911
Connector: 18431
Watermelon: 3488
Annoyance: 1552
Explorer: 735
Checkpoint: 720
Random Builder: 535
FaucetBot: 236
Peacemaker: 80
Le journal complet avec les graphiques artistiques ASCII se trouve dans le référentiel du contrôleur, dans graphical_log.txt
.
Quelques observations:
- Le connecteur peut très facilement être arrêté en cassant un seul sommet devant lui. Je soupçonne que l'agacement fait souvent cela. Cependant, cela n'a actuellement guère de sens car seul le connecteur peut concevoir un chemin.
- La pastèque peut obtenir un score décent en se trouvant simplement sur un chemin de connexion (car le DFS est très susceptible d'utiliser ses sommets).
- Explorer aime cultiver des vignes à partir des pastèques.
- Le Funnelweb mis à jour obtient de très bons scores, car Connector se verrouille généralement dessus dans la moitié inférieure de la grille.
- Les jeux deviennent assez longs, la manche moyenne prenant environ 25 secondes sur ma machine.
4/3*N^2
, et même là, les bots ont eu des problèmes pour former des chemins valides. Cependant, Connector a été temporairement disqualifié en raison d'une erreur, et maintenant qu'il a été corrigé, je m'attends à ce que les jeux soient plus intéressants. Je vais exécuter un autre lot ce soir.Réponses:
Connecteur (Java)
Tente de créer un chemin à une position aléatoire. Puisqu'il ne peut pas créer seul un chemin, il recherche les cellules actives et les utilise. Le mérite revient à Geobits, à qui j'ai volé du code. De plus, cette soumission n'est pas encore terminée, car elle cesse simplement de faire quoi que ce soit dès que le chemin est créé.
Modifier: si un chemin est créé, Connector essaie de créer plusieurs chemins le long du chemin existant.
la source
java.lang.ArrayIndexOutOfBoundsException: -1 at Connector.findExtendingPathPoint(Connector.java:166)
.Funnelweb, Python 2
version 1.2 - Meilleure jonction de code, nouvelle animation ajoutée
Nommé d'après l'une des araignées les moins amicales d'Australie. Ce bot construit d'abord un nid en forme d'entonnoir dans les rangées supérieures, puis attire d'autres bots dans des chemins de construction pour le trafic vers le nid.
Voici une nouvelle animation d'un jeu à 6 bots sur un tableau 4 / 3N ^ 2 montrant l'entonnoir et quelques bots plus simples:
Le code Python de funnelweb:
L'araignée est exécutée avec
python funnelweb.py
.la source
Checkpoint, Java
Ce bot essaie de créer des points de contrôle afin que tout chemin valide passe par l'un de mes sommets. Puisqu'il y a N 2 tours et que la carte est 2N 2 de diamètre, je peux activer / casser chaque nœud sur une seule ligne horizontale (en supposant que je suis là en premier). Pour ce faire, en alternance (
x
est cassé,o
est le mien):Si vous voulez faire un chemin, vous devez passer par mes points de contrôle :)
Maintenant, il peut y avoir plusieurs problèmes. Tout d'abord, ça ne va pas très bien du tout à moins qu'il y ait beaucoup de chemins. Comme il ne fait pas des chemins de production lui - même, il est vraiment totalement dépendante de l'existence d'certains concurrents. Même un couple de concurrents se combinant pour faire un seul chemin n'aidera pas beaucoup, car il ne marque qu'une place pour chaque chemin trouvé. Ce dont il a besoin pour briller, c'est probablement pas mal de bots qui font pas mal de chemins différents. Même alors, cela pourrait ne pas marquer très bien, mais c'était une idée que j'avais dans le chat, alors ...
Si l'un des espaces sur la ligne est déjà bloqué / revendiqué, je recherche simplement un endroit proche que je peux utiliser (de préférence sur la même
x
ligne, juste décalé verticalement).Pour compiler, c'est
javac Checkpoint.java
. Pour exécuter,java Checkpoint
. Vous voudrez ajouter / modifier le chemin pour refléter où qu'il se trouve.la source
Pastèque, Java
Tente de dessiner des pastèques sur la grille.
la source
FaucetBot (en R)
Crée un goulot d'étranglement sur la deuxième ligne et active les nœuds sur le chemin derrière elle.
Si je n'ai pas bousillé, la configuration finale devrait ressembler à ceci:
Le commandement est
Rscript FaucetBot.R
.la source
Peacemaker, Java
Basé sur le code de Manu.
Peacemaker recherche les zones de conflit (c'est-à-dire la plupart des concentrations de vertex cassées ou actives) et active un vertex aléatoire à proximité.
la source
while
boucle de laactivate
méthode. Vous arrêtez la recherche une fois que vous avez trouvé un sommet qui n'est pas le vôtre et qui n'est pas cassé - mais il pourrait appartenir à quelqu'un d'autre, vous ne pouvez donc pas l'activer.Générateur aléatoire, Python 3
Il s'agit d'un exemple de bot stupide qui ne détruit jamais rien et essaie d'activer un sommet aléatoire à chaque tour. Notez qu'il n'a pas besoin de vérifier si le sommet est inactif; le contrôleur s'en charge.
Exécuter avec la commande
Vous devrez peut-être le remplacer
python3
enpython
fonction de votre installation Python. Pour ce faire, modifiez simplement lebots.txt
fichier. J'ai mis à jour le contrôleur, et il n'est plus nécessaire de jouer avec les chemins de fichiers.la source
sys.stdout.flush()
vous, vous pouvez simplement le faireflush=True
comme argumentprint
.Explorer, Python 3
Stratégie d'activation:
Crée une carte thermique basée sur l'état de chaque nœud (actif / inactif / cassé) et choisit le nœud qui aurait la plus grande valeur de carte thermique attendue par personne s'il choisissait celui-ci.
Stratégie de destruction:
Ne détruit jamais rien car cela n'aide pas beaucoup le bot.
la source
Agacement, Bash
J'ai essayé de rendre le résultat plus intéressant.
Courez avec
bash annoyance.sh
.la source
Homme du milieu
J'ai vu que certains bots étaient construits par le haut et certains par le bas. C'est le premier (je pense) à commencer au milieu et à monter et descendre.
(il n'est pas testé avec le contrôleur, donc s'il ne fonctionne pas, faites le moi savoir.)
la source