Генетичне програмування [закрито]


13

Нещодавно я переглядав Reddit і натрапив на повідомлення, що посилається на приклад "генетичного алгоритму JavaScript". Я дійсно захоплювався поняттями генетичних алгоритмів та програмування, проте навіть після деякого Гуглінгу я все ще залишаюся трохи розгублений. Як це працює?

Я думаю, що терміни лексики мене більше бентежать, ніж будь-що інше. Буду вдячний короткі приклади та, можливо, пояснення. Просто поняття генетичного програмування і як я міг би його реалізувати у своїх проектах і чому?


1
Є гарна книга Мата Бакленда під назвою "AI Методи програмування ігор" ( amazon.com/Techniques-Programming-Premier-Press-Development/dp/… ), в якій половина книги висвітлює генетичні алгоритми. Назва книги трохи помилкова, це книга про GAs та Neural Nets. Це чудове вступ до теми.
Стівен Еверс

Відповіді:


19

Схоже, ви говорите про генетичні алгоритми більше, ніж про генетичне програмування, але ось мій внесок у ваше розуміння.


Це може бути зручно думати про GA з точки зору частин, з яких вони складаються.

Тож скажімо, у вас є якась проблема. Перше, що вам потрібно - це спосіб висловити, як виглядатиме рішення. Якщо у вас виникли проблеми продавця подорожей з містами A, B, C, D, E, то ви вже знаєте, як може виглядати рішення, масив назв міст [B, C, A, D, E].

Це Гена .

Інакше відомий як потенційне рішення проблеми. Як згадує Стівен А. Лоу, бітові рядки - це звичайний спосіб кодування генів, але це не обов'язково; це просто полегшує певні речі. Важлива частина полягає в тому, що у вас є спосіб представити рішення таким чином, як матриця.

Тепер. Звідки ви знаєте, чи корисне рішення? Вам потрібна функція, яка може вам сказати, і оцінити рішення. Отже, знову для TSP у вас може бути функція, яка вимірює пройдену відстань за допомогою шляху [B, C, A, D, E]. "Оцінка", яку ви присвоюєте, може бути просто пройденою дистанцією, але в складніших проблемах ви можете включати такі речі, як вартість проїзду та інші речі.

Це фітнес-функція .

Тож тепер ви можете прийняти потенційне рішення та дізнатись, чи добре це. Що далі?

Далі нам потрібно почати наше перше покоління. Таким чином ми генеруємо купу випадкових рішень. Не має значення, хороші вони чи ні. Це ваша початкова, або насінна, популяція. Ви можете назвати це своїм генофондом.

Таким чином, ви берете свій початковий генофонд, і ви застосовуєте свою функцію фітнесу до них усіх і даєте їм всі оцінки. Тепер вам потрібно взяти два з них і зробити з них нове населення - для наступного покоління. Кого ви вибираєте? Добре, що ви не хочете обов'язково вибирати лише найсильніші з придатних, що може призвести до деяких проблем. Натомість вам потрібна функція вибору .

Одним із способів вибору, який легко уявити, є використання свого роду колеса: кожен ген - це шматочок на колесі, а їх бал у фітнесі вказує, наскільки великий їхній зріз (чим краща придатність, тим більший шматочок). Покладіть шпильку, що вказує на колесо, і оберніть його (тобто генеруйте випадкове число). Штифт вказує на першого з батьків. Зробіть це ще раз для другого батька.

Тепер вам потрібно створити нових дітей. Ви хочете об'єднати батьків для створення нового населення. Існують різні способи зробити це, але всі вони називаються функцією кросовер . Ви можете розділити їх навпіл і поміняти половинки між батьками або зробити якесь переплетення. Це дуже аналогічно батькам ссавців, які виробляють нових дітей -> вони обоє вносять свої гени в нову дитину.

Після того, як ви отримаєте це нове покоління, ви кидаєте випадкову, але рідкісну мутацію до кожної дитини. Я часто бачив, як частота мутацій відбувається менше ніж 1%. Функція мутації випадковим чином змінить щось у вашому кодованому гені. Якщо ваш ген - це трохи рядка, він може трохи поміняти місцями, якщо це масив міст, він може поміняти місцями у списку 2 міста. Важлива частина полягає в тому, що це порівняно рідкісне явище і змішує речі.

Повторіть цей процес, поки бажана кількість поколінь, або поки ваша фітнес-функція не призведе до того, що батьки мають стабільно високі показники фітнесу, і у вас є рішення, яке (сподіваємось, якщо ви все зробили правильно) є оптимальним.


Це було трохи словно, тому дозвольте підсумувати метафору:

  1. Гени - це люди: люди вирішують проблеми
  2. Фітнес-функції - це оцінки: люди отримують оцінку залежно від того, наскільки добре вони вирішують проблему
  3. Ви вибираєте 2 людей для розведення нової популяції: ви даєте людям з кращими класами кращі шанси на розмноження
  4. Коли батьки розмножуються, вони поєднуються для виробництва дітей.
  5. Ви рідко і безладно мутуєте своїх дітей
  6. Ви оцінюєте дітей нового населення
  7. Промийте і повторіть

Сподіваюсь, це допомагає.


Це чудове пояснення. Я завжди думав, що генетичні алгоритми краще описати як дарвінові алгоритми або еволюційні алгоритми, але "генетичний", безумовно, краще описує механіку (якщо не загальну ідею про неї). Я їх назву дарвінськими генетичними алгоритмами.
Стівен Лу

Чи є гра життя Конвея генетичним алгоритмом?
Флоріан Маргайн

@Florian Margaine: Гра життя - це стільниковий автомат, неспоріднене поняття (починаючи з того, що гра життя повністю детермінована, а GA стохастична).
scrwtp

1
Це, руки вниз, єдине найкраще пояснення GA, що я коли-небудь чув. Я бачив генетичні алгоритми, про які згадувалося в минулому неодноразово, як правило, з чітких пояснень, але ніколи не розумів, якими вони були дотепер. Спасибі!
Локк

Я б хотів, щоб я бачив це пояснення, коли я вперше почав вивчати загальнодоступні знання!
Avrohom Yisroel

7

кодувати рішення проблеми як бітовий рядок

написати функцію (звану функцією "фітнес"), яка оцінює, наскільки "добре" кодованому рішенню надається бітовий рядок - результат зазвичай є числом між 0 і 1

довільно генерувати купу цих біт-рядків і оцінити їх придатність

виберіть частину пучка - як правило, більш підходящого - і розріжте їх навпіл і поміняйте половинки, щоб зробити нові бітові струни (кросовер)

то іноді, випадковим чином, переверніть кілька біт у деяких нових бітових рядках (мутація)

повторюйте, поки не розвинеться гарне рішення

чому це роблять: деякі проблеми мають величезні можливі простори вирішення, настільки великі, що оцінювати всі можливості недоцільно (див. Проблема продавця подорожей)

Я настійно рекомендую книгу Генетичні алгоритми в пошуку, оптимізації та машинному навчанні


Пошук Amazon на "Генетичні алгоритми" отримав мені чотири сторінки. Я переглянув лише першу сторінку, але жодна з книг там не мала назву «Генетичні алгоритми». Чи можете ви надати більш детальну інформацію про книгу, таку як повна назва та автор?
Девід Торнлі

Завдання: перезавантажте відповідь як генетичний алгоритм. [-:
veryfoolish

@David посилання додано; опубліковано в 1989 році, тож, можливо, є кращі з них зараз, але цей добре пояснив речі
Стівен А. Лоу,

1
@veryfoolish: спочатку переставте питання як обмежене рішення дискретного простору
Стівен А. Лоу

@David Генетичні алгоритми також можуть бути розділом чи другою у більшій книзі про штучний інтелект.
Баррі Браун

6

Генетичне програмування - це спосіб, щоб комп'ютер писав програми для вас!

Не думайте про "програми", як 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 та ін.)


1

Як я познайомився з генетичним програмуванням, вижив найкраще: природний відбір із формами Windows . Це легко прочитати з кодом, доступним для завантаження. Мінусом є те, що GP вимагає засобів для виконання коду, створеного під час виконання, і на момент написання статті C # не дуже підходив до цього завдання. Ось чому в прикладі використовується CodeDOM для генерації, компіляції та запуску коду під час виконання, що само по собі додає йому ще один рівень складності.

З того часу все змінилося. Тепер NET має власний API ExpressionTree, який, можливо, дозволить більш елегантну реалізацію GP в C #, ніж описана в статті. Але це досить добре, щоб зрозуміти, як працює GP.

Тут ви можете завантажити безкоштовну електронну книгу на GP, яка також включає в себе дуже короткий приклад java-коду, який вам також може бути цікавим.


-1

Генетичні алгоритми та генетичне програмування пов'язані, але різні поняття.

Генетичні алгоритми (GA) - це алгоритми пошуку складних задач оптимізації. У GA ви кодуєте параметри вирішення якоїсь проблеми в біт-рядку "ДНК", а потім випадковим чином "розводите" ці бітрейдинги: чи відтворюєте їх, комбінуючи їх частини, і застосовуєте "виживання найкращих", видаляючи всі бітстринг у вас є, крім тих, які найкраще вирішують вашу проблему.

Генетичне програмування (GP) ще складніше: тут ви представляєте програми не за їх ДНК (бітстринг), а за допомогою розбору дерев, які ви розводите та відбираєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.