Определение того, какие входы взвешивать в эволюционном алгоритме
-
08-07-2019 - |
Вопрос
Однажды я написал AI тетриса, который неплохо играл на тетрисе. Алгоритм, который я использовал (, описанный в этом документе ), состоит из двух этапов процесс. р>
На первом этапе программист решает отслеживать "интересные" входные данные. к проблеме. В Tetris нам может быть интересно отслеживать количество пробелов в ряду, потому что минимизация пробелов поможет легче размещать будущие фигуры. Другой может быть средняя высота столбца, потому что может быть плохой идеей рисковать, если вы собираетесь проиграть.
Второй шаг - определение весов, связанных с каждым входом. Это та часть, где я использовал генетический алгоритм. Здесь подойдет любой алгоритм обучения, если веса корректируются с течением времени на основе результатов. Идея состоит в том, чтобы позволить компьютеру решить, как входные данные связаны с решением.
Используя эти входные данные и их вес, мы можем определить ценность любых действий. Например, если поместить форму прямой линии полностью в правый столбец, то устраните пробелы в 4 разных рядах, тогда это действие может получить очень высокий балл, если его вес велик. Точно так же, если положить его сверху, это может привести к пробелам, и поэтому действие получит низкую оценку.
Мне всегда было интересно, есть ли способ применить алгоритм обучения к первому шагу, где мы находим " интересный " потенциальные входы. Кажется возможным написать алгоритм, в котором компьютер сначала узнает, какие входные данные могут быть полезны, а затем применяет обучение для взвешивания этих входных данных. Что-нибудь было сделано раньше? Он уже используется в каких-либо AI-приложениях?
Решение
В нейронных сетях вы можете выбрать «интересные» потенциальные входные данные, найдя те, которые имеют наиболее сильную корреляцию, положительную или отрицательную, с классификациями, для которых вы готовитесь. Я думаю, вы можете сделать то же самое в других контекстах.
Другие советы
Я думаю, что мог бы подойти к описываемой вами проблеме, подавая более примитивные данные в алгоритм обучения. Например, состояние игры в тетрис может быть описано списком занятых ячеек. Строка битов, описывающая эту информацию, будет подходящим входом для этой стадии алгоритма обучения. на самом деле обучение этому все еще сложно; откуда вы знаете, полезны ли эти результаты. Я полагаю, что вы могли бы свернуть весь алгоритм в один большой двоичный объект, где алгоритм снабжен последовательными состояниями воспроизведения, а на выходе были бы просто размещения блоков, с алгоритмами более высокой оценки, выбранными для будущих поколений.
Другим вариантом может быть использование большого количества пьес из других источников; например, записанные пьесы от игроков-людей или созданных вручную аи, и выберите алгоритмы, чьи результаты имеют сильную корреляцию с каким-то интересным фактом или другим из будущей игры, такой как счет, полученный за следующие 10 ходов.
Да, есть способ.
Если вы выберете M для выбранных объектов, то будет 2 ^ M подмножества, поэтому есть на что посмотреть. Я бы к следующему:
For each subset S
run your code to optimize the weights W
save S and the corresponding W
Затем для каждой пары S-W вы можете запустить G игр для каждой пары и сохранить счет L для каждой. Теперь у вас есть такая таблица:
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
Теперь вы можете запустить алгоритм выбора компонентов (например, PCA) и решить, какие функции стоит объяснить ScoreL.
Совет. При запуске кода для оптимизации W запустите генератор случайных чисел, чтобы каждый отдельный «развивающийся мозг» проверялся на одну и ту же последовательность фрагментов.
Надеюсь, это чем-то поможет!