Genetické algoritmy jsou typem evolučních algoritmů, algoritmů jež jsou inspirovány evolučními procesy v přírodě. Jedná se o iterativní algoritmy, které v každé iteraci zlepšují množinu řešení (populaci) pomocí operací selekce, křížení, nebo mutace. Výhodou těchto algoritmů, je jejich nezávislost na typu problému. Jedinou jejich znalostí je výpočet fitness funkce, která reprezentuje kvalitu řešení (potomka).
Pro řešení jsme zvolil Generational metodu genetického algoritmu, tedy metodu, které v každé iteraci generuje novou populaci. Její princip naznačuje následující pseudokód a popis fází algoritmu.
Pseudokód:
Fitness, neboli kondice genotypu, určuje kvalitu řešení. V případě problému batohu je to cena věcí v batohu s podmínkou překročení váhy. V případě překročení váhy je kondice nejhorší možná.
Pro selekci jsem implementoval metodu náhodného výběru a metodu turnaje. Použil jsem nakonec pouze metodu turnaje.
Implementoval jsem jednobodové a dvoubodové křížení. Při křižení dvou genomů se 50% pravděpodobností uskuteční jednobodové křížení a s 50% pravděpodobností dvoubodové křížení.
Každý gen genomu zmutuje s pravděpodobností, jež lze parametricky určit.
Windows Server 2008 EE x64, Intel Core2 Duo E8500@3.16GHz, 8 GB DDR2
S velikostí instance roste i výpočetní čas. Podle očekávání výpočetní čas roste s velikostí instance lineárně.
iterace | 5 | 10 | 15 | 20 | 25 | 40 | 50 |
---|---|---|---|---|---|---|---|
cas | 18 | 43 | 57 | 81 | 102 | 156 | 188 |
Podle očekávání čas výpočtu roste lineárně i s počtem iterací.
iterace | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 50 |
---|---|---|---|---|---|---|---|---|
chyba | 8.14% | 4.42% | 2.88% | 1.56% | 1.29% | 1.35% | 1.22% | 1.28% |
Jak je patrné z grafu, se zvyšujícím se počtem iterací, exponencielně klásá relativní chyba řešení. Po určitém počtu iterací se již řešení nezlepšuje, tento počet iterací je ideální pro výchozí konfiguraci. V tomto případě ustálení nastává po 25 iteracích.
populace | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
---|---|---|---|---|---|---|---|---|---|---|
cas | 5 | 15 | 39 | 64 | 96 | 129 | 182 | 234 | 282 | 346 |
Stejně jako u velikosti instance, nebo počtu iterací i s velikostí populace roste čas výpočtu lineárně.
populace | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
---|---|---|---|---|---|---|---|---|---|---|
chyba | 9.79% | 4.25% | 2.64% | 1.61% | 1.03% | 1.33% | 1.22% | 1.38% | 1.03% | 1.18% |
Stejně jako s rostoucím počtem iterací, tak i se zvětšující se populací, exponencielně klesá relativní chyba. Ustálení nastalo u populace čítající 50 genomů.
p | 0.01 | 0.02 | 0.03 | 0.04 | 0.05 | 0.06 | 0.07 | 0.08 | 0.09 | 0.1 |
---|---|---|---|---|---|---|---|---|---|---|
chyba | 6.26% | 3.43% | 1.72% | 1.35% | 1.20% | 1.24% | 1.54% | 2.03% | 2.95% | 4.48% |
Relativní chyba s nárůstajícím počtem mutací do určité hodnoty klesá, pak ale začne opět výrazně stoupat. Dosažené minimum je ideální pro výchozí nastavení genetického algoritmu pro tento problém.
p | 0.2 | 0.4 | 0.6 | 0.8 | 1 |
---|---|---|---|---|---|
chyba | 1.45% | 1.28% | 1.44% | 1.20% | 1.45% |
Z grafu není patrná žádná závislost relativní chyby na pravděpodobnosti křížení. Narozdíl od pravděpodobnosti mutace, pravděpodobnost křížení neměla na relativní chybu příliš velký vliv v celém svém rozsahu.
Čas výpočtu roste s velikostí instance, velikostí populace a počtem iterací lineárně. Genetický algoritmus lze tedy použít na velké instance s lineárně rostoucími požadavky na výpočetní výkon.
Z experimentu vyplývá, že relativní chyba klesá s počtem iterací do určité hranice, kde se už řešení nezlepšuje. Stejně tak klesá relativní chyba i s velikostí populace až se zastaví a dál zvětšování populace nezlepšuje výsledek. Zajímavé chování vykazuje algoritmus v závislosti na pravděpodobnosti mutace, kdy hodnota relativní chyby klesá do určité hodnoty, kde se zastaví a pak opět roste. Ukazuje se, že je to jeden z parametrů, na který je genetický algoritmus nejvíce citlivý. Naopak pravděpodobnost křížení neměla výrazný vliv na výslednou relativní chybu.
Experimentální nastavení GA s nejlepšími výsledky
S tímto nastavením dosahoval algoritmus nejmenší relativní chyby a to pod 1,5%, což lze považovat za velmi dobrý výsledek.