Які хороші приклади генетичних алгоритмів / рішення генетичного програмування? [зачинено]


227

Генетичні алгоритми (GA) та генетичне програмування (GP) - цікаві сфери досліджень.

Мені хотілося б дізнатися про конкретні проблеми, які ви вирішили за допомогою GA / GP та які бібліотеки / фреймворки ви використовували, якщо ви не скотили свою власну.

Запитання:

  • Які проблеми ви використовували GA / GP для вирішення?
  • Які бібліотеки / рамки ви використовували?

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


28
@Jason: Дякую, що ви запропонували цю річ у Google. Хоча це здається дещо корисним, я не розумію, як він міг би відповісти на це запитання, оскільки він спеціально стосується користувачів SO, які мають досвід GA / GP.
knorv


13
"Ми очікуємо, що відповіді будуть підтримані ... конкретною експертизою ...." Перевірте! "[T] його питання, ймовірно, вимагатиме дискусій, аргументів, опитування чи розширеного обговорення." Помилковий. Відповідей багато, але це не опитування, і в коментарях не так багато коментарів чи дискусій. Чому це було закрито?
Адріан Маккарті

Програма Eureqa дуже хороша для генетичного програмування: nutonian.com/products/eureqa
Simon

Відповіді:


146

Не домашнє завдання.

Моя перша робота на посаді професійного програміста (1995) - написання автоматизованої торгової системи на основі генетичного алгоритму для ф'ючерсів на S&P500. Додаток було написано на Visual Basic 3 [!], І я не маю уявлення, як я тоді щось робив, оскільки VB3 навіть не мав занять.

Додаток розпочався з сукупності випадково згенерованих рядків фіксованої довжини (частина "гена"), кожна з яких відповідала конкретній формі в хвилинових хвилинах цін ф'ючерсів на S & P500, а також конкретного порядку (купувати чи продавати) та суми стоп-втрат та стоп-прибутку. Кожен рядок (або "ген") оцінював свою прибутковість за результатами 3-х років історичних даних; всякий раз, коли зазначена "форма" відповідала історичним даним, я приймав відповідне замовлення на купівлю-продаж та оцінював результат торгівлі. Я додав застереження про те, що кожен ген починається з фіксованої суми грошей і, таким чином, потенційно може порушитись і повністю вийти з генофонду.

Після кожної оцінки популяції вижили були розведені випадковим шляхом (шляхом простого змішування шматочків двох батьків), при цьому ймовірність того, що ген був обраний батьком, пропорційний прибутку, який він отримав. Я також додав можливість точкових мутацій, щоб трохи приправити речі. Після декількох сотень поколінь я закінчився популяцією генів, які могли перетворити 5000 доларів в середньому приблизно на 10000 доларів без шансів смерті / зламування (звичайно, за історичними даними).

На жаль, я ніколи не отримав шансу використовувати цю систему в прямому ефірі, оскільки мій бос втратив близько 100 000 доларів менш ніж за 3 місяці, торгуючи традиційним шляхом, і він втратив готовність продовжувати проект. Зрештою, я думаю, що система принесла б величезний прибуток - не тому, що я обов'язково робила щось правильно, а тому, що популяція генів, які я виробляла, сталася упередженою щодо замовлень на купівлю (на відміну від продажу замовлень) приблизно на 5: 1 співвідношення. І як ми знаємо з нашим 20/20 заднім числом, ринок трохи піднявся після 1995 року.


9
"Я думаю, що система принесла б величезний прибуток" - так, я думаю, вона прекрасно працювала в середовищі бекстерингу ;-)
Джоель,

30
@Joel: звичайно, це було, але це не те, чому я думаю, що це було б вигідно. Заробляв би гроші через сильну ухил до купівлі, а не продажу. Система, яка щойно купувала ф'ючерси на S&P500 у випадкові періоди між 1995 та 1999 роками (без будь-яких дурниць GA), заробила б багато грошей, але це ми знаємо лише заднім часом.
MusiGenesis

10
Джоель, ймовірно, мав на увазі "надмірний".
Ерік Норманд

10
Вам потрібно зарезервувати трохи своїх історичних даних для тестування. Найкраще зробити перехресну перевірку.
Ерік Норманд

Що ви маєте на увазі під "формою" в each of which corresponded to a specific shape in the minute-by-minute price data?
CodyBugstein

89

Я зробив маленьких ледарів, які жили в цьому маленькому світі. У них був мозок нейронної мережі, який отримував певні входи від світу, і вихід був вектором для руху серед інших дій. Їх мізки були "генами".

Програма розпочалася з випадкової сукупності жителів із випадковими мізками. Входи та вихідні нейрони були статичними, але між ними не було.

Навколишнє середовище містило їжу та небезпеку. Їжа збільшила енергію, і коли у вас достатньо енергії, ви можете спаровуватися. Небезпеки зменшили б енергію, і якби енергія була 0, вони загинули.

Врешті-решт істоти еволюціонували рухатися по світу та знаходити їжу та уникати небезпек.

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

Тоді я спробував щось цікаве. Я мертві істоти стали б їжею. Спробуйте відгадати, що сталося! Еволюціонували два типи істот: ті, що атакували, як у ройових, і ті, що мали велике уникнення.

То який тут урок? Спілкування означає співпрацю. Як тільки ви вводите елемент, коли травмувати іншого означає, що ви щось отримуєте, тоді співпраця руйнується.

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

Редагувати:

Я написав це на C ++, не використовуючи рамки. Написав власну нейронну мережу та код GA. Еріку, дякую, що сказав, що це правдоподібно. Люди, як правило, не вірять у сили GA (хоча обмеження очевидні), поки вони не грали з цим. GA простий, але не спрощений.

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

Ось демонстраційний код для прикладу виживання: http://www.mempko.com/darcs/neural/demos/eaters/ Інструкції зі зборки:

  • Встановіть darcs, libboost, liballegro, gcc, cmake, make
  • darcs clone --lazy http://www.mempko.com/darcs/neural/
  • cd neural
  • cmake .
  • make
  • cd demos/eaters
  • ./eaters

Знімок екрана


10
І де ваша нагорода Тюрінга, щоб піти з цією історією? Напевно, у вас були якісь шалені успіхи в науці, щоб такий експеримент навіть був запущений на чому-небудь, крім RoadRunner.
San Jacinto

1
Домовився з Еріком. Ви можете написати простий NN протягом години (а насправді я це зробив на іспиті), а базовий GA - це не обов'язково більше дня або двох роботи. Це скоріше алгоритм A-Life, ніж генетичний алгоритм, але ми все ще говоримо про дуже прості та здійснені речі.
Кілотан

2
Це не є фальшивим у найменшій мірі ... Влітку після першого курсу я створив проект для приємних фільмів, дуже подібних до цього, використовуючи XNA в C #, за винятком нейронних мереж, використовуючи GA та популяцію істот з безліччю різних ознак . Наприклад, один ген контролював їх зір - вище означало подальший зір, нижчий означав ширший радіус зору. Перешкоди та їжа розміщуватимуться випадковим чином, і істоти поповнюватимуть свою енергію, вживаючи їжу. Риси мутуватимуть, додаючи до них випадково генеровані гауссові числа, в результаті чого гени будуть нормально розподілені, як у фактичній еволюції.
Філіп Гін

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

1
Я знайшов деякі докази на його веб-сайті: www.mempko.com/darcs/neural Він заявляє: "Я наводив чудовий приклад маленьких чоловіків у маленькому світі, що розвиваються для виживання". Ось приклад коду: mempko.com/darcs/neural/demos/eaters
guerda

51

У січні 2004 року до мене звернулися компанії Philips New Display Technologies, які створювали електроніку для першої в історії комерційної електронної фарби, Sony Librie, яка була випущена лише в Японії, за роки, перш ніж Amazon Kindle та інші потрапили на ринок у США. Європа.

У інженерів Philips була велика проблема. За кілька місяців до того, як продукт повинен був потрапити на ринок, вони все ще отримували привид на екрані під час зміни сторінок. Проблемою були 200 драйверів, які створювали електростатичне поле. Кожен з цих драйверів мав певну напругу, яку потрібно було встановити прямо між нулем та 1000 мВ або щось подібне. Але якби ви змінили одну з них, вона змінила б усе.

Тож про оптимізацію напруги кожного водія індивідуально не було сумніву. Кількість можливих комбінацій значень була в мільярдах, і спеціальній камері було потрібно близько 1 хвилини, щоб оцінити одну комбінацію. Інженери випробували багато стандартних методик оптимізації, але нічого не наблизилося.

Головний інженер зв’язався зі мною, оскільки я раніше випустив бібліотеку генетичного програмування до спільноти з відкритим кодом. Він поцікавився, чи допоможуть лікарі GP / GA і чи можу я взяти участь. Я це зробив, і близько місяця ми працювали разом, я писав і налаштовував бібліотеку GA на синтетичні дані, і він інтегрував їх у свою систему. Потім, одного вихідного, вони пустили його наживо на реальні речі.

Наступного понеділка я отримав ці світиться електронні листи від нього та їх конструктора обладнання, про те, як ніхто не міг повірити в дивовижні результати, знайдені GA. Це було все. Пізніше того ж року продукт потрапив на ринок.

Мені не виплатили жодного цента за це, але я отримав права на хвастощі. З самого початку вони сказали, що вже закінчилися бюджетом, тому я знав, яка угода, перш ніж почати працювати над цим. І це чудова історія для застосувань GA. :)


23
Річ "над бюджетом" - це дуже просто. Звичайно, у них були гроші, щоб заплатити вам, але вони вирішили не робити. Це справді гарно і показує, як великий бізнес може скористатися приємними програмістами.
Мартін Каподічі

50

Я використовував GA для оптимізації завдань для сидіння на весільному прийомі. 80 гостей понад 10 столів. Функція оцінювання ґрунтувалася на тому, щоб люди тримали їхні дати, розміщували людей, що мають щось спільне, та тримали людей з надзвичайно протилежними поглядами за окремими столами.

Я запускав його кілька разів. Кожного разу я отримував дев’ять хороших столів, і один з усіма непарними кулями. Врешті-решт моя дружина виконала завдання для сидіння.

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

Оновлення : Тому що пара людей запитали, як ...

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

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

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


і що це було за нове відображення?
Мануель Араоз

4
@Manuel: Замість того, щоб кодувати тур безпосередньо в "хромосомі", я кодував перетворення, яке перетворює еталонний тур у рішення. Перетворення - це просто свопи між містами в індексі. Тож їх можна рекомбінувати будь-яким старим способом і все одно завжди генерувати тур, який відвідує кожне місто рівно один раз.
Адріан Маккарті

Дякую! Я просто трохи заплутався в аспекті заміни. Кожна хромосома кодує список індексів для обміну - чи це не означає, що індекс може з’являтися не раз у хромосомі?
користувач3019612

1
Хомосома має індекси c1, c2, c3, ..., cn. "Рішення" - це масив a. Ініціалізуйте свій список посилань. Потім для кожної пари індексів у хромосомі поміняйте місцями два елементи в розчині ( temp = a[c1]; a[c1] = a[c2]; a[c2] = temp). Не має значення, якщо два індекси однакові, тому що досі буде містити кожного гостя (або міста) рівно один раз.
Адріан Маккарті

33

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

У нас були дані про кілька десятків (булевих) характеристик транзакції, кожній з яких було надано значення та загальна сума. Якщо загальна сума була перевищує поріг, транзакція була шахрайством. GA створила б велику кількість випадкових наборів значень, оцінила їх за колом відомих даних, відібрала б ті, які отримали найкращі результати (як щодо виявлення шахрайства, так і для обмеження кількості помилкових позитивних результатів), а потім схрещувати породу найкращих з кожне покоління для створення нового покоління кандидатів. Через певну кількість поколінь переможцем визнали кращий набір цінностей.

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

Це виявило переважну більшість шахрайств, які вступили, але не вдалося досягти її нижче 1% щодо найбільш схильних до шахрайства предметів (враховуючи, що 90% вхідних транзакцій може бути шахрайством, що було досить добре).

Я все це робив за допомогою perl. Один запуск програмного забезпечення на досить старому Linux-сервері зайняв би 1-2 години (20 хвилин для завантаження даних по WAN-лінку, решту часу, витраченого на хрускіт). Розмір будь-якого покоління був обмежений доступною оперативною пам’яттю. Я б запускав її знову і знову з невеликими змінами параметрів, шукаючи особливо гарний набір результатів.

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


Я думаю, ти міг би використати нейронну мережу для налаштування параметрів (хоча це буде тривати довше, щоб бути ефективнішим, ніж робити це вручну).
alexpinho98

21

Футбольний типпінг. Я створив систему GA для прогнозування результатів тижня та тижня ігор в AFL (Aussie Rules Football).

Кілька років тому мені набридло стандартний робочий футбольний басейн, всі просто виходили в Інтернеті і брали підбірки від якихось експертів у пресі. Отже, я подумав, що не може бути надто важко перемогти купу спеціальностей журналістики мовлення, правда? Моя перша думка полягала в тому, щоб взяти результати від Massey Ratings, а потім розкрити наприкінці сезону свою стратегію після завоювання слави та слави. Однак з причин, які я ніколи не виявляв, Мессі не відслідковує AFL. Цинізм у мені вважає, що результат кожної гри AFL в основному став випадковим шансом, але мої скарги на останні зміни правил належать на іншому форумі.

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

На практиці система знайде рішення, які б точно передбачили понад 90% результатів минулих ігор. Тоді він би успішно вибирав приблизно 60-80% ігор на наступний тиждень (тобто тиждень, який не є у навчальному наборі).

Результат: трохи вище середини пачки. Жодної великої грошової премії та системи, яку я міг би використати, щоб перемогти Вегас. Це було весело, хоча.

Я будував все з нуля, ніякі рамки не використовували.


21

Окрім деяких поширених проблем, таких як продавець подорожей та варіація програми Mona Lisa Роджера Альсінга , я також написав еволюційний вирішувач судоку (який вимагав трохи більш оригінальної думки з мого боку, а не просто повторне впровадження чужа ідея). Існують більш надійні алгоритми вирішення Sudokus, але еволюційний підхід працює досить добре.

Останні кілька днів я бавився з еволюційною програмою, щоб знайти «холодні колоди» для покеру після перегляду цієї статті на Reddit. Наразі це не зовсім задовільно, але я думаю, що можу це вдосконалити.

У мене є своя структура, яку я використовую для еволюційних алгоритмів.


17

Я розробив домашню вариво GA для 3D-лазерної системи профілю поверхні, яку моя компанія розробила для вантажної галузі ще в 1992 році. Система спиралася на тривимірну триангуляцію та використовувала користувальницький лазерний сканер ліній, 512х512 камери (із власною системою зйомки hw). Відстань між камерою та лазером ніколи не буде точним, і фокусна точка камер не знайдеться в положенні 256 256, яке ви очікували!

Кошмар було спробувати розробити параметри калібрування, використовуючи стандартну геометрію та моделювати рішення рівняння стилю відпалу.

Генетичний алгоритм був збитий ввечері, і я створив калібрувальний куб, щоб перевірити його. Я знав розміри куба з високою точністю, і, таким чином, ідея полягала в тому, що мій GA міг би розробити набір спеціальних параметрів тріангуляції для кожного блоку сканування, який би подолав варіації виробництва.

Трюк спрацював частування. Я був найменш розмовлений! Приблизно через 10 поколінь мій «віртуальний» куб (згенерований із необробленого сканування та відтворений з параметрів калібрування) насправді був схожий на куб! Приблизно через 50 поколінь у мене було необхідне калібрування.


11

Часто складно отримати точне поєднання кольорів, коли ви плануєте фарбувати свій будинок. Часто ви маєте на увазі якийсь колір, але це не один із кольорів, показує вам продавець.

Вчора мій професор, який є дослідником GA, згадав про справжню історію в Німеччині (вибачте, я не маю подальших посилань, так, я можу дізнатись, якщо хтось звернеться до цього). Цей хлопець (давайте назвемо його кольоровим хлопцем ) звичайно ходив із дверей, щоб допомогти людям знайти точний код кольору (у RGB ), який би був шафою, до того, що мав на увазі замовник. Ось як він це зробив:

Колір хлопець використовував носити з собою програмне забезпечення , яке використовується GA. Він починав з 4-х різних кольорів - кожен кодований як кодована хромосома (декодоване значення якої було б значенням RGB). Споживач вибирає 1 з 4 кольорів (який є найближчим до того, про що він / вона має на увазі). Потім програма призначить максимальну придатність цій людині і перейде до наступного покоління за допомогою мутації / кросовера . Наведені вище дії повторюватимуться, поки споживач не знайде точний колір, а потім кольоровий хлопець звик би сказати йому комбінацію RGB!

Присвоюючи максимальну придатність кольорові, що відповідає потребам споживача, програма кольорового хлопця збільшує шанси наближення до кольору, споживач точно має на увазі. Мені це було досить весело!

Тепер, коли я отримав -1, якщо ви плануєте більше -1, pls. з’ясуйте причину цього!


6
Я не збираюся оскаржувати вас, але гадаю, що це тому, що ви цього не зробили самі. ОП спеціально просила речі, які ви зробили самі.
jprete

Це в значній мірі спрощена версія біоморфів Річарда Докінса.
Нік Джонсон

1
Найцікавіше в кольорі те, що ви не можете розглянути його самостійно. Консультанти з кольорів не виявляються лише одним кольором - вони бувають у палітрах та схемах. Немає сенсу просто вибирати один колір самостійно. Я не сказав, але ваша відповідь розтягує визначення GA. Як ви мутуєте / перехрещуєте один колір? Це, чесніше, демонстрація ітеративного звуження обмеженого набору даних.
Кірк Бродхерст

2
Це, можливо, пояснює сутіни: це здається більше схожим на підйом на гірку, а не на GA.
Ерік Норманд

8

Пару тижнів тому я запропонував рішення на SO з використанням генетичних алгоритмів для вирішення задачі компонування графів. Це приклад обмеженої проблеми оптимізації.

Також в області машинного навчання я реалізував на основі GA рамки правил класифікації в c / c ++ з нуля.
Я також використовував GA у зразковому проекті для навчання штучних нейронних мереж (ANN) на відміну від використання відомого алгоритму зворотного розповсюдження .

Крім того, і в рамках моєї аспірантури я використовував GA в навчанні прихованих моделей Маркова як додатковий підхід до базованого на ЕМ алгоритму Баума-Вельча (знову в с / с ++).


Привіт Амро. Ви здійснили повне порівняння між результатами, отриманими за допомогою backprop та GA? Якщо так, чи можете ви поділитися результатами порівняння з нами? Як ви здійснили кросовер крос для двох NN?
lmsasu

@lmsasu: нічого фантазійного: кожна струна або хромосома в сукупності представляє значення ваги та зміщення мережі, і був використаний простий кроссовер на 1 або 2 бали. Як я пам’ятаю, минуло багато часу, щоб мережа потренувалась за допомогою GA. Моя реалізація була скоріше доказом концепції, ніж будь-що інше (дивіться тут на прикладі іграшки щодо контролю віртуальних тральщиків) ... У будь-якому випадку повинно бути багато робіт, які обговорюють використання GA, щоб не тільки вивчити ваги, але й розвиватися. структура мережі.
Amro

8

У рамках моєї студентської ступеня CompSci нам поставили завдання знайти оптимальні прапорці jvm для віртуальної машини дослідження Jikes. Це було оцінено за допомогою набору орієнтирів Dicappo, який повертає час на консоль. Я написав розподілений гентський алогіртм, який перемикав ці прапори, щоб покращити час виконання набору тестів, хоча потрібно було кілька днів, щоб компенсувати апаратне тремтіння, що впливає на результати. Єдина проблема полягала в тому, що я не вивчив належним чином теорію компілятора (що було метою завдання).

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

Редагувати: Також я написав власну структуру генетичного алгоритму в Python для призначення, і просто використав команди popen для запуску різних еталонів, хоча якби це не було оцінене завдання, я би переглянув pyEvolve.


7

По-перше, "Генетичне програмування" Джонатана Коза ( на амазоні ) - це майже книга з генетичного та еволюційного алгоритму / методики програмування, з багатьма прикладами. Я настійно пропоную перевірити це.

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


Серія Koza про GP дуже щільна і, можливо, не для того, хто є новим у GP. Я б запропонував польовий посібник Ріккардо Полі з генетичного програмування (доступний у вигляді безкоштовної копії html) або Вступ до генетичних алгоритмів Мелані Мітчелл
Ніхто

7

Я є частиною команди, яка досліджує використання Evolutionary Computation (EC) для автоматичного виправлення помилок у існуючих програмах. Ми успішно виправили ряд реальних помилок у реальних програмних проектах (див . Домашню сторінку цього проекту ).

У нас є два застосування цієї техніки ремонту ЕС.

  • Перша (інформація про код та відтворення, доступна на сторінці проекту ) розробляє абстрактні синтаксичні дерева, розібрані з існуючих програм C та реалізована в Ocaml за допомогою нашого власного механізму EC.

  • Другий (інформація про код і відтворення, доступна на сторінці проекту ), мій особистий внесок у проект, розвиває збірку x86 або байт-код Java, складений з програм, написаних на декількох мовах програмування. Ця програма реалізована в Clojure, а також використовує власний власноруч побудований двигун EC.

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


6

Я та колега працюємо над рішенням для завантаження вантажу на вантажівки, використовуючи різні критерії, які вимагає наша компанія. Я працював над рішенням генетичного алгоритму, поки він використовує гілку та зв’язану з агресивним обрізанням. Ми все ще перебуваємо в процесі реалізації цього рішення, але поки що ми отримали хороші результати.


5

Кілька років тому я використовував ga's для оптимізації ASR (автоматичного розпізнавання мови) граматики для кращого рівня розпізнавання. Я почав із досить простих списків варіантів (де ga перевіряв комбінації можливих термінів для кожного слоту) і працював над більш відкритими та складними граматиками. Фітнес визначали шляхом вимірювання поділу між термінами / послідовностями за якоюсь фонетичною функцією відстані. Я також експериментував із створенням слабо еквівалентних варіацій граматики, щоб знайти те, що складено для більш компактного подання (врешті-решт, я перейшов до прямого алгоритму, і це різко збільшило розмір "мови", який ми могли використовувати в додатках) .

З недавніх пір я використовував їх як гіпотезу за замовчуванням, проти якої можна перевірити якість рішень, що генеруються за допомогою різних алгоритмів. Це значною мірою пов'язане з категоризацією та різними видами проблем з підхопленням (тобто створення «правила», яке пояснює набір варіантів, які рецензенти роблять за набором даних).


4

Я створив повну рамку GA під назвою "GALAB", щоб вирішити багато проблем:

  • пошук GSM ANT (BTS), щоб зменшити місця перекриття та порожні місця.
  • Планування проекту з обмеженнями ресурсів.
  • Еволюційне створення картини. ( Евопік )
  • Проблема продавця подорожей.
  • Проблеми з N-Queen і N-Color.
  • Лицарська екскурсія та проблеми з Рюкзаком.
  • Чарівний квадрат і головоломки судоку.
  • стиснення рядків, засноване на задачі Superstring.
  • Проблема 2D упаковки.
  • Крихітні штучного життя APP.
  • Рубік-пазл.

Так, його джерело опубліковано під моєю книгою GA .
MShams

4

Я колись використовував GA для оптимізації хеш-функції для адрес пам'яті. Адреси мали розміри сторінок 4K або 8K, тому вони демонстрували деяку передбачуваність у бітовій схемі адреси (найменш значущі біти всі нулі; середні біти регулярно збільшуються тощо). Початкова хеш-функція була "кумедною" - вона мала тенденцію до кластерних звернень на кожне третє відро хешу. Удосконалений алгоритм мав майже ідеальний розподіл.


3

Я не знаю, чи враховується домашнє завдання ...

Під час мого навчання ми розгорнули власну програму для вирішення проблеми мандрівного продавця.

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

Це спрацювало непогано, але нам знадобився певний час, щоб зрозуміти, як правильно виконати фазу "відтворення": моделювання проблеми в щось підходяще для генетичного програмування насправді вразило мене як найважчу частину ...

Це був цікавий курс, оскільки ми також поспілкувалися з нейронними мережами тощо.

Мені хотілося б знати, чи використовував хтось подібне програмування у «виробничому» коді.


3

Я створив простий GA для вилучення корисних зразків із частотного спектру музики під час його відтворення. Вихід був використаний для руху графічних ефектів у плагіні winamp.

  • Вхід: кілька кадрів FFT (уявіть 2D масив плавців)
  • Вихід: значення одного поплавця (зважена сума входів), порогове значення до 0,0 або 1,0
  • Гени: вхідні ваги
  • Фітнес-функція: поєднання робочого циклу, ширини пульсу та БПМ в межах розумного діапазону.

У мене було декілька GA, налаштованих на різні частини спектру, а також різні межі BPM, тому вони не мали тенденції до того, щоб сходитися до тієї ж схеми. Вихідні дані з топ-4 від кожної сукупності були надіслані на механізм візуалізації.

Цікавим побічним ефектом було те, що середня пристосованість серед населення була хорошим показником для зміни музики, хоча, як правило, потрібно було 4-5 секунд, щоб зрозуміти це.


3

У рамках своєї дипломної роботи я написав загальну рамку Java для багатоцільового алгоритму оптимізації mPOEMS (оптимізація мультіоб'єктивного прототипу з розвинутими етапами вдосконалення), що є GA з використанням еволюційних концепцій. Узагальнено таким чином, що всі незалежні від проблеми частини були відокремлені від залежних від проблеми частин, а інтерфейс призначений для використання фреймворку лише додаванням залежних від проблеми частин. Таким чином, той, хто хоче використовувати алгоритм, не повинен починати з нуля, і це полегшує роботу.

Ви можете знайти код тут .

Рішення, які ви можете знайти за допомогою цього алгоритму, порівнювали у науковій роботі з найсучаснішими алгоритмами SPEA-2 та NSGA, і було доведено, що алгоритм працює порівняно або навіть краще, залежно від показників візьміть для вимірювання продуктивності, особливо в залежності від проблеми оптимізації, яку ви шукаєте.

Ви можете знайти його тут .

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

Моя теза, яка застосовує цю рамку до проблеми відбору проектів: http://www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf

Після цього я працював у відділі управління портфелем в одному з Fortune 500, де вони використовували комерційне програмне забезпечення, яке також застосувало GA до проблеми вибору проектів / оптимізації портфеля.

Подальші ресурси:

Документація рамки: http://thomaskremmel.com/mpoems/mpoems_in_java_documentation.pdf

презентаційний документ mPOEMS: http://portal.acm.org/citation.cfm?id=1792634.1792653

Насправді, маючи трохи ентузіазму, кожен міг легко адаптувати код загальної бази до довільної багатообективної проблеми оптимізації.


2

На роботі у мене виникла така проблема: з урахуванням M завдань та N DSP, що було найкращим способом призначення завдань DSP? "Кращий" був визначений як "мінімізація навантаження найбільш завантаженого DSP". Існували різні типи завдань, і різні типи завдань мали різні наслідки щодо продуктивності залежно від місця їх призначення, тому я кодував набір задач DSP-завдання як "рядок ДНК", а потім використовував генетичний алгоритм для "розведення" найкращий рядок призначення, який я міг.

Це спрацювало досить добре (набагато краще, ніж мій попередній метод, який полягав у оцінці кожної можливої ​​комбінації ... на нетривіальні розміри проблеми, на завершення знадобилися б роки!), Єдиною проблемою було те, що не було можливості сказати якщо оптимальне рішення було досягнуто чи ні. Ви могли лише вирішити, чи справді "найкращі зусилля" достатньо хороші, або дозволити йому тривати довше, щоб побачити, чи може це зробити краще.


2

Був конкурс на codechef.com (чудовий сайт, до речі, щомісячні змагання з програмування), де треба було вирішити нерозв’язний судоку (треба підійти якомога ближче з якомога менше неправильних стовпців / рядків / тощо).

Що я б робив, це спершу створити досконалий судоку, а потім замінити поля, які були дані. Виходячи з цієї досить хорошої основи, я використовував генетичне програмування для вдосконалення свого рішення.

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


2

Я використовував простий генетичний алгоритм для оптимізації співвідношення сигнал / шум хвилі, який був представлений у вигляді двійкової струни. Перегортаючи біти певними способами протягом декількох мільйонів поколінь, я зміг створити перетворення, що призвело до більш високого співвідношення сигнал / шум цієї хвилі. Алгоритм міг також бути «імітаційним відпалом», але в цьому випадку він не використовувався. По суті, генетичні алгоритми прості, і це було приблизно таким же простим випадком використання, який я бачив, тому я не використовував рамки для створення та відбору поколінь - лише випадкове насіння та коефіцієнт сигналу до шуму функція під рукою.


2

На семінарі в школі ми розробляємо додаток для створення музики на основі музичного режиму. Програма була побудована на Java, а вихід - файл midi з піснею. Ми використовуємо різні підходи GA для створення музики. Я думаю, що ця програма може бути корисною для вивчення нових композицій.


Чудово, я спробував щось подібне: посилання
Тодор Балабанов

2

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


2

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

З того часу я розвинув ще більше ігрову поведінку. Прикладом програми, яку я нещодавно створив для себе, був генетичний алгоритм вирішення проблеми подорожуючої людини у пошуку маршруту до Великобританії з урахуванням старту та мети, а також однієї / декількох точок з'єднання, затримок, скасування, будівельних робіт, години пік, публічні страйки, врахування між швидкими та найдешевшими маршрутами. Потім надається збалансована рекомендація щодо маршруту, який потрібно пройти в даний день.

Як правило, моя стратегія полягає у використанні представлених генів, заснованих на POJO, тоді я застосовую конкретні реалізації інтерфейсу для відбору, мутації, стратегій кроссовера та точки критеріїв. Моя фітнес функція, в основному, стає досить складною на основі стратегії та критеріїв, які мені потрібно застосувати як евристичний захід.

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

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


1

Я колись намагався зробити комп'ютерний програвач для гри Go, виключно на основі генетичного програмування. Кожна програма буде розглядатися як функція оцінювання послідовності рухів. Вироблені програми були не дуже хорошими, навіть на досить зменшеній платі 3x4.

Я використовував Perl, і сам кодував все. Я б сьогодні робив речі по-іншому.


1

Прочитавши сліпого годинника , я зацікавився програмою «Паскаль», яку Докінз сказав, що він розробив для створення моделей організмів, які могли б розвиватися з часом. Мені було досить цікаво написати власне за допомогою Swarm . Я не зробив усіх фантазійних графічних зображень, які він робив, але мої «хромосоми» контролювали риси, які впливали на здатність організмів виживати. Вони жили в простому світі і могли протистояти один одному та оточенню.

Організми жили чи помирали частково через випадковість, але також ґрунтуючись на тому, наскільки ефективно вони адаптувались до свого місцевого середовища, наскільки добре вони споживали поживні речовини та як успішно відтворювались. Це було весело, але і більше доказів дружині, що я вилюдок.


1

Минуло деякий час тому, але я скотив GA, щоб еволюціонувати, які були фактично ядрами обробки зображень, щоб видалити сліди космічних променів із зображень космічного телескопа Хаббла (HST). Стандартний підхід полягає в тому, щоб знімати декілька експозицій за допомогою Hubble і зберігати лише ті речі, які однакові на всіх зображеннях. Оскільки час HST настільки цінний, що я астрономічний фахівець, і нещодавно відвідував Конгрес з еволюційних обчислень, я думав про те, щоб використовувати GA для очищення одиничних експозицій.

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

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

Використовувані бібліотеки: Якщо я пам'ятаю правильно, IRAF та cfitsio для астрономічної обробки даних зображення та вводу / виводу.


1

Я експериментував з GA в молодості. Я написав тренажер в Python, який працював так.

Гени кодували ваги нейронної мережі.

Входи нейронної мережі були "антенами", які виявляли дотики. Вищі значення означали дуже близько, а 0 - не торкатися.

Виходи були на два "колеса". Якщо обидва колеса йшли вперед, хлопець пішов вперед. Якщо колеса були в протилежних напрямках, хлопець повернувся. Сила виходу визначала швидкість повороту колеса.

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

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

Потім я спарив їх і "розвів", щоб створити наступне покоління. Ймовірність того, що його обрали для розведення, була пропорційна його придатності. Іноді це означало, що когось розводили з собою неодноразово, якщо він мав дуже високу відносну придатність.

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

Однією з особливостей, яку я додав, було введення в гени кольорового вектора для відстеження спорідненості між особинами. Через кілька поколінь всі вони будуть одного кольору, що скаже мені, що я повинен мати кращу стратегію розведення.

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

Я спробував різні речі, як, наприклад, окремий генофонд, який рекомбінували лише через 100 поколінь. Але ніщо не підштовхне їх до кращої стратегії. Можливо, це було неможливо.

Ще одна цікава річ - графік фітнесу з часом. Існували певні закономірності, як, наприклад, максимальний рівень фітнесу знижувався до того, як він підніметься. Я ніколи не бачив, щоб книга про еволюцію говорила про таку можливість.

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