Beaucoup de gens considèrent RPS comme un jeu de hasard. Si les deux joueurs jouent de manière imprévisible, la meilleure stratégie consiste à jouer au hasard. Cependant, introduisons un peu de prévisibilité.
Chaque bot aura une chance de dire à l'autre bot ce qu'il va jouer simultanément. Ensuite, il y a une pause pendant laquelle chaque bot saura ce que l'autre joueur a annoncé. S'il joue cette arme, il annonce qu'il marquera un point en plus de ses points pour une défaite ou un match nul.
Une victoire vaut deux points, un match nul, un point et une perte de 0 points.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
Il est dans votre intérêt d'être honnête (mais aussi de vous assurer que votre adversaire ne vous croit pas).
Les matchs se joueront dans un format de tournoi à la ronde et l'objectif sera de maximiser votre score total pour tous les matchs que vous jouez.
Format I / O:
- Votre bot sera une fonction Python 2.7 prenant 4 arguments et doit avoir un nom unique (qui sera utilisé pour représenter votre soumission).
- Les deux premiers arguments seront toujours, dans l'ordre: les mouvements passés de l'adversaire, suivis de vos mouvements passés. Ce sera une liste dans l'ordre du premier au dernier tour, chaque index contenant une liste avec le coup que l'adversaire a prétendu qu'il ferait, suivi du coup qu'il a réellement fait.
- Les deux arguments suivants permettront à votre bot de déterminer s’il s’agit d’un tour «honnête» ou «réel». Si c'est un tour "honnête", ils ne seront aucun. Si c'est un "vrai" round, ils seront, dans l'ordre, le coup que votre adversaire a déclaré qu'ils feraient, suivi du coup que vous avez déclaré que vous feriez.
- Tous les arguments ou parties d'arguments représentant des déplacements utiliseront respectivement "R", "P" et "S" pour représenter la roche, le papier et les ciseaux.
- Votre fonction doit renvoyer un "R" pour le rock, un "P" pour le papier ou un "S" pour les ciseaux. Les robots qui ont la possibilité de renvoyer d'autres valeurs seront disqualifiés.
- Chaque bot sera attaqué 200 fois sur un bot et 100 fois. L'objectif est d'être le bot avec le plus de points à la fin de la compétition.
- En ce qui concerne la discussion dans les commentaires, les soumissions ne peuvent pas lire ou écrire dans un fichier, ni saboter ou lire le code de l'adversaire.
Exemples:
Ce sont quatre exemples de robots que je mets rapidement en place. Ils rejoindront la compétition en tant que bots supplémentaires. Si vous perdez jusqu'au dernier, vous avez du travail à faire.
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"])
Manette:
Et voici le contrôleur que je vais utiliser. Les nouvelles soumissions seront importées au début et ajoutées au dictionnaire 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
Scores finaux:
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
la source
Réponses:
le maçon
Essaie de collecter des informations sur d'autres robots, comme leur honnêteté et l'impact de mon premier geste. J'essaie ensuite de trouver d'autres robots évidents qui suivent un modèle et les exploitent pour me donner plus de points. Enfin, le maçon a une arme secrète: la connaissance d’une société secrète dans laquelle les deux robots participants s’affrontent pour un tirage au sort complet, gagnant 500 points chacun. Malheureusement, le secret est plutôt ... Bien secret et change à chaque fois que le maçon le fait.
la source
Rlbot: apprentissage par renforcement
Utilise une approche d’apprentissage par renforcement, abordant ce jeu d’une manière similaire au problème des bandits à n bras. Il le fait de deux manières: essaie de savoir quelle déclaration est la meilleure contre chaque adversaire et s’en tient à celle-là (utile contre les robots constants), et essaie de connaître le résultat de divers mouvements dans des situations précédentes similaires (semblable en ce qui concerne les jeux relatifs). , par exemple, le rock vs le papier est similaire à un précédent papier vs ciseaux). Les hypothèses de départ sont optimistes, donc ce joueur supposera qu'être honnête lui donnera 3 points et que mentir donnera 2, et sera donc toujours honnête jusqu'à preuve du contraire.
Mise à jour: Les premiers résultats du tournoi ont mis en évidence un problème avec ce bot, qui était son incapacité à détecter des motifs dans les déclarations de ses adversaires (ce qui le faisait jouer de manière sous-optimale contre les rotateurs). J'ai ensuite ajouté un composant de correspondance de motif au code pour les tours honnêtes, qui utilise une expression régulière pour rechercher le suffixe le plus long de l'historique des déclarations de l'adversaire présent quelque part dans l'historique, et quel mouvement a été joué par la suite. . Nous supposons que l'adversaire jouera à nouveau le même mouvement et utilisons l'apprentissage par renforcement comme auparavant pour décider quelle devrait être la meilleure réponse à cette question.
Essayez-le en ligne!
la source
Je n'ai jamais vraiment utilisé beaucoup de python, alors je suis sûr que j'ai commis une erreur quelque part.
Il convient de vérifier les 10 derniers tours pour voir combien de fois l'adversaire a menti, puis de choisir une réponse différente en fonction de cela.
la source
Voici mon bot adaptatif. Il analyse les 2 derniers mouvements de l'adversaire pour déterminer s'il s'agit d'un bot honnête ou non et joue en conséquence:
Edit 1: Si l’autre bot est un bot constant (c’est-à-dire qu'il utilise toujours la même arme), ce dernier l’écrase en jouant avec l’arme gagnante et en étant honnête en même temps.
Edit 2: Détecteur de bot constant amélioré pour travailler aussi avec les robots rotateurs.
la source
csbot
Soyez honnête aussi longtemps que l'autre joueur et détectez de simples robots déterministes. Jouez le coup qui maximise la valeur attendue, où nous allons surtout chercher nos points, mais nous aimons aussi ne pas donner de points à l'autre joueur. Mais les points propres sont meilleurs d'un facteur dix, d'où les nombres inhabituels dans la
value
fonction. Les mouvements de l'adversaire sont attendus en fonction de la fréquence à laquelle nous les avons vus auparavant dans cette situation (mouvements déclarés), mais les mouvements récemment observés pèsent plus lourd que les mouvements vus précédemment. Pour les mouvements initiaux aléatoires (situations jamais vues auparavant) et un peu de fuzzyness supplémentaire, les poids comprennent de petits nombres aléatoires supplémentaires.Mise à jour: Utilisez les résultats attendus également dans le tour honnête. Pour ce faire, normalisez et tenez compte du point supplémentaire que l’opposant pourrait obtenir pour l’honnêteté - cela ne pourrait pas influer sur notre décision au cours du tour réel mais est nécessaire maintenant. J'ai envisagé de le faire depuis le début, mais à tort j'ai pensé que cela n'en valait pas la peine. J'ai vu qu'il serait possible de donner
trusting_bot
moins de points (bien que ce bot ne soit pas un adversaire puissant de toute façon), mais j'ai oublié que des points supplémentaires pourraient être obtenusrockbot
grâce à un bon jeu dans le tour honnête même si son jeu dans ce tour est aléatoire.la source
if mydecl == None:
est erroné.Trahison
L'idée est que pour les 50 premiers coups, je joue honnêtement, puis une fois que j'ai persuadé mon adversaire de penser que je suis honnête, je joue malhonnêtement, j'essaie de jouer ce qui contrecarrerait ce que l'adversaire va jouer (selon qu'il soit honnête ou malhonnête autrefois). Lorsque j'arrive au point où j'ai joué aussi souvent que honnêtement que malhonnêtement, je change de tactique et choisis le coup le plus probable de l'adversaire en fonction des configurations connues précédentes.
la source
la source
Nom du bot: Je me souviens comment tu te mens
Testé pour plusieurs manches de 100 tours, il s'est avéré que le vainqueur marquait environ 220 points en moyenne. Plutôt honnête je pense;)
C'est la première fois que je participe aux défis KOTH, alors je pense qu'il y a encore matière à amélioration
la source
Tit pour Tat
Le concurrent classique Axelrodian: plein d'espoir, mais mesquin; simple, mais robuste. Ce n'est pas le dilemme du prisonnier et je n'ai fait aucune tentative pour prédire le coup de l'adversaire, alors je doute fort que ce soit vraiment compétitif. Mais "coopérer" produit toujours le plus grand nombre de points pour les concurrents, donc je pense que ça ira au moins de façon médiocre.
la source
Les deux tiers
Utilise la stratégie mentionnée par Peter Taylor dans le bac à sable et dans ce commentaire .
Il utilise l' équilibre de Nash .
la source
random.choice
cela repose sur la sélection d'un numéro d'index aléatoire, puis sur le renvoi de l'objet dans la liste à cet index. Comme les ensembles n'ont pas d'ordre, ils ne supportent pas non plus l'indexation et ne fonctionnent donc pas avecrandom.choice
. Une solution simple à cela consisterait à convertir l'ensemble en une liste avant d'appelerrandom.choice
.Pensée profonde
Quelques notes à ce sujet:
Koth et Python sont nouveaux pour moi, alors dites-moi si j'ai tout gâché dans ce bot. Je ne pense pas qu'il puisse battre un apprentissage renforcé (parce que je suppose qu'il va apprendre mes mouvements trop rapidement), mais essayons.
J'aime ce défi et, si je trouve un peu de temps, j'aimerais ajouter une approche informatique organique (même si la pression sur les dimensions supérieures est peut-être trop faible). Est-il permis d'ajouter plusieurs suggestions? Ou est-il interdit d'empêcher votre bot principal de se coincer en en insérant quelques-uns qui ne visent qu'à perdre votre principal?
EDIT: correction du code-typo qui me caractérisait comme anglophone non natif
la source
return result
nécessite un retrait supplémentaire. Je crois que cela devrait être à l'intérieur de la gigantesque instruction si elle est juste après, car la variablereturn
n'est déclarée que dans cette instruction. J'ai apporté cette modification à mon code et il s'exécute maintenant sans erreur. Si cela ne vous dérange pas de faire ce changement ici, ce serait génial.R=random.Random(seed)
et l' utiliser comme ceci:R.choice(...)
.{}
bouton de la barre d'outils pour mettre automatiquement en retrait chaque ligne.la source
avoir_we_been_here_before
Il demande simplement "sommes-nous déjà venus ici" et choisit le coup qui aurait donné le meilleur résultat moyen de ces jeux précédents.
Edit: club d'honnêteté. J'ai ajouté un petit bloc de code car un autre bot (maçon) s'est extrêmement bien débrouillé en formant un club secret avec lui-même. Notez cependant que jouer honnêtement contre des adversaires honnêtes a en moyenne exactement le même avantage quand on joue contre soi-même, et peut-être qu’il ya aussi des avantages mutuels plus larges?
Edit2: Au moment de l’écriture, les deux robots devant moi exploitent tous les deux les rotateurs. Je vais donc ajouter un autre bloc de code afin de suivre ce mouvement aussi. J'imagine que mon code doit paraître un peu vieux jeu. Je m'en tiens à des constructions connues dans tous les langages de programmation car je ne connais pas vraiment Python.
la source
THEbot: L'Exploiteur Honnête
la source
Thompson
la source
mirrorbot
Je vais essayer un simple bot qui refait le dernier jeu de son adversaire dans ces conditions
la source
L'idée ici est de maximiser le score tout en jouant soi-même tout en restant compétitif au hasard lors d'autres étapes contre d'autres méchants bots.
la source
is
est un mot clé, donc ce n'est pas valide.Dx
J'ai seulement écrit ce bot pour que je puisse avoir un smiley dans mon nom de bot xD.
la source
Tout le monde ment
Il ment à propos de son coup ("Je vais jouer aux ciseaux!"), Et suppose que l'adversaire mentait aussi et qu'ils essaieraient de battre ce que j'avais dit que mon coup serait ("hmm, Rock bat Scissors alors je joue que "), mais je joue en fait le coup qui bat ce coup (" Paper! Surprise! ").
la source
Bot de confiance
Il prétend toujours lancer des ciseaux, mais fera tout ce qui est en contradiction avec ce que l’adversaire a dit. Dessine de manière fiable avec lui-même.
la source
Nom du bot: Liar Liar
Je ne peux pas arrêter de mentir.
la source
RockBot
Suppose que l’adversaire sera honnête et essaie de le battre, mais refuse de jouer du rock.
la source
Nom du bot: dontlietome
Détermine si l'adversaire ment ou non en fonction du nombre de fois où il a menti au cours des 10 derniers tours. Sélectionne le déplacement selon que l'adversaire ment ou non. Si l'adversaire est déterminé à mentir, alors joue ce que l'allusion était.
la source
lost_against_map
, et corrigé la déclaration if vérifiant si le tour est honnête)la source
Averager
la source
Juste un peu mieux que mon entrée précédente ...
la source
Csbot sur les stéroïdes
Je pense que la suggestion que @ user1502040 fait dans les commentaires devrait être suivie. Sinon, ce bot aurait un avantage que je jugerais injuste. Je le soumets pour que la différence qu’elle fait puisse être évaluée. Avec l'ensemencement aléatoire suggéré, les stéroïdes seraient neutralisés et le bot équivaudrait à
csbot
, un seul participant devrait alors participer au concours.la source