Определение того, какие входы взвешивать в эволюционном алгоритме - PullRequest
6 голосов
/ 28 октября 2009

Однажды я написал AI тетриса, который неплохо играл на тетрисе. Алгоритм, который я использовал (, описанный в этой статье ), состоит из двух этапов.

На первом этапе программист решает отследить входные данные, которые «интересны» для проблемы. В Tetris нам может быть интересно отслеживать количество пробелов в ряду, потому что минимизация пробелов поможет легче размещать будущие фигуры. Другой может быть средняя высота столбца, потому что может быть плохой идеей рисковать, если вы собираетесь проиграть.

Второй шаг - определение весов, связанных с каждым входом. Это та часть, где я использовал генетический алгоритм. Здесь подойдет любой алгоритм обучения, если веса корректируются с течением времени на основе результатов. Идея состоит в том, чтобы позволить компьютеру решить, как входные данные связаны с решением.

Используя эти входные данные и их вес, мы можем определить ценность любого действия. Например, если указание формы прямой линии в правом столбце полностью устранит пробелы в 4 различных рядах, то это действие может получить очень высокий балл, если его вес велик. Точно так же, если положить его сверху, это может привести к пробелам, и поэтому действие получит низкий балл.

Мне всегда было интересно, есть ли способ применить алгоритм обучения на первом этапе, где мы находим «интересные» потенциальные входные данные. Кажется возможным написать алгоритм, в котором компьютер сначала узнает, какие входные данные могут быть полезны, а затем применяет обучение для взвешивания этих входных данных. Что-нибудь было сделано раньше? Он уже используется в каких-либо AI-приложениях?

Ответы [ 3 ]

1 голос
/ 28 октября 2009

В нейронных сетях вы можете выбрать «интересные» потенциальные входы, найдя те, которые имеют наиболее сильную корреляцию, положительную или отрицательную, с классификациями, для которых вы готовитесь. Я думаю, вы можете сделать то же самое в других контекстах.

0 голосов
/ 24 февраля 2013

Да, есть способ.

Если вы выберете 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 запустите генератор случайных чисел, чтобы каждый отдельный «развивающийся мозг» проверялся на одну и ту же последовательность кусочков.

Надеюсь, это чем-то поможет!

0 голосов
/ 28 октября 2009

Я думаю, что мог бы подойти к описываемой вами проблеме, подавая более примитивные данные в алгоритм обучения. Например, состояние игры в тетрис может быть описано списком занятых ячеек. Строка битов, описывающая эту информацию, будет подходящим входом для этой стадии алгоритма обучения. на самом деле обучение этому все еще сложно; откуда вы знаете, полезны ли эти результаты. Я полагаю, вы могли бы свернуть весь алгоритм в один большой двоичный объект, где алгоритм снабжен последовательными состояниями воспроизведения, а на выходе были бы просто размещения блоков, с алгоритмами более высокой оценки, выбранными для будущих поколений.

Другим выбором может быть использование большого массива пьес из других источников; например, записанные пьесы от игроков-людей или созданных вручную ай, и выберите алгоритмы, чьи результаты имеют сильную корреляцию с каким-то интересным фактом или другим из будущей игры, такой как счет, полученный за следующие 10 ходов.

...