# Генетски алгоритми ## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ai/quiz/41) **Генетски алгоритми** (GA) засновани су на **еволуционарном приступу** вештачкој интелигенцији, где се методе еволуције популације користе за добијање оптималног решења за одређени проблем. Предложио их је 1975. године [Џон Хенри Холанд](https://wikipedia.org/wiki/John_Henry_Holland). Генетски алгоритми се заснивају на следећим идејама: * Валидна решења проблема могу се представити као **гени** * **Укрштање** нам омогућава да комбинујемо два решења како бисмо добили ново валидно решење * **Селекција** се користи за избор оптималнијих решења помоћу неке **функције прилагођености** * **Мутације** се уводе ради дестабилизације оптимизације и изласка из локалног минимума Ако желите да имплементирате генетски алгоритам, потребно је следеће: * Пронаћи метод за кодирање решења проблема помоћу **гена** g∈Γ * На скупу гена Γ дефинисати **функцију прилагођености** fit: Γ→**R**. Мање вредности функције одговарају бољим решењима. * Дефинисати механизам **укрштања** за комбиновање два гена како би се добило ново валидно решење crossover: Γ2→Γ. * Дефинисати механизам **мутације** mutate: Γ→Γ. У многим случајевима, алгоритми за укрштање и мутацију су прилично једноставни за манипулацију генима као нумеричким низовима или бит-векторима. Специфична имплементација генетског алгоритма може се разликовати од случаја до случаја, али општа структура је следећа: 1. Изабрати почетну популацију G⊂Γ 2. Насумично изабрати једну од операција која ће се извршити у овом кораку: укрштање или мутација 3. **Укрштање**: * Насумично изабрати два гена g1, g2 ∈ G * Израчунати укрштање g=crossover(g1,g2) * Ако fit(g)1) или fit(g)2) - заменити одговарајући ген у популацији са g. 4. **Мутација** - изабрати насумичан ген g∈G и заменити га са mutate(g) 5. Поновити од корака 2, док не добијемо довољно малу вредност fit, или док се не достигне ограничење броја корака. ## Типични задаци Задаци који се обично решавају генетским алгоритмима укључују: 1. Оптимизацију распореда 1. Оптимално паковање 1. Оптимално сечење 1. Убрзавање исцрпне претраге ## ✍️ Вежбе: Генетски алгоритми Наставите учење у следећим нотебуцима: Идите на [овај нотебук](Genetic.ipynb) да видите два примера коришћења генетских алгоритама: 1. Праведна подела блага 1. Проблем 8 краљица ## Закључак Генетски алгоритми се користе за решавање многих проблема, укључујући логистичке и претраживачке проблеме. Ова област је инспирисана истраживањима која су спојила теме из психологије и рачунарских наука. ## 🚀 Изазов "Генетски алгоритми су једноставни за имплементацију, али је њихово понашање тешко разумети." [извор](https://wikipedia.org/wiki/Genetic_algorithm) Урадите истраживање да пронађете имплементацију генетског алгоритма, као што је решавање Судоку загонетке, и објасните како функционише као скица или дијаграм тока. ## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ai/quiz/42) ## Преглед и самостално учење Погледајте [овај одличан видео](https://www.youtube.com/watch?v=qv6UVOQ0F44) који говори о томе како рачунар може научити да игра Супер Марио користећи неуронске мреже обучене генетским алгоритмима. Више ћемо научити о томе како рачунар учи да игра игре [у следећем одељку](../22-DeepRL/README.md). ## [Задатак: Диофантска једначина](Diophantine.ipynb) Ваш циљ је да решите такозвану **Диофантску једначину** - једначину са целобројним коренима. На пример, размотрите једначину a+2b+3c+4d=30. Потребно је пронаћи целобројне корене који задовољавају ову једначину. *Овај задатак је инспирисан [овим постом](https://habr.com/post/128704/).* Савети: 1. Можете разматрати корене у интервалу [0;30] 1. Као ген, размотрите коришћење листе вредности корена Користите [Diophantine.ipynb](Diophantine.ipynb) као почетну тачку. ---