Генетическое программирование - это способ заставить компьютер писать программы для вас!
Не думайте о «программах», таких как MS Word, думайте о «программах» следующим образом:
function(x){ return x*2; }
Эта функция (или программа) сама по себе не имеет причин для существования. Мы ищем решения проблем. Если вам нужно найти сумму двух чисел, просто откройте калькулятор и выполните математические расчеты. Что делать, если кто-то дал вам следующую таблицу и попросил вас выяснить отношения между result
и x
и y
:
x y result
99 1 (3.02)
79 88 2.01
21 62 5.01
84 52 (6.58)
12 70 5.54
67 18 0.73
Эти данные являются вашими "тренировочными" данными. Ваш компьютер будет использовать эти данные для создания некоторой гипотезы, а затем вы проверите ее на основе реальных данных.
Допустим, вы не знаете статистику и решаете, что эту проблему слишком сложно решить самостоятельно, поэтому вы получите компьютер, чтобы решить ее за вас.
Пусть компьютер генерирует случайные догадки
У вас есть компьютер, который генерирует миллион ответов, и посмотрите, придерживается ли какой-либо из них (угадайте ... миллион раз!). Ниже приведен пример пары догадок:
function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly
Вы можете или не можете знать это, но функции или программы также могут быть представлены в виде деревьев, например, вторая функция будет:
(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)
Вы можете сделать так, чтобы оно выглядело больше как дерево, сделав отступ таким образом (кстати, посмотрите обратную польскую запись и синтаксис lisp ... но вы поймете, почему мы представляем такие программы в ближайшее время):
(+
(/ x
(* 1
(* 1
(* 1
(* 1
(* 1 1))))
y)
( +
находится наверху с двумя «листочками» /
и y
. /
сама имеет несколько детей и т. д.)
Вот почему вы так много читаете о «деревьях» в генетическом программировании. В любом случае, мы вставляем значения x
и y
в эту функцию, и это дает нам НЕПРАВИЛЬНЫЙ ответ. Не удивительно, так как мы случайно сгенерировали это.
Теперь вы решили создать миллион таких решений. Все они не правы. Однако вы замечаете, что некоторые ответы ближе к правильному, чем другие. Другими словами, некоторые решения более «подходят», чем другие. Обратите внимание, что компьютер не знает, что является «правильным» и «неправильным», поэтому вы должны предоставить свою собственную «функцию фитнеса». Эта функция получает потенциальное решение, данные обучения и отвечает за то, чтобы сказать системе GP, насколько «подходит» это решение. Как вы можете себе представить, эта функция запускается миллионы и миллионы раз.
Что отличает GP?
Вот что отличает генетическое программирование от диких догадок. Вы решаете сделать еще один раунд миллионов догадок; однако, вы делаете это немного более разумно. Вы берете верхние 10% догадок (те, которые были близки к фактическим значениям) и делаете их частью второго поколения. Вы также берете многие из этих решений (возможно, те же самые 10% ... я не помню) и решаете "смешать их".
Вы случайным образом выбираете два решения, случайным образом выбираете поддеревья и начинаете их менять местами. Таким образом, часть решения A попадает под решение B, и наоборот - вы просто «пересекли» их. Вы также берете некоторые решения и просто «мутируете» их ... берете какое-то поддерево и немного «облажаете» (эй, если решение ужасное, «облажаться без причины» может действительно улучшить его).
Хороший способ думать об этом заключается в следующем: у вашей мамы и папы есть определенные атрибуты - цвет волос, рост, вероятность заболевания и т. Д. Вы, будучи ребенком, наследуете разные атрибуты от обоих ваших родителей. Если оба ваших родителя были олимпийцами, вы тоже будете супер спортсменом, верно? Ну, биологи, социологи и даже историки могут не согласиться с этой идеей, но компьютерные ученые не обеспокоены моралью евгеники здесь. Они просто увидели, что «система» довольно хорошо справляется с поставками решений, поэтому они решили смоделировать ее в программном обеспечении.
Если это на самом деле не соответствует биологии, но все же дает хорошие ответы ... многие компьютерные специалисты все вместе говорят: «Что бы, чувак, и спасибо за терминологию». Также обратите внимание, что все ваши братья и сестры, а не точно так же ... даже через них у них одни и те же родители. У каждого человека есть гены, которые мутируют по любой причине (пожалуйста, не показывайте это биологу, суть в том, чтобы понять мотивацию, лежащую в основе большей части терминологии).
Так что теперь мы заставляем компьютер генерировать миллионы программ и измеряем их пригодность. Лучшие решения выживают в следующем поколении. Мы также «видоизменяем» и делаем пересечение «популяций» (обратите внимание, как используется язык генетики и биологии). Как только второе поколение создано, фитнес снова измеряется. Так как это поколение имеет лучшие решения из предыдущего поколения И мы пересекли и мутировали лучшие решения (наряду с посредственным населением - чтобы сохранить разнообразие), это поколение должно быть, по крайней мере, немного лучше, чем предыдущее поколение.
Мы продолжаем это в течение очень большого числа поколений. Каждое поколение (надеюсь) предлагает лучшие и лучшие решения, пока мы не получим правильный ответ. Например:
(+ (- 2.2 (/ x 11) (* 7 (cos y))))
Хорошо, посмотрите на это, это правильно!
(Я скопировал это с http://en.wikipedia.org/wiki/Genetic_programming , который также имеет графическое представление этого дерева)
Шансы и Концы
Есть несколько важных вопросов, например, как вы решаете, какие «терминалы» ( +, -, *, /, cos, sin, tan
) доступны для вашей системы GP, как вы пишете фитнес-функцию и как система обрабатывает бессмысленные программы, такие как (1 + cos)
или (2 / "hello")
(среди многих других).
Развивать уравнения довольно скучно. Это становится более интересным, если ваш набор терминалов выглядит следующим образом: (огонь, враг, чувствуйте, двигайтесь, ...) и ваша функция фитнеса измеряет ваше здоровье и количество мертвых тел боевых монстров.
Я написал большую часть этого по памяти, но это основная идея. Я учился в колледже. Вы должны определенно поиграть с этим. Не беспокойтесь о понимании всей терминологии, просто скачайте несколько бесплатных GP-систем, ознакомьтесь с несколькими примерами, чтобы почувствовать это и создать свои собственные интересные примеры (найдите взаимосвязи между различными наборами данных, попробуйте подключить их к игре API и т. Д.)