Question

J’ai une fois écrit une IA de Tetris qui jouait très bien contre Tetris. L'algorithme que j'ai utilisé ( décrit dans cet article ) est un processus en deux étapes. processus.

Lors de la première étape, le programmeur décide de suivre les entrées "intéressantes". au problème. À Tetris, nous pourrions être intéressés par le suivi du nombre de lacunes consécutives, car la réduction de celles-ci pourrait aider à placer plus facilement les pièces futures. La hauteur moyenne des colonnes en est un autre, car il peut être déconseillé de prendre des risques si vous êtes sur le point de perdre.

La deuxième étape consiste à déterminer les poids associés à chaque entrée. C'est la partie où j'ai utilisé un algorithme génétique. N'importe quel algorithme d'apprentissage sera utile ici, à condition que les poids soient ajustés au fil du temps en fonction des résultats. L’idée est de laisser l’ordinateur décider du rapport entre l’entrée et la solution.

En utilisant ces entrées et leurs pondérations, nous pouvons déterminer l’intérêt de prendre des mesures. Par exemple, si le fait de placer complètement la ligne droite dans la colonne de droite élimine les espaces vides de 4 rangées différentes, cette action peut générer un score très élevé si son poids est élevé. De même, le placer à plat sur le dessus pourrait en réalité créer des trous et que l'action obtiendrait un score faible.

Je me suis toujours demandé s'il était possible d'appliquer un algorithme d'apprentissage à la première étape, où nous trouvons "intéressant". intrants potentiels. Il semble possible d'écrire un algorithme dans lequel l'ordinateur découvre d'abord quelles entrées pourraient être utiles, puis applique l'apprentissage pour peser ces entrées. Est-ce que quelque chose a été fait comme ça avant? Est-il déjà utilisé dans des applications d'IA?

Était-ce utile?

La solution

Dans les réseaux de neurones, vous pouvez sélectionner des entrées potentielles "intéressantes" en recherchant celles qui présentent la corrélation la plus forte, positive ou négative, avec les classifications pour lesquelles vous vous entraînez. J'imagine que vous pouvez faire de même dans d'autres contextes.

Autres conseils

Je pense que je pourrais aborder le problème que vous décrivez en introduisant des données plus primitives dans un algorithme d'apprentissage. Par exemple, un état de jeu de tetris peut être décrit par la liste des cellules occupées. Une chaîne de bits décrivant cette information constituerait une entrée appropriée pour cette étape de l'algorithme d'apprentissage. en fait, la formation continue est un défi; Comment savoir si ces résultats sont utiles? Je suppose que vous pouvez transformer l’algorithme entier en un seul blob, l’algorithme étant alimenté par les états de jeu successifs et la sortie ne représentant que les placements de blocs, avec des algorithmes de score supérieurs sélectionnés pour les générations futures.

Vous pouvez également utiliser un vaste corpus de pièces de théâtre provenant d’autres sources; tels que des jeux enregistrés de joueurs humains ou une création manuelle, et sélectionnez les algorithmes dont les sorties sont fortement corrélées à un fait intéressant du jeu futur, tel que le score obtenu au cours des 10 coups suivants.

Oui, il y a un moyen.

Si vous choisissez M , il y a 2 ^ M sous-ensembles, il y a donc beaucoup à regarder. Je voudrais à ce qui suit:

For each subset S
   run your code to optimize the weights W
   save S and the corresponding W

Ensuite, pour chaque paire S-W, vous pouvez exécuter des parties G pour chaque paire et enregistrer le score L pour chacune d’elles. Maintenant, vous avez un tableau comme celui-ci:

feature1    feature2    feature3    featureM   subset_code game_number    scoreL
1           0           1           1           S1         1              10500
1           0           1           1           S1         2              6230
...
0           1           1           0           S2         G + 1          30120
0           1           1           0           S2         G + 2          25900

Vous pouvez maintenant exécuter un algorithme de sélection de composants (PCA par exemple) et décider quelles fonctionnalités valent la peine d'expliquer score L.

Un conseil: lorsque vous exécutez le code pour optimiser W, indiquez le générateur de nombres aléatoires, de sorte que chaque "cerveau en évolution" soit testé par rapport à la même séquence de morceaux.

J'espère que ça aide quelque chose!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top