Neat (Neurone evolution of augmenting topologies) Allows neural networks to evolve both their topologies and weights.
$ dotnet add package DotNETNEATInstalování balíčku:
dotnet add package DotNETNEAT --version 1.0.0
//Creating a logger for console.
Action<ILoggingBuilder> action = (
builder => _ = builder.AddConsole().SetMinimumLevel(LogLevel.Information));
var log = LoggerFactory.Create(action);
List<double> input = new List<double>();
//Add random values to list
for (int i = 0; i < 10; i++)
{
Random random = new Random();
var num = random.NextDouble();
input.Add(num);
}
Console.ReadLine();
//Building neat
var b = new NeatBuilder().AddLogger(action).
//solves this easy problem almost instantly due fully connected individuals
//.SetInitialConnection(GenomeInitialConnection.Full)
SetInitialConnectin(GenomeInitialConnection.Random).
SetCrossOverMutationProbability(0.1).SetMutationProbabilityNewConnection(0.1)
.SetMutationProbabilityWeightShift(0.1).SetMutationProbabilityNewNode(0.1);
//Definition of a "fitness" function
Action<Individual> individualEvaluator = individual =>
{
var temp = individual.Calculate(input);
var score = temp[0];
individual.Fitness = score;
};
using (NEAT neat = b.Build())
{
neat.Run(input.Count, 1, 150, 150, individualEvaluator);
Console.WriteLine($"Best individual {neat.BestIndividual!.Fitness}");
}
Statická tříta obsahuje statické delegáty na známe aktivační funkce se vstupním parametrem "x".
$Sigmoid(x) = \frac{1}{1+e^{-x}}$
$ReLu(x) = \max(0, x)$
$Tanh(x) = \tanh(x)$
$Linear(x) = x$
Vrátí příslušný delegát na funkci z výčtového typu
Výčtový typ obsahující aktivační funkce, které jsou implementované v knihovně. Zatím to jsou Sigmoid, ReLu, Tanh a Linear.
Internal builder třída, obsahující metody, které jsou potřeba pro vytvoření instance ConnectionGene
Defaultní instance má nastavený logger z konstruktoru, váhu hrany nastavenou na 1, inovační čostlo na 0 a hrana je aktivovaná.
Změní stav aktivace hrany
Přidá inovační číslo ke stavěné hraně.
Upravý váhu stavěné hrany.
Postavý a vrátí hranu s parametry v buildru a tato hrana vede od from do toGene.
Internal třída, která slouží pro stavění Genomů.
Přidá genomu uživatelsky definovanou aktivační funkci.
Postavý genon s parametry daný v buildru.
Vytvoří nový list s geny specifikovaný v argumentu této funkce.
Přidá geny k již existujicím vrcholům, pokud neexistují vytvoří se znova.
Nastaví počáteční spojení stavěného genomu.
Pomocí NeatBuilderu si nastaví různe parametry pro celkový Neat algoritmus.
Nastaví novou pravděpodobnost pro vytvoření nového spojení v Genomu.
Nastaví novou pravděpodobnost pro vytvoření nového vrcholu.
Nastaví novou pravděpodobnost pro posunu váhy hrany.
Nastaví novou pravděpodobnost pro zvolení váhy hrany náhodně.
Nastaví novou pravděpodobnost pro aktivaci nebo deaktivaci hrany.
Nastaví novou pravděpodobnost pro mutaci genomů.
Postaví Celý Neat s parametry zvolené v Builderu.
Nastaví počáteční spojené genomů.
Nastaví logger pro logování v Neatu.
Nastaví uživatelsky definovanou aktivační funkci.
Nastaví aktivační funkce.
Zjistí jestli hodnota je pravděpodobnost čili jestli je hodnota mezi 0-1 včetně mezí.
Pomocí nodeGeneBuilderu nastavujeme parametry pro vytvoření genů v Neatu.
Nastaví číslo spojení pro genu. Tato hodnota určuje pozici genu v Genomu, podle kterého se pak počítá fitness celého genomu.
Nastaví inovační číslo genu. Toto číslo říká pořadí vytvořeného genomu.
Nastaví typ genomu.
Postaví genom s parametry uvedené v builderovi.
Abstraktní třída pro určená pro lehčí vytváření builderů.
Určuje orientovanou hranu v sítí. Obsahuje stav jestli je aktivní, váhu a informaci z jakého vrcholu vede a do jakého vrcholu vede.
Změní aktivaci hrany.
Nastaví aktivace hrany na stav.
Rozšiřuje třídu Connection inovační třídu a spojení vede mezi NodeGene místo Gene. Obsahuje inovační číslo hrany.
Vytvoří novou instanci ConnectionGene se stejnými parametry.
Výjimka která se má vyhazovat, když proběhne pokus postavení hrany na mezi 2 stejnými vrcholy.
Výjimka, která vznikne, pokud uživatel zadá jiný počet vstupní nebo výstupní vrstvy než je v NEATu potřeba.
Vyhodí výjimku argumentOutOfRange když hodnota v argumentu je menší nebo rovno nule
Pokus o přístup k prvkům neatu bez spuštění algoritmu NEAT.
Ze vznikhlého spojení vrátí vrchol tuple (from, to).
Vrátí náhodný prvek z IListu nebo default pokud list je prázdný.
Vrátí vážený náhodný druh.
Genome je sít s vrcholy a hrany.
Spočítá jak moc se strukutra this genomu a druhého liší. Algoritmus:
1)Uspořádají se hrany genomů podle inovačních čísel.
2)Pokud se inovační čísla hran rovnaji, tak vážený průměr je absolutní hodnota váh hrany.
3) Pokud inovační číslo hrany prvního genomu je vetší než inovační číslo hrany druhého genomu, tak se podíváme na další hranu druhého genomu.
4) Jinak posuneme hranu prvního genomu
5) Vrať vzdálenost genomů
Kde vzdálenost genomů je $$ \delta = \frac{c_1 \cdot E}{N} + \frac{c_2 \cdot D}{N} + W $$ a c1 je ExcessFactor, c2 je disjointFactor W je vážený průměr rozdílu vhodných genů, E je počet přebytkových genů, D je počet disjunktivních prvků a N je maximální velikost hran prvního a druhého genomu.
1)Pro každou hranu x a y se podíváme na inovační číslo, pokud jsou stejné, tato hrana bude i v potomku.
2) Pokud hrana v x má větší inov. číslo než y, tak se posune index pouze u x
3) jinak posuň index u y.
Provede mutaco celého genomu. Konkrétně
Vytvoří nový vrchol tak, že vybere náhodnou hranu pokud existuje. Mezi 2 vrcholy této hrany vytvoří nový vrchol. Původní hranu smaže, první čast podrozdělené hrany má defaultní parametry, druhá část má vlastnosti smazané hrany.
Aktivuje nebo deaktivuje hranu.
Přičte faktor k k náhodný hraně
K dosut nespojeným 2 vrcholům vytvoří nové spojení.
Náhodné hraně z genomu změní váhu na RandomWeight faktor.
Podle typu configu vytvoří počáteční spojení vrcholů v genomu.
Spojí všechny vrcholy s každým.
Spojý vrcholy náhodně
Pomocná datová strukura. Je to kombinace listu a hashsetu. Umožňuje rychlý přístup přes hash kód a zároveň přes index.
Slouží pro vyhodnocování sítě v jedinci. Při inicializi rozdělí genom na vstupní, skryté a výstupní vrstvy. Skrité vrstvy jsou seřazený vzestupně podle connection order.
Spočte setřízenou sít.
Jedná se o wrapper Genomu. Obsahuje fitness, do jakého druhu patří.
Nastaví do jakého druhu tento jedinec patří.
Vygeneruje novou kalkulačku, protože se sít genomu směnila po růzých mutací.
Vypočte fitness jedince.
Wrapper funkce pro distance genomu.
Wrapper funkce pro křížení genomů v jedinci.
Pokusí se přidat tohoto jedince do náhodného druhu. Vrátí True pokud byl tento jedinec úspěšně přidaný.
Interface pro SetList. Obsahuje metody pro získání HashSet a listu.
Reprezentuje druh v Neatu. Každý druh je reprezentován přes jedince.
Pokud je vzdálenost jedince a reprezentanta tohoto druhu menší než rozdíl povolené vzdálenosti zadané od uživatelem, tak je jedinec přidaný a vrátí True.
Přidá jedince do druhu bez kontroli vzdálenosti s reprezentantem.
Tento druh zahyne, tedy se pro všechny jedince nastaví druh na null.
Ohodnotí fitness celkové populace
Vybere se náhodný jedinec z populace, ten bude reprezentant a zbytek jedinců z této populace se nastaví na null.
Zabije 1 - keepPercentage jedinců
vybere 2 náhodné jedince z druhu pokud neexistujou vezme se reprezentant. Tyto náhodné jedince rozmnoží.
Interface pro geny v neatu.
Vrchol v síti. Obsahuje výstupní hodnotu vrcholu, množinu hran se kterýma je spojený, Uvažuji pouze spětné hrany.
Spočte výstup pro daný vrchol. Přes aktivační funkci
Abstraktní třída pro vrchol. Obsahuje Typ vrcholu, spojení.
Reprezentuje Vrchol genu. Dědí od Node, obsahuje inovační číslo a má overridnuté metody pro rovnáse, hash a rovnost.
Výčtový typ pro reprezentaci Typu vrcholu. Konkrétně
Hlavní třída se kterou uživatel operuje. Lze zkonstruovat pouze přes NeatBuilderu. Obsahuje pravděpodobnosti mutací, hodnoty faktorů a parametrů pro síť.
Vytvoří nový NodeGene s hodnotama v argumentu.
Pokusí se vytvořit nový node gene. Pokud takový nodeGene který ma stejný from a to gene, tak nevytvoří nový nodegene s novým inovačním číslem, ale vrátí nový nodegene s korespondujícím inovačním číslem, jinak vytvoří nový node gene s novým inovačním číslem.
Vytvoří nový prázdný genome.
Vytvoří nový spojení mezi vrcholy.
Spustí algoritmus neatu.
Začne počáteční populaci
Evaluace
Selekce
Crossover
Mutace
Speciation
Opakuj
Vygeneruje druhy v neatu.
Ohodnotí druhy.
Pokusí se najít druh pro jedince, vrátí false pokud nebyl nalezen.
Zredukuje populaci na velikost určenou uživatelem.
Odstraní druhy, které mají nejvýše 1 jedince.
Rozmnoží všechny jedince v neatu.
Vyhodnotí všechny jedince, následně je vyvine.
Vrátí všechny jednotlivce v neatu. Pokud je tato metoda zavolaná před spuštěním NEAT.run, tak se vyhodí výjimka NeatNotRunException.
Pomocné funkce pro počítání statistiky NEAT.cs
Spočte průměr jedinců v populaci.
Z průměru jedinců a jedinců spočte čtvercový rozdíl
Z průměru jedinců a jednotlivů a vrátí odchylku.
Výčtový typ pro konfigurace počátečního genomu.
Interface pro snadnější logování informací v neatu