Cette question concerne une approche des adversaires informatiques que j'ai créés et qui sont actuellement utilisés ou prévus pour être utilisés dans plusieurs jeux informatiques.
Contexte
L'année dernière, en essayant d'améliorer un adversaire informatique pour un jeu appelé "Démineur Démineur" (brève description: une version multijoueur au tour par tour de Démineur où vous devez prendre plus de mines que votre adversaire) , j'ai fortement changé la façon dont mes algorithmes fonctionnaient . Au lieu d'utiliser une approche comme if-else-if-else, j'utilise un ensemble de «correcteurs» avec des poids spécifiés pour déterminer quel est le meilleur mouvement.
Vous pourriez penser que pour un jeu comme Démineur Démineur, il s'agit uniquement de faire des mouvements qui vous donnent la plus grande probabilité de prendre une mine, mais ce n'est pas si simple. Le coup que l'ordinateur effectuera dépend généralement de plusieurs fonctionnalités pour ce coup spécifique dans l'état actuel du jeu. Exemples de fonctionnalités:
- Quelle est la probabilité que ce mouvement marque une mine?
- Quelle est la probabilité de révéler quoi que ce soit à mon adversaire ici?
Description du système
Le système fonctionne essentiellement comme ceci:
- "Pré-buteurs": une pré-analyse est effectuée pour l'état actuel du jeu (en termes de drapeaux de démineur, il s'agit généralement de: Calcul de toutes les probabilités)
- "Marqueurs": Un groupe de marqueurs ordinaires est invité à déterminer le score pour chaque coup possible, chaque marqueur applique des scores selon ses propres critères. Les correcteurs peuvent vérifier les résultats de la pré-analyse effectuée.
- Les scores calculés à l'étape ci-dessus sont additionnés et sont définis comme étant le score d'un coup.
- Les coups sont triés en fonction de leur score et classés afin que tous les coups avec le même score obtiennent le même rang.
- "Post-scorers": Le résultat de ce qui précède peut être envoyé à des "Post-scorers" qui ont la possibilité de modifier les scores de n'importe quel champ comme bon leur semble, selon les propres règles du post-scoreur.
En combinant un tas de pré-buteurs, de buteurs (avec leurs poids) et de post-buteurs, c'est ce que j'appelle une configuration de score .
Exemple de résultat
Ceci est un exemple de scores appliqués aux drapeaux de démineur. Voici la carte qui a été notée:
Et c'est la sortie d'une configuration de partition réelle. Il montre le rang des mouvements possibles, où 1 est le meilleur rang et a été mis en évidence en blanc:
Grâce à l'écriture d'un code très flexible, cette approche des IA peut également être insérée dans d'autres jeux.
Avantages et inconvénients
Voici quelques avantages et inconvénients de ce système auxquels je peux penser
Les avantages
- Il est très facile de créer un grand nombre de configurations différentes pour les IA.
- Il est possible d'utiliser avec des algorithmes génétiques: chaque marqueur a un poids associé, le poids peut devenir le gène.
- À l'aide de certains outils, il est possible de vérifier pourquoi un mouvement spécifique a été effectué et quels marqueurs étaient principalement responsables de ce mouvement.
- En utilisant des outils, il est possible de créer une carte du score global / rang des mouvements possibles (comme la capture d'écran ci-dessus)
- En appliquant des scores à la façon dont l'humain joue, il est possible de créer un "#AI_Mirror" qui essaie de faire des mouvements qu'il pense que l'humain ferait
Désavantages
- Il peut être extrêmement difficile d'ajuster une configuration de partition "correctement", pour que l'IA joue aussi bien que possible.
Des questions
Le système que j'ai construit ici est-il largement connu dans le monde de l'IA? Comment cela s'appellerait-il en termes réels d'IA?
Cette approche est-elle logique ou existe-t-il une approche différente que vous recommanderiez?
Quels sont les moyens qui pourraient faciliter le processus de modification d'une configuration de partition?
En ce qui concerne la dernière question, je suis conscient de la possibilité d'utiliser des algorithmes génétiques, je suis également légèrement au courant de SARSA (et je pense que mes correcteurs ressemblent à la description des fonctionnalités de ce site avec des poids, mais d'après ce que je comprends, ce n'est pas exactement ce que j'ai créé ici). Je pense qu'un problème avec SARSA est que vous ne connaissez pas la récompense jusqu'à la fin du jeu, le meilleur coup est souvent un coup qui ne donne pas du tout de récompense (une mine). Vos chances de gagner actuelles dépendent à la fois du score actuel (combien de mines vous et votre adversaire avez prises) et à quoi ressemble la carte actuelle.
Cette question a été initialement publiée sur un site d'Intelligence Artificielle aujourd'hui disparu .
Le code (Java) utilisé pour cette approche a maintenant été publié sur Code Review .
la source
Oui, la technique d'attribution de scores basée sur certains aspects de la position est standard dans l'écriture d'IA pour jouer à des jeux. Par exemple, presque tous les programmes d'échecs fonctionnent en marquant les positions en fonction de manière plus significative sur les pièces disponibles, avec des bonus plus petits en fonction de leurs positions (par exemple, des pions se protégeant mutuellement). Ils essaient ensuite de calculer le meilleur coup disponible en utilisant un algorithme de recherche contradictoire tel que l'alpha-bêta.
La recherche contradictoire peut être difficile ici en raison du grand facteur de ramification - dans n'importe quelle position, les mesures légales consistent à marquer ou révéler tout carré inconnu. D'un autre côté, il est possible que vous puissiez réduire considérablement le facteur de branchement par heuristique. Par exemple, marquer ou révéler un carré dont vous ne savez rien du tout sera très rarement le meilleur coup. À l'inverse, si vous connaissez l'emplacement de certaines mines non marquées, le marquage de l'une d'entre elles sera probablement le meilleur coup, la plupart du temps. Le maintien d'une table de transposition serait également utile.
la source