Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 71 additions & 74 deletions BlueM.Opt/Algos/ES/ESController.vb

Large diffs are not rendered by default.

108 changes: 54 additions & 54 deletions BlueM.Opt/Algos/ES/Functions.vb
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@
Imports BlueM.Opt.Common

''' <summary>
''' Wird derzeit für das NDSorting verwendet um es für die verschiedenen Kerne anwenden zu können
''' Wird derzeit für das NDSorting verwendet um es für die verschiedenen Kerne anwenden zu können
''' </summary>
Public Class Functions

'Die Statische Variablen werden im Konstruktor übergeben
'Die Statische Variablen werden im Konstruktor übergeben
'*******************************************************
Dim mProblem As BlueM.Opt.Common.Problem
Dim mProblem As Problem
Dim NNachf As Integer
Dim NEltern As Integer
Dim isSekPopBegrenzung As Boolean
Expand All @@ -34,9 +34,9 @@ Public Class Functions
Dim iAktGen As Integer
Dim iAktPop As Integer

'Die Statische Variablen werden im Konstruktor übergeben
'Die Statische Variablen werden im Konstruktor übergeben
'*******************************************************
Public Sub New(ByRef prob As BlueM.Opt.Common.Problem, ByVal _NNachf As Integer, ByVal _NEltern As Integer, ByVal _isSekPopBegrenzung As Boolean, ByVal _NMaxMemberSekPop As Integer, ByVal _NInteract As Integer, ByVal _isInteract As Boolean, ByVal _iAktGen As Integer)
Public Sub New(ByRef prob As Problem, ByVal _NNachf As Integer, ByVal _NEltern As Integer, ByVal _isSekPopBegrenzung As Boolean, ByVal _NMaxMemberSekPop As Integer, ByVal _NInteract As Integer, ByVal _isInteract As Boolean, ByVal _iAktGen As Integer)

mProblem = prob
NNachf = _NNachf
Expand All @@ -49,12 +49,12 @@ Public Class Functions

End Sub

'Dieser Teil beschäftigt sich nur mit SekundärQb und NDSorting
'Dieser Teil beschäftigt sich nur mit SekundärQb und NDSorting
'2. Die einzelnen Fronten werden bestimmt
'3. Der Bestwertspeicher wird entsprechend der Fronten oder der sekundären Population gefüllt
'4: Sekundäre Population wird bestimmt und gespeichert
'3. Der Bestwertspeicher wird entsprechend der Fronten oder der sekundären Population gefüllt
'4: Sekundäre Population wird bestimmt und gespeichert
'--------------------------------------------------------------------------------------------
Public Sub EsEltern_Pareto(ByVal NDSorting() As Individuum, ByRef SekundärQb() As Individuum, ByRef Best() As Individuum)
Public Sub EsEltern_Pareto(ByVal NDSorting() As Individuum, ByRef SekundärQb() As Individuum, ByRef Best() As Individuum)

Dim i As Integer
Dim NFrontMember_aktuell As Integer
Expand All @@ -75,25 +75,25 @@ Public Class Functions
'NDSorting wird in Temp kopiert
Temp = Individuum.Clone_Indi_Array(NDSorting)

'Schleife läuft über die Zahl der Fronten die hier auch bestimmt werden
'Schleife läuft über die Zahl der Fronten die hier auch bestimmt werden
Do
'Entscheidet welche Werte dominiert werden und welche nicht
Call Pareto_Non_Dominated_Sorting(Temp, rang)
'Nach Dominanz sortieren
NFrontMember_aktuell = Pareto_Non_Dominated_Count_and_Sort(Temp)
'Array umdrehen, weil wir die nicht dominanten Lösungen oben haben wollen
'Array umdrehen, weil wir die nicht dominanten Lösungen oben haben wollen
Call Array.Reverse(Temp)
'NFrontMember_aktuell: Anzahl der Mitglieder der gerade bestimmten Front
'NFrontMember_gesamt: Alle bisher als nicht dominiert klassifizierten Individuum
NFrontMember_gesamt += NFrontMember_aktuell
'Hier wird pro durchlauf die nicht dominierte Front in NDSResult geschaufelt
'und die bereits klassifizierten Lösungen aus Temp Array gelöscht
'und die bereits klassifizierten Lösungen aus Temp Array gelöscht
Call Pareto_Non_Dominated_Result(Temp, NDSResult, NFrontMember_aktuell, NFrontMember_gesamt)
'Rang ist hier die Nummer der Front
rang += 1
Loop While Not (NFrontMember_gesamt = NEltern + NNachf)

'3. Der Bestwertspeicher wird entsprechend der Fronten oder der sekundären Population gefüllt
'3. Der Bestwertspeicher wird entsprechend der Fronten oder der sekundären Population gefüllt
'--------------------------------------------------------------------------------------------
NFrontMember_aktuell = 0
NFrontMember_gesamt = 0
Expand All @@ -102,8 +102,8 @@ Public Class Functions
Do
NFrontMember_aktuell = Pareto_Count_Front_Members(aktuelle_Front, NDSResult)

'Es sind mehr Elterplätze für die nächste Generation verfügaber
'-> schiss wird einfach rüberkopiert
'Es sind mehr Elterplätze für die nächste Generation verfügaber
'-> schiss wird einfach rüberkopiert
If NFrontMember_aktuell <= NEltern - NFrontMember_gesamt Then
For i = NFrontMember_gesamt To NFrontMember_aktuell + NFrontMember_gesamt - 1

Expand All @@ -114,8 +114,8 @@ Public Class Functions
NFrontMember_gesamt = NFrontMember_gesamt + NFrontMember_aktuell

Else
'Es sind weniger Elterplätze für die nächste Generation verfügber
'als Mitglieder der aktuellen Front. Nur für diesen Rest wird crowding distance
'Es sind weniger Elterplätze für die nächste Generation verfügber
'als Mitglieder der aktuellen Front. Nur für diesen Rest wird crowding distance
'gemacht um zu bestimmen wer noch mitspielen darf und wer noch a biserl was druff hat
Call Pareto_Crowding_Distance_Sort(NDSResult, NFrontMember_gesamt, NFrontMember_gesamt + NFrontMember_aktuell - 1)

Expand All @@ -132,22 +132,22 @@ Public Class Functions

Loop While Not (NFrontMember_gesamt = NEltern)

'4: Sekundäre Population wird aktualisiert
'4: Sekundäre Population wird aktualisiert
'-----------------------------------------
Call SekundärQb_Allocation(NDSResult, SekundärQb)
Call SekundärQb_Allocation(NDSResult, SekundärQb)

'Prüfen, ob die Population jetzt mit Mitgliedern aus der Sekundären Population aufgefüllt werden soll
'Prüfen, ob die Population jetzt mit Mitgliedern aus der Sekundären Population aufgefüllt werden soll
'----------------------------------------------------------------------------------------------------

If NInteract > 0 And isInteract Then
If (iAktGen Mod NInteract) = 0 Then
NFrontMember_aktuell = Pareto_Count_Front_Members(1, SekundärQb)
NFrontMember_aktuell = Pareto_Count_Front_Members(1, SekundärQb)
If NFrontMember_aktuell > NEltern Then
'Crowding Distance
Call Pareto_Crowding_Distance_Sort(SekundärQb, 0, SekundärQb.GetUpperBound(0))
'Anzahl Eltern wird aus SekundärQb in den Bestwertspeicher kopiert
Call Pareto_Crowding_Distance_Sort(SekundärQb, 0, SekundärQb.GetUpperBound(0))
'Anzahl Eltern wird aus SekundärQb in den Bestwertspeicher kopiert
For i = 0 To NEltern - 1
Best(i) = SekundärQb(i).Clone()
Best(i) = SekundärQb(i).Clone()
Next i
End If
End If
Expand All @@ -168,17 +168,17 @@ Public Class Functions
For i = 0 To NDSorting.GetUpperBound(0)
For j = 0 To NDSorting.GetUpperBound(0)

'Überpüfen, ob NDSorting(j) von NDSorting(i) dominiert wird
'Überpüfen, ob NDSorting(j) von NDSorting(i) dominiert wird
'----------------------------------------------------------
If (NDSorting(i).Is_Feasible And Not NDSorting(j).Is_Feasible) Then

'i gültig und j ungültig
'i gültig und j ungültig
'-----------------------
NDSorting(j).dominated = True

ElseIf ((Not NDSorting(i).Is_Feasible) And (Not NDSorting(j).Is_Feasible)) Then

'beide ungültig
'beide ungültig
'--------------
Summe_Constrain(0) = 0
Summe_Constrain(1) = 0
Expand All @@ -198,7 +198,7 @@ Public Class Functions

ElseIf (NDSorting(i).Is_Feasible And NDSorting(j).Is_Feasible) Then

'beide gültig
'beide gültig
'------------
isDominated = False

Expand Down Expand Up @@ -250,7 +250,7 @@ Public Class Functions

''' <summary>
''' Sortiert die dominanten Individuen nach oben, die nicht dominanten nach unten,
''' gibt die Zahl der dominanten Individuen zurück (Front)
''' gibt die Zahl der dominanten Individuen zurück (Front)
''' </summary>
''' <param name="inds">zu sortierendes Array von Individuen</param>
''' <returns>Anzahl dominanter Individuen (Front)</returns>
Expand All @@ -264,7 +264,7 @@ Public Class Functions
'Anhand von Dominated-Property sortieren (False kommt nach oben)
Call Array.Sort(inds, comparer)

'Nicht-dominierte Individuen zählen
'Nicht-dominierte Individuen zählen
NFrontMembers = 0
For Each ind As Individuum In inds
If (ind.Dominated = False)
Expand All @@ -279,25 +279,25 @@ Public Class Functions
End Function

'NON_DOMINATED_RESULT - Hier wird pro durchlauf die nicht dominierte Front in NDSResult
'geschaufelt und die bereits klassifizierten Lösungen aus Temp Array gelöscht
'geschaufelt und die bereits klassifizierten Lösungen aus Temp Array gelöscht
'**************************************************************************************
Private Sub Pareto_Non_Dominated_Result(ByRef Temp() As Individuum, ByRef NDSResult() As Individuum, ByVal NFrontMember_aktuell As Integer, ByVal NFrontMember_gesamt As Integer)

Dim i, Position As Integer

Position = NFrontMember_gesamt - NFrontMember_aktuell

'In NDSResult werden die nicht dominierten Lösungen eingefügt
'In NDSResult werden die nicht dominierten Lösungen eingefügt
For i = Temp.GetLength(0) - NFrontMember_aktuell To Temp.GetUpperBound(0)
'NDSResult alle bisher gefundene Fronten
NDSResult(Position) = Temp(i).Clone()
Position += 1
Next i

'Die bereits klassifizierten Member werden aus dem Temp Array gelöscht
'Die bereits klassifizierten Member werden aus dem Temp Array gelöscht
If (NNachf + NEltern - NFrontMember_gesamt > 0) Then
ReDim Preserve Temp(NNachf + NEltern - NFrontMember_gesamt - 1)
'Der Flag wird zur klassifizierung in der nächsten Runde zurückgesetzt
'Der Flag wird zur klassifizierung in der nächsten Runde zurückgesetzt
For i = 0 To Temp.GetUpperBound(0)
Temp(i).dominated = False
Next i
Expand Down Expand Up @@ -411,58 +411,58 @@ Public Class Functions
Next k
End Sub

'4: Sekundäre Population wird aktualisiert
'4: Sekundäre Population wird aktualisiert
'-----------------------------------------
Private Sub SekundärQb_Allocation(ByVal NDSResult() As Common.Individuum, ByRef SekundärQb() As Common.Individuum)
Private Sub SekundärQb_Allocation(ByVal NDSResult() As Individuum, ByRef SekundärQb() As Individuum)

Dim i, NFrontMember_aktuell, NMember_SekPop As Integer

'Anzahl Frontmember in NDSResult bestimmen
NFrontMember_aktuell = Pareto_Count_Front_Members(1, NDSResult)

'Aktuelle Anzahl Mitglieder in SekPop bestimmen
NMember_SekPop = SekundärQb.GetLength(0)
NMember_SekPop = SekundärQb.GetLength(0)

'SekPop um die aktuelle Front erweitern
ReDim Preserve SekundärQb(NMember_SekPop + NFrontMember_aktuell - 1)
ReDim Preserve SekundärQb(NMember_SekPop + NFrontMember_aktuell - 1)
For i = NMember_SekPop To NMember_SekPop + NFrontMember_aktuell - 1
SekundärQb(i) = NDSResult(i - NMember_SekPop)
SekundärQb(i) = NDSResult(i - NMember_SekPop)
Next i

'SekPop neu sortieren und hinteren Ränge entfernen
Call Pareto_Non_Dominated_Sorting(SekundärQb, 1)
NFrontMember_aktuell = Pareto_Non_Dominated_Count_and_Sort(SekundärQb)
ReDim Preserve SekundärQb(NFrontMember_aktuell - 1)
'SekPop neu sortieren und hinteren Ränge entfernen
Call Pareto_Non_Dominated_Sorting(SekundärQb, 1)
NFrontMember_aktuell = Pareto_Non_Dominated_Count_and_Sort(SekundärQb)
ReDim Preserve SekundärQb(NFrontMember_aktuell - 1)

'Dubletten aus SekPop entfernen
Call SekundärQb_Dubletten(SekundärQb)
NFrontMember_aktuell = Pareto_Non_Dominated_Count_and_Sort(SekundärQb)
ReDim Preserve SekundärQb(NFrontMember_aktuell - 1)
Call SekundärQb_Dubletten(SekundärQb)
NFrontMember_aktuell = Pareto_Non_Dominated_Count_and_Sort(SekundärQb)
ReDim Preserve SekundärQb(NFrontMember_aktuell - 1)

'SekPop ggf. auf Maximalanzahl Mitglieder begrenzen (mit Crowding Distance)
If (Me.isSekPopBegrenzung And SekundärQb.GetLength(0) > Me.NMaxMemberSekPop) Then
Call Pareto_Crowding_Distance_Sort(SekundärQb, 0, SekundärQb.GetUpperBound(0))
ReDim Preserve SekundärQb(Me.NMaxMemberSekPop - 1)
If (Me.isSekPopBegrenzung And SekundärQb.GetLength(0) > Me.NMaxMemberSekPop) Then
Call Pareto_Crowding_Distance_Sort(SekundärQb, 0, SekundärQb.GetUpperBound(0))
ReDim Preserve SekundärQb(Me.NMaxMemberSekPop - 1)
End If

End Sub

'Individuen mit identischen Penalties als dominiert markieren
'************************************************************
Private Sub SekundärQb_Dubletten(ByRef SekundärQb() As Common.Individuum)
Private Sub SekundärQb_Dubletten(ByRef SekundärQb() As Individuum)

Dim i, j, k As Integer
Dim Logical As Boolean

For i = 0 To SekundärQb.GetUpperBound(0) - 1
For j = i + 1 To SekundärQb.GetUpperBound(0)
For i = 0 To SekundärQb.GetUpperBound(0) - 1
For j = i + 1 To SekundärQb.GetUpperBound(0)
Logical = True
For k = 0 To Me.mProblem.NumPrimObjective - 1
Logical = Logical And (SekundärQb(i).PrimObjectives(k) = SekundärQb(j).PrimObjectives(k))
Logical = Logical And (SekundärQb(i).PrimObjectives(k) = SekundärQb(j).PrimObjectives(k))
Next k
If (Logical) Then
'Duplikat gefunden: als dominiert markieren
SekundärQb(i).dominated = True
SekundärQb(i).Dominated = True
End If
Next j
Next i
Expand Down
Loading
Loading