Bonjour, cher lecteur!
Dans cet article, nous allons développer un réseau de neurones qui peut passer à un bon niveau un jeu créé spécialement pour lui.
Remarque: cet article n'explique pas le terme « réseau de neurones » et tout ce qui s'y rapporte, ni ne fournit des informations de base sur l' entraînement réseau à l'aide de la méthode de trace . Nous vous recommandons de vous familiariser brièvement avec ces concepts avant de lire cet article.Début: description des règles du jeu
Le but est d'attraper autant de cercles avec un bord vert que possible, en évitant les cercles avec du rouge.
Termes:- Deux fois plus de cercles rouges volent sur le terrain que de cercles verts;
- Les cercles verts restent dans le champ, les cercles rouges volent hors du champ et sont éliminés;
- Les cercles verts et rouges peuvent entrer en collision et se repousser avec leur propre espèce;
- Joueur - une balle jaune sur l'écran, peut se déplacer dans le champ.
Après avoir touché le ballon disparaît et le joueur obtient les points correspondants.
Suivant: concevoir l'IA
Récepteurs
Pour que l'IA puisse décider où déplacer le joueur, vous devez d'abord obtenir des données environnementales. Pour ce faire, créez des
scanners spéciaux qui sont des lignes droites. Le premier scanner est situé à un angle de 180 degrés par rapport à la limite inférieure du champ.
Il y en aura 68: les 32 premiers - répondent aux bombes (cercles rouges), les 32 suivants - répondent aux pommes (cercles verts), et les 4 derniers - reçoivent des données sur l'emplacement des limites du champ par rapport au joueur. Appelons ces 68 scanners les
neurones d'entrée du futur réseau neuronal (couche réceptrice).
La longueur des 64 premiers scanners est de 1000 pixels, les 4 restants correspondent à la division du champ en deux selon la face de symétrie correspondante

Portée AI (1/4)

Dans la figure: neurones d'entrée recevant des valeurs des scanners
Les valeurs sur les scanners sont normalisées, c'est-à-dire réduit à la plage [0, 1], et plus l'objet traversant le scanner est proche du lecteur, plus la valeur est transmise au scanner.
Algorithme de réception de données par les scanners et son implémentation sur JSAinsi, le scanner est direct. Nous avons les coordonnées d'un de ses points (coordonnées du joueur) et l'angle par rapport à l'axe OX, nous pouvons obtenir le deuxième point en utilisant les fonctions trigonométriques sin et cos.
De là, nous obtenons le vecteur directeur de la ligne, ce qui signifie que nous pouvons construire la forme canonique de l'équation de cette ligne.
Pour obtenir la valeur sur le scanner, vous devez voir si une balle coupe cette ligne, ce qui signifie que vous devez présenter l'équation de la ligne sous une forme paramétrique et remplacer tout cela dans les équations du cercle, séquentiellement pour chaque cercle du champ.
Si nous apportons cette substitution à une forme générale, nous obtenons une équation paramétrique par rapport à a, b et c, où ces variables sont les coefficients de l'équation quadratique, à partir du carré, respectivement.
Nous invitons le lecteur à se familiariser plus en détail avec cet algorithme en utilisant les définitions les plus simples de l'algèbre linéaire
Ci-dessous le code des scanners
Ball.scaners: {
Conception de réseaux de neurones
Il était donc d'usage d'utiliser l'algorithme de traçage (chemins de référence) pour la formation NS.
Remarque: afin de simplifier le processus d'apprentissage, la construction des matrices est omise.Continuez:
- En sortie du réseau, nous présentons 8 neurones responsables des directions: le premier est à gauche, le second est à gauche + haut, le troisième est haut, le quatrième est haut + droit, le cinquième est droit et ainsi de suite;
- Soit une valeur positive sur un neurone signifie que vous devez vous déplacer dans la direction qui lui est attachée, et négative - le contraire;
- Il est important pour nous de combiner en quelque sorte les valeurs des scanners qui sont au même angle par rapport au bord inférieur du champ. Comme avec une sortie négative, l'IA repoussera de cette direction, nous introduisons une couche supplémentaire (cachée, entre l'entrée et la sortie), qui ajoutera les valeurs des neurones qui reflètent les scanners correspondants par paires, et nous prendrons les valeurs des neurones rouges avec un signe "-";
- Évidemment, le mouvement vers la gauche est principalement affecté par les informations à gauche du joueur (non seulement, mais cela sera pris en compte plus tard (*)) - cela signifie que nous connectons 8 neurones de la couche cachée située à gauche avec le neurone chargé de se déplacer vers la gauche. Nous établissons les connexions comme suit: un poids correspondant à un neurone correspondant à un scanner situé parallèlement à la limite du champ est attribué à 1, puis à deux neurones voisins un poids égal à 0,95, ceux voisins à un poids unique de 0,9 et enfin, le dernier de ce secteur est de poids 0,8;
- Nous prenons également en compte les neurones de frontière: nous attirons les communications de ces neurones de frontière vers les sorties qui peuvent influencer le mouvement des frontières.
- Il en va de même avec les sept neurones restants de la couche de sortie.
Après avoir terminé l'algorithme ci-dessus, nous obtenons le réseau neuronal montré dans la figure ci-dessous

* Mais ce n'est pas tout. Il est important d'interpréter correctement le résultat, à savoir (Y est un tableau de neurones de sortie):
Ball.vx = -(Y[0] - Y[4]) + (-(Y[1] - Y[5]) + (Y[3] - Y[6]))*0.5; Ball.vy = -(Y[2] - Y[6]) + (-(Y[3] - Y[7]) + (Y[5] - Y[1]))*0.5;
Ainsi, nous avons créé et entraîné automatiquement le réseau de neurones qui sous-tend l'IA du joueur sur le gif en haut de l'article
Le code est disponible (implémentation du jeu et de l'IA) sur le lien:
Lien vers le github Ivan753 / LearningC’est tout. Merci de votre attention!