Evolutionärer Algorithmus und 8-Damen-Problem lösen

    • VB.NET

    Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

      Evolutionärer Algorithmus und 8-Damen-Problem lösen

      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:

      VB.NET-Quellcode

      1. Public Sub New(ByVal Total_Population As Integer,
      2. ByVal RangeMinimum As Integer,
      3. ByVal RangeMaximum As Integer,
      4. ByVal Mutationrate As Double,
      5. ByVal Absolute_Mutationrate As Double,
      6. ByVal Chainlength As Integer,
      7. ByRef Fitnessfunction As Genotype_Integer.FitnessfunctionDelegate,
      8. Optional ByVal MutationType As MutationTypes = MutationTypes.Random_Resetting,
      9. Optional ByVal CrossoverType As CrossoverTypes = CrossoverTypes.One_Point,
      10. Optional ByVal SelectionType As SelectionTypes = SelectionTypes.Rangbased,
      11. 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

      VB.NET-Quellcode

      1. Public Sub SetProperties_Of_MutationType_Creep(ByVal Minimal_Alteration As Double, ByVal Maximal_Alteration As Double)
      2. Public Sub SetProperties_Of_MutationType_Swap(ByVal n As Integer)
      3. Public Sub SetProperties_Of_MutationType_Insert(ByVal n As Integer)


      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.

      VB.NET-Quellcode

      1. Public Delegate Function FitnessfunctionDelegate(ByVal Chain As Integer()) As Integer



      Weiter wird mit

      VB.NET-Quellcode

      1. Population_Integer.StepForward()


      eine neue Generation erzeugt.



      Beispiel: Eine Genkette ermitteln, deren Summe der einzelnen Gene maximal ist.

      1. Eine geeignete Fitnessfunktion erstellen

      VB.NET-Quellcode

      1. Public Function Fitnessfunction(ByVal Chain() As Integer) As Integer
      2. Return Chain.Sum
      3. End Function


      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

      1. Dim Population As Population_Integer = New Population_Integer(100, 0, 5, 0.25, 1.0, 5,
      2. AddressOf Fitnessfunction,
      3. Population_Integer.MutationTypes.Random_Resetting,
      4. Population_Integer.CrossoverTypes.One_Point,
      5. Population_Integer.SelectionTypes.Rangbased,
      6. 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

      VB.NET-Quellcode

      1. For i As Integer = 0 To 49
      2. Population.StepForward()
      3. Next



      4. Ausgabe der Genkette des besten Individuums

      VB.NET-Quellcode

      1. MsgBox(Population.Individual(0).ToString)
      2. ' Ausgabe: 5|5|5|5|5



      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.
      Dateien

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thilo87“ ()

      sonne75 schrieb:

      Ist eine 2012 Version
      SLN-File editieren, Studio-Version anpassen,
      ggf. vbproj-File öffnen, .NET-Framework anpassen.
      Wenn das alles nicht geht, ein neues Projekt anlegen und die Source-Files rüber kopieren.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      Downgraded auf 2010.

      Aber die String-Verarbeitung ist auffm Stand von VB6 (gugge böse Funktionen), und geproggt isses mit Option Strict Off.
      Dateien

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()