Hallo,
ich habe ein paar Klassen erstellt, mit denen man mit einfachen evolutionären Algorithmen diverse Probleme lösen kann, wie z.B. das 8-Damen-Problem.
Die Handhabung habe ich sehr einfach gehalten.
Eine neue Population erstellt man, indem man eine Instanz der Population_Integer-Klasse erstellt:
Dabei ist
TotalPopulation: Die Anzahl der Individuen in der Klasse
RangeMinimum: Die kleinste Ganzzahl, die in der Genkette (DNA) des Individuums vorkommen kann
RangeMaximum: Die größte Ganzzahl, die in der Genkette vorkommen kann
Mutationrate: Die Mutationsrate, wieviele Gene durchschnittlich mutiert werden
Absolute_Mutationrate: Die Mutationrate, wieviele Individuen durchschnittlich mutiert werden
Chainlength: Die Länge der Genkette, also die Anzahl der Ganzzahlen darin
Fitnessfunction: Die Adresse einer Fitnessfunktion, nach der die Individuen bewertet und selektiert werden. Höhere Werte stehen für eine bessere Fitness, niedrigere Werte für eine schlechtere Fitness
MutationType: Die Art, wie Genmutationen stattfinden
CrossoverType: Die Art, wie die selektierten Individuen miteinander gekreuzt werden
SelectionType: Die Art, nach der die Individuen selektiert werden
ReproductionType: Die Art, wie die alte Generation durch die neue Generation ergänzt/ersetzt wird
Zusätzlich können mit
einzelne Eigenschaften der Mutationsarten eingestellt werden.
Die Fitnessfunktion ist wohl das wichtigste Element. Mit ihr wird die Fitness eines Individuums berechnet, die im Wesentlichen bestimmt, welche Individuen in die neue Generation übernommen werden, welche Individuen gekreuzt werden usw.
Weiter wird mit
eine neue Generation erzeugt.
Beispiel: Eine Genkette ermitteln, deren Summe der einzelnen Gene maximal ist.
1. Eine geeignete Fitnessfunktion erstellen
Nach dieser Fitnessfunktion ist die Summe der einzelnen Gene in der Genkette (Chain) direkt die Fitness des Individuums. Das heisst, ist die Summe größer, ist die Fitness des Individuums größer und es hat eine höhere Wahrscheinlichkeit, fortgepflanzt zu werden. Ist die Summe niedriger, ist auch diese Wahrscheinlichkeit niedriger.
2. Eine Population erstellen
Die Range habe ich von 0 bis 5 festgelegt, die Anzahl der Gene in der Kette auf 5. Die maximale Summe der Gene in der Genkette wäre also, wenn alle Gene die Zahl 5 annehmen würden.
3. 50 Generationen durchlaufen
4. Ausgabe der Genkette des besten Individuums
Lange Rede, kurzer Sinn: mit den Klassen müsst ihr selber experimentieren und es wäre nicht schlecht, etwas Vorwissen beim Thema evolutionäre Algorithmen zu haben. Ansonsten sind die Klassen lange nicht fertig, aber ich möchte mich jetzt mit anderen Arten von Algorithmen beschäftigen, daher entwickle ich das Projekt nicht mehr weiter.
Grüße,
Thilo
Edit: Habe nochmal alles in Option Strict On konvertiert und "böse Funktionen" wie Mid entfernt.
ich habe ein paar Klassen erstellt, mit denen man mit einfachen evolutionären Algorithmen diverse Probleme lösen kann, wie z.B. das 8-Damen-Problem.
Die Handhabung habe ich sehr einfach gehalten.
Eine neue Population erstellt man, indem man eine Instanz der Population_Integer-Klasse erstellt:
VB.NET-Quellcode
- Public Sub New(ByVal Total_Population As Integer,
- ByVal RangeMinimum As Integer,
- ByVal RangeMaximum As Integer,
- ByVal Mutationrate As Double,
- ByVal Absolute_Mutationrate As Double,
- ByVal Chainlength As Integer,
- ByRef Fitnessfunction As Genotype_Integer.FitnessfunctionDelegate,
- Optional ByVal MutationType As MutationTypes = MutationTypes.Random_Resetting,
- Optional ByVal CrossoverType As CrossoverTypes = CrossoverTypes.One_Point,
- Optional ByVal SelectionType As SelectionTypes = SelectionTypes.Rangbased,
- Optional ByVal ReproductionType As ReproductionTypes = ReproductionTypes.Steady_State_Replace_Worst)
Dabei ist
TotalPopulation: Die Anzahl der Individuen in der Klasse
RangeMinimum: Die kleinste Ganzzahl, die in der Genkette (DNA) des Individuums vorkommen kann
RangeMaximum: Die größte Ganzzahl, die in der Genkette vorkommen kann
Mutationrate: Die Mutationsrate, wieviele Gene durchschnittlich mutiert werden
Absolute_Mutationrate: Die Mutationrate, wieviele Individuen durchschnittlich mutiert werden
Chainlength: Die Länge der Genkette, also die Anzahl der Ganzzahlen darin
Fitnessfunction: Die Adresse einer Fitnessfunktion, nach der die Individuen bewertet und selektiert werden. Höhere Werte stehen für eine bessere Fitness, niedrigere Werte für eine schlechtere Fitness
MutationType: Die Art, wie Genmutationen stattfinden
CrossoverType: Die Art, wie die selektierten Individuen miteinander gekreuzt werden
SelectionType: Die Art, nach der die Individuen selektiert werden
ReproductionType: Die Art, wie die alte Generation durch die neue Generation ergänzt/ersetzt wird
Zusätzlich können mit
einzelne Eigenschaften der Mutationsarten eingestellt werden.
Die Fitnessfunktion ist wohl das wichtigste Element. Mit ihr wird die Fitness eines Individuums berechnet, die im Wesentlichen bestimmt, welche Individuen in die neue Generation übernommen werden, welche Individuen gekreuzt werden usw.
Weiter wird mit
eine neue Generation erzeugt.
Beispiel: Eine Genkette ermitteln, deren Summe der einzelnen Gene maximal ist.
1. Eine geeignete Fitnessfunktion erstellen
Nach dieser Fitnessfunktion ist die Summe der einzelnen Gene in der Genkette (Chain) direkt die Fitness des Individuums. Das heisst, ist die Summe größer, ist die Fitness des Individuums größer und es hat eine höhere Wahrscheinlichkeit, fortgepflanzt zu werden. Ist die Summe niedriger, ist auch diese Wahrscheinlichkeit niedriger.
2. Eine Population erstellen
VB.NET-Quellcode
- Dim Population As Population_Integer = New Population_Integer(100, 0, 5, 0.25, 1.0, 5,
- AddressOf Fitnessfunction,
- Population_Integer.MutationTypes.Random_Resetting,
- Population_Integer.CrossoverTypes.One_Point,
- Population_Integer.SelectionTypes.Rangbased,
- Population_Integer.ReproductionTypes.Steady_State_Replace_Worst)
Die Range habe ich von 0 bis 5 festgelegt, die Anzahl der Gene in der Kette auf 5. Die maximale Summe der Gene in der Genkette wäre also, wenn alle Gene die Zahl 5 annehmen würden.
3. 50 Generationen durchlaufen
4. Ausgabe der Genkette des besten Individuums
Lange Rede, kurzer Sinn: mit den Klassen müsst ihr selber experimentieren und es wäre nicht schlecht, etwas Vorwissen beim Thema evolutionäre Algorithmen zu haben. Ansonsten sind die Klassen lange nicht fertig, aber ich möchte mich jetzt mit anderen Arten von Algorithmen beschäftigen, daher entwickle ich das Projekt nicht mehr weiter.
Grüße,
Thilo
Edit: Habe nochmal alles in Option Strict On konvertiert und "böse Funktionen" wie Mid entfernt.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thilo87“ ()