Генетичне програмування - це спосіб, щоб комп'ютер писав програми для вас!
Не думайте про "програми", як 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)
Ви можете зробити його більш схожим на дерево, відступаючи його так (btw, шукати зворотне позначення польської мови та синтаксис lisp ... але ви зрозумієте, чому ми незабаром представляємо такі програми):
(+
(/ x
(* 1
(* 1
(* 1
(* 1
(* 1 1))))
y)
( +
знаходиться у верхній частині з двома "листками" /
і y
. /
Сама має кілька дітей тощо)
Ось чому ви так багато читаєте про "дерева" в генетичному програмуванні. У будь-якому випадку, ми підключаємо до значень x
та y
в цю функцію, і це дає нам НЕправильний відповідь. Не дивно, однак, оскільки ми це випадково генерували.
Тепер ви вирішили генерувати мільйон таких рішень. Усі вони помиляються. Однак ви помічаєте, що деякі відповіді ближче до правильної відповіді, ніж інші. Іншими словами, деякі рішення більше "підходять", ніж інші. Зауважте, що комп'ютер не знає, що таке "правильно" і "неправильно", тому вам потрібно забезпечити власну функцію "фітнес". Ця функція передає потенційне рішення, дані тренувань, і відповідає за те, щоб сказати системі GP, наскільки "підходить" це рішення. Як ви можете уявити, ця функція запускається мільйони-мільйони разів.
Що робить GP відмінним
Ось що відрізняє генетичне програмування від диких здогадок. Ви вирішили зробити ще один раунд мільйонів здогадок; проте ти робиш це трохи розумніше. Ви берете перших 10% здогадок (тих, які були закриті до фактичних значень) і робите їх частиною другого покоління. Ви також приймаєте багато цих рішень (можливо, ті самі 10% ... я не пам'ятаю) і вирішуєте "змішати їх".
Ви безладно вибираєте два рішення, випадково вибираєте під деревами і починаєте їх міняти. Тож частина розчину А закінчується під розчином 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 та ін.)