From 2caf6fae298c7e77dff4a18c625bbbeec7179c8d Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 18:56:30 +0200 Subject: [PATCH 01/12] remove SWMM application #231 --- BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj | 6 - BlueM.Opt/Apps/SWMM/IHWB.SWMM.DllAdapter.dll | Bin 10240 -> 0 bytes BlueM.Opt/Apps/SWMM/SWMM.vb | 462 ------------------- BlueM.Opt/Apps/SWMM/SWMM5.dll | Bin 435200 -> 0 bytes BlueM.Opt/Apps/SWMM/SWMMThread.vb | 116 ----- BlueM.Opt/Common/Constants.vb | 17 +- BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt | 5 +- BlueM.Opt/Main/Form1.vb | 248 +++++----- BlueM.Opt/Main/My Project/AssemblyInfo.vb | 13 +- 9 files changed, 135 insertions(+), 732 deletions(-) delete mode 100644 BlueM.Opt/Apps/SWMM/IHWB.SWMM.DllAdapter.dll delete mode 100644 BlueM.Opt/Apps/SWMM/SWMM.vb delete mode 100644 BlueM.Opt/Apps/SWMM/SWMM5.dll delete mode 100644 BlueM.Opt/Apps/SWMM/SWMMThread.vb diff --git a/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj b/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj index ebf6ea6b..4c7b240f 100644 --- a/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj +++ b/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj @@ -115,8 +115,6 @@ Code - - @@ -175,10 +173,6 @@ - - - Always - Always diff --git a/BlueM.Opt/Apps/SWMM/IHWB.SWMM.DllAdapter.dll b/BlueM.Opt/Apps/SWMM/IHWB.SWMM.DllAdapter.dll deleted file mode 100644 index 8cfd8e04cc2127802482db67a4c8049b0c4f4cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 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 diff --git a/BlueM.Opt/Apps/SWMM/SWMM.vb b/BlueM.Opt/Apps/SWMM/SWMM.vb deleted file mode 100644 index 74f4c73f..00000000 --- a/BlueM.Opt/Apps/SWMM/SWMM.vb +++ /dev/null @@ -1,462 +0,0 @@ -'BlueM.Opt -'Copyright (C) BlueM Dev Group -'Website: -' -'This program is free software: you can redistribute it and/or modify -'it under the terms of the GNU General Public License as published by -'the Free Software Foundation, either version 3 of the License, or -'(at your option) any later version. -' -'This program is distributed in the hope that it will be useful, -'but WITHOUT ANY WARRANTY; without even the implied warranty of -'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -'GNU General Public License for more details. -' -'You should have received a copy of the GNU General Public License -'along with this program. If not, see . -' -Imports System.IO -Imports IHWB.SWMM.DLLAdapter -Imports System.Threading - -''' -''' Klasse SWMM -''' Funktionen zur Kontrolle von EPA SWMM5 -''' -Public Class SWMM - Inherits Sim - -#Region "Eigenschaften" - - 'Eigenschaften - '############# - - 'SWMM DLL - '--------- - Private dll_path As String - Private swmm_dll() As SWMM_EngineDotNetAccess - - 'Multithreading - '-------------- - Dim MySWMMThreads() As SWMMThread - Dim MyThreads() As Thread - -#End Region 'Eigenschaften - -#Region "Properties" - - ''' - ''' Alle Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können - ''' - ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) - Public Overrides ReadOnly Property DatensatzDateiendungen() As Collections.Specialized.StringCollection - Get - Dim exts As New Collections.Specialized.StringCollection() - - exts.AddRange(New String() {"INP", "DAT", "INI"}) - - Return exts - - End Get - End Property - - ''' - ''' Ob die Anwendung Multithreading unterstützt - ''' - ''' True - Public Overrides ReadOnly Property MultithreadingSupported() As Boolean - Get - Return True - End Get - End Property - -#End Region 'Properties - -#Region "Methoden" - - 'Methoden - '######## - - 'Konstruktor - '*********** - Public Sub New() - - Call MyBase.New() - - 'Pfad zu SWMM5.DLL bestimmen - '--------------------------- - dll_path = IO.Path.Combine(System.Windows.Forms.Application.StartupPath(), "SWMM\SWMM5.dll") - - If (Not File.Exists(dll_path)) Then - Throw New Exception("SWMM.dll nicht gefunden!") - End If - - End Sub - - ''' - ''' SWMM Simulationen vorbereiten - ''' - Public Overrides Sub prepareSimulation() - - Call MyBase.prepareSimulation() - - 'SWMM DLL instanzieren je nach Anzahl der Threads - '------------------------------------------------ - If swmm_dll Is Nothing Then - ReDim swmm_dll(Me.n_Threads - 1) - Dim i As Integer - - For i = 0 To Me.n_Threads - 1 - 'toDo: prüfen, ob schon instanziert - swmm_dll(i) = New SWMM_EngineDotNetAccess(dll_path) - Next - End If - - 'Thread-Objekte instanzieren - ReDim MySWMMThreads(Me.n_Threads - 1) - For i = 0 To Me.n_Threads - 1 - MySWMMThreads(i) = New SWMMThread(i, -1, "Folder", Datensatz, swmm_dll(i)) - MySWMMThreads(i).set_is_OK() - Next - ReDim MyThreads(Me.n_Threads - 1) - - End Sub - - 'Simulationsparameter einlesen - '***************************** - Protected Overrides Sub Read_SimParameter() - - Dim SimStart_Date_str As String = "" - Dim SimEnde_Date_str As String = "" - Dim SimStart_Time_str As String = "" - Dim SimEnde_Time_str As String = "" - Dim ROUTING_STEP_str As String = "" - - 'INP-Datei öffnen - '---------------- - Dim Datei As String = IO.Path.Combine(Me.WorkDir_Original, Me.Datensatz & ".inp") - - Dim FiStr As FileStream = New FileStream(Datei, FileMode.Open, IO.FileAccess.ReadWrite) - Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) - Dim StrReadSync As TextReader = TextReader.Synchronized(StrRead) - - 'Alle Zeilen durchlaufen - Dim Zeile As String - Dim readok As Integer = 0 - Do - Zeile = StrRead.ReadLine.ToString() - 'Simulationszeitraum auslesen - - If Zeile.StartsWith("START_DATE") Then - SimStart_Date_str = Zeile.Substring(21, 10) - readok += 1 - ElseIf Zeile.StartsWith("START_TIME") Then - SimStart_Time_str = Zeile.Substring(21, 8) - readok += 1 - ElseIf Zeile.StartsWith("END_DATE") Then - SimEnde_Date_str = Zeile.Substring(21, 10) - readok += 1 - ElseIf Zeile.StartsWith("END_TIME") Then - SimEnde_Time_str = Zeile.Substring(21, 8) - readok += 1 - ElseIf Zeile.StartsWith("ROUTING_STEP") Then - ROUTING_STEP_str = Zeile.Substring(21, 7) - End If - If readok > 4 Then Exit Do 'Sobald alle Bestandteile des Datum - 'und des Zeitschrittes gefunden wurde, - 'kann die Schleife verlassen werden - Loop Until StrRead.Peek() = -1 - - 'Schließen der INP-Datei - StrReadSync.Close() - StrRead.Close() - FiStr.Close() - - 'SimStart und SimEnde in echtes Datum konvertieren - Me.SimStart = New DateTime(SimStart_Date_str.Substring(6, 4), SimStart_Date_str.Substring(0, 2), SimStart_Date_str.Substring(3, 2), SimStart_Time_str.Substring(0, 2), SimStart_Time_str.Substring(3, 2), SimStart_Time_str.Substring(6, 2)) - Me.SimEnde = New DateTime(SimEnde_Date_str.Substring(6, 4), SimEnde_Date_str.Substring(0, 2), SimEnde_Date_str.Substring(3, 2), SimEnde_Time_str.Substring(0, 2), SimEnde_Time_str.Substring(3, 2), SimEnde_Time_str.Substring(6, 2)) - - 'Zeitschrittweite ist variable - Me.SimDT = New TimeSpan(ROUTING_STEP_str.Substring(0, 1), ROUTING_STEP_str.Substring(2, 2), ROUTING_STEP_str.Substring(5, 2)) - - End Sub - - 'SWMM ausführen (simulieren) - 'Startet einen neuen Thread und übergibt ihm die Child ID - '******************************************************** - Protected Overrides Function launchSim(ByVal Thread_ID As Integer, ByVal Child_ID As Integer) As Boolean - - launchSim = False - Dim Folder As String - - Folder = getThreadWorkDir(Thread_ID) - MySWMMThreads(Thread_ID) = New SWMMThread(Thread_ID, Child_ID, Folder, Datensatz, swmm_dll(Thread_ID)) - MyThreads(Thread_ID) = New Thread(AddressOf MySWMMThreads(Thread_ID).launchSim) - MyThreads(Thread_ID).IsBackground = True - MyThreads(Thread_ID).Start() - launchSim = True - - Return launchSim - - End Function - - 'SWMM ohne Thread ausführen (simulieren) - '**************************** - Protected Overrides Function launchSim() As Boolean - - Dim simOK As Boolean - - Try - - Call swmm_dll(0).Initialize(IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz)) - Call swmm_dll(0).Start(1) - - Dim elapsedTime As Double = 0.0 - - Do - Call swmm_dll(0).PerformTimeStep(elapsedTime) - Loop While (elapsedTime > 0.0) - - 'Simulation abschliessen - Call swmm_dll(0).Finish() - - ''überprüfen, ob Simulation erfolgreich - ''------------------------------------- - ''rpt-Datei öffnen - 'Dim FiStr As FileStream = New FileStream(IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz & ".rpt"), FileMode.Open, IO.FileAccess.ReadWrite) - 'Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) - 'Dim StrReadSync As TextReader = TextReader.Synchronized(StrRead) - - ''Alle Zeilen durchlaufen - 'Dim Zeile As String - 'simOK = False - 'Do - ' Zeile = StrRead.ReadLine.ToString() - ' If (Zeile.StartsWith(" Runoff Quantity Continuity")) Then - ' simOK = True - ' Exit Do - ' End If - - 'Loop Until StrRead.Peek() = -1 - - 'StrReadSync.Close() - 'StrRead.Close() - 'FiStr.Close() - - 'Simulation abschliessen - Call swmm_dll(0).Finish() - - 'Simulation erfolgreich - simOK = True - - Catch ex As Exception - - 'Simulationsfehler aufgetreten - MsgBox(ex.Message, MsgBoxStyle.Exclamation, "SWMM") - - 'Simulation nicht erfolgreich - simOK = False - - Finally - - 'Ressourcen deallokieren - Call swmm_dll(0).Dispose() - - End Try - - Return simOK - - End Function - - 'Gibt zurück ob ein beliebiger Thread beendet ist und ibt die ID diesen freien Threads zurück - '******************************************************************************************** - Protected Overrides Function ThreadFree(ByRef Thread_ID As Integer) As Boolean - ThreadFree = False - - For Each Thr_C As SWMMThread In MySWMMThreads - If Thr_C.Sim_Is_OK = True And Thr_C.get_Child_ID = -1 Then - ThreadFree = True - Thread_ID = Thr_C.get_Thread_ID - Exit For - End If - Next - - End Function - - 'Prüft ob des aktuelle Child mit der ID die oben übergeben wurde fertig ist - 'Gibt die Thread ID zurück um zum auswerten in das Arbeitsverzeichnis zu wechseln - '******************************************************************************** - Protected Overrides Function ThreadReady(ByRef Thread_ID As Integer, ByRef SimIsOK As Boolean, ByVal Child_ID As Integer) As Boolean - ThreadReady = False - - For Each Thr_C As SWMMThread In MySWMMThreads - If Thr_C.launch_Ready = True And Thr_C.get_Child_ID = Child_ID Then - ThreadReady = True - SimIsOK = Thr_C.Sim_Is_OK - Thread_ID = Thr_C.get_Thread_ID - MyThreads(Thread_ID).Join() - MySWMMThreads(Thread_ID) = New SWMMThread(Thread_ID, -1, "Folder", Datensatz, swmm_dll(Thread_ID)) - MySWMMThreads(Thread_ID).set_is_OK() - End If - Next - - End Function - - 'Simulationsergebnis einlesen - '---------------------------- - Protected Overrides Sub SIM_Ergebnis_Lesen() - - 'TODO: Objectives durchgehen und erforderliche Werte in SimErgebnis speichern (#2) - 'bisher nur Einlesen der RPT-Datei moeglich - 'Einlesen des Binaerfiles mit den Ganglinien spaeter dazunehmen - Dim DateiPfad As String - Dim Zeile As String - - 'Altes Simulationsergebnis löschen - Me.SimResult.Clear() - - 'Ablauf - 'Durchgehen aller ObjectiveFunctions - Objekte - 'Einlesen in das Objekt SimErgebnis - - For Each obj As Common.ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions - - 'Unterscheidung nach ObjectiveType - Select Case obj.GetObjType - Case Common.ObjectiveFunction.ObjectiveType.Series - 'TODO - 'Zeitreihe einlesen - Case Common.ObjectiveFunction.ObjectiveType.Value - 'TODO: Umbauen, so dass Datei nicht jedes mal geoeffnet werden muss - '.RPT-Datei oeffnen - DateiPfad = IO.Path.Combine(WorkDir_Current, Datensatz & "." & obj.FileExtension) - Dim FiStr As FileStream = New FileStream(DateiPfad, FileMode.Open, IO.FileAccess.Read) - Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) - Dim KeyWord_Block As String, KeyWord_SimGr As String - Dim NoSpalte As Short - Dim tmpValue As Double - Dim blnValueAdded As Boolean - 'Datei durchgehen und mit Block und Spaltenangabe aus obj den gesuchten Wert ermitteln - 'und diesen dann in Sim_Ergebnis schreiben - Dim objValue As Common.Objectivefunction_Value - objValue = obj - Select Case objValue.Block - Case "NodeFlooding" - KeyWord_Block = " Node Flooding Summary" - Select Case objValue.Column - Case "HoursFlooded" - NoSpalte = 2 - Case "FloodVolume" - NoSpalte = 6 - Case Else - Throw New Exception("Das Schluesselwort für die Spalte ist ungueltig!") - End Select - Case "StorageVolume" - KeyWord_Block = " Storage Volume Summary" - Select Case objValue.Column - Case "AvgVolume" - NoSpalte = 2 - Case "AvgPctFull" - NoSpalte = 3 - Case "MaxVolume" - NoSpalte = 4 - Case "MaxPctFull" - NoSpalte = 5 - Case "MaxOutflow" - NoSpalte = 8 - Case Else - Throw New Exception("Das Schluesselwort für die Spalte ist ungueltig!") - End Select - Case "OutfallLoad" - KeyWord_Block = " Outfall Loading Summary" - Select Case objValue.Column - Case "MaxFlow" - NoSpalte = 4 - Case "FlowVolume" - NoSpalte = 5 - Case "Pollutant_01" - NoSpalte = 6 - Case "Pollutant_02" - NoSpalte = 7 - Case "Pollutant_03" - NoSpalte = 8 - Case "Pollutant_04" - NoSpalte = 9 - Case "Pollutant_05" - NoSpalte = 10 - Case "Pollutant_06" - NoSpalte = 11 - Case Else - Throw New Exception("Das Schluesselwort für die Spalte ist ungueltig!") - End Select - Case "LinkFlow" - KeyWord_Block = " Link Flow Summary" - Case "ConduitSurcharge" - KeyWord_Block = " Conduit Surcharge Summary" - Case "Pumping" - KeyWord_Block = " Pumping Summary" - Select Case objValue.Column - Case "OnlineTime" - NoSpalte = 2 - Case "TotalEnergy" - NoSpalte = 6 - Throw New Exception("Das Schluesselwort für die Spalte ist ungueltig!") - End Select - Case Else - Throw New Exception("Das Schluesselword für den Block ist ungueltig") - End Select - 'Datei durchgehen und nach Schluesselwort suchen - blnValueAdded = False - Do - KeyWord_SimGr = " " & objValue.SimResultName - Zeile = StrRead.ReadLine.ToString - If (Zeile.StartsWith(KeyWord_Block)) Then - Zeile = StrRead.ReadLine.ToString 'Es folgt immer eine Zeile mit Sternen - Zeile = StrRead.ReadLine.ToString 'und dann noch eine Leerzeile - Do - Zeile = StrRead.ReadLine.ToString - If (Zeile.StartsWith(KeyWord_SimGr)) Then - tmpValue = Convert.ToDouble(Zeile.Split(" ", options:=StringSplitOptions.RemoveEmptyEntries)(NoSpalte - 1), Common.Provider.FortranProvider) - Me.SimResult.Values.Add(obj.Description, tmpValue) - blnValueAdded = True - Exit Do - 'Falls keine Nodes überstaut sind bei Node Flooding Summary muss geährleistet werden, - 'dass der Wert 0 übergeben wird. - 'Select Case objValue.Block - ' Case "NodeFlooding" - ' If Zeile.TrimStart.StartsWith("No nodes were flooded.") Then - ' tmpValue = 0.0 - ' Me.SimErgebnis.Werte.Add(obj.Bezeichnung, tmpValue) - ' blnValueAdded = True - ' Exit Do - 'Case Else - 'End Select - 'Wenn die SimGr nicht im Block auftaucht muss tmpvalue = 0 gesetzt werden - ElseIf Zeile.TrimStart.StartsWith("**********************") Then 'nächster Block beginnt - tmpValue = 0.0 - Me.SimResult.Values.Add(obj.Description, tmpValue) - blnValueAdded = True - Exit Do - End If - Loop Until StrRead.Peek() = -1 - End If - If blnValueAdded Then Exit Do - Loop Until StrRead.Peek() = -1 - StrRead.Close() - FiStr.Close() - - - Case Common.ObjectiveFunction.ObjectiveType.ValueFromSeries - 'TODO - Case Else - 'TODO - End Select - Next - - - End Sub - -#End Region 'Methoden - -End Class - diff --git a/BlueM.Opt/Apps/SWMM/SWMM5.dll b/BlueM.Opt/Apps/SWMM/SWMM5.dll deleted file mode 100644 index c4753fce66e4a0a8031f85802cdc9e13dd71a5bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435200 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[gAjguBl4H4qd`?%Iz2PVw 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 -' -'This program is free software: you can redistribute it and/or modify -'it under the terms of the GNU General Public License as published by -'the Free Software Foundation, either version 3 of the License, or -'(at your option) any later version. -' -'This program is distributed in the hope that it will be useful, -'but WITHOUT ANY WARRANTY; without even the implied warranty of -'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -'GNU General Public License for more details. -' -'You should have received a copy of the GNU General Public License -'along with this program. If not, see . -' -'Klasse beinhaltet alle Infomationen für einen Simulationslauf im Thread -'*********************************************************************** -Imports IHWB.SWMM.DllAdapter - -Public Class SWMMThread - - Private Thread_ID As Integer - Private Child_ID As Integer - Private WorkFolder As String - Private DS_Name As String - Private SWMM_dll As SWMM_EngineDotNetAccess - Private SimIsOK As Boolean - Private launchReady As Boolean - - Public Sub New(ByVal _Thread_ID As Integer, ByVal _Child_ID As Integer, ByVal _WorkFolder As String, ByVal _DS_Name As String, ByRef _SWMM_dll As SWMM_EngineDotNetAccess) - Me.Thread_ID = _Thread_ID - Me.Child_ID = _Child_ID - Me.WorkFolder = _WorkFolder - Me.DS_Name = _DS_Name - Me.SWMM_dll = _SWMM_dll - End Sub - - 'Die Funktion startet die Simulation mit dem entsprechendem WorkingDir - '********************************************************************* - Public Sub launchSim() - - Me.SimIsOK = False - Me.launchReady = False - - 'Priority - System.Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.BelowNormal - - Try - 'Datensatz übergeben und initialisieren - Call SWMM_dll.Initialize(IO.Path.Combine(Me.WorkFolder, Me.DS_Name)) - Call SWMM_dll.Start(1) - - 'Simulationszeitraum - Dim elapsedTime As Double = 0.0 - - Do - Call SWMM_dll.PerformTimeStep(elapsedTime) - Loop While (elapsedTime > 0.0) - - 'Simulation abschliessen - Call SWMM_dll.Finish() - - 'Simulation erfolgreich - Me.SimIsOK = True - - Catch ex As Exception - - 'Simulationsfehler aufgetreten - MsgBox(ex.Message, MsgBoxStyle.Exclamation, "SWMM") - - ''Simulation abschliessen - 'Call SWMM_dll.Finish() - - 'Simulation nicht erfolgreich - Me.SimIsOK = False - - Finally - - 'Ressourcen deallokieren - Call SWMM_dll.Dispose() - - End Try - - 'Me.SimIsOK = False - Me.launchReady = True - - End Sub - - Public Function Sim_Is_OK() As Boolean - - Sim_Is_OK = Me.SimIsOK - End Function - - Public Function launch_Ready() As Boolean - - launch_Ready = Me.launchReady - End Function - - Public Sub set_is_OK() - - Me.SimIsOK = True - End Sub - - Public Function get_Thread_ID() As Integer - - get_Thread_ID = Me.Thread_ID - End Function - - Public Function get_Child_ID() As Integer - - get_Child_ID = Me.Child_ID - End Function - -End Class diff --git a/BlueM.Opt/Common/Constants.vb b/BlueM.Opt/Common/Constants.vb index f4af5ad1..e84369b0 100644 --- a/BlueM.Opt/Common/Constants.vb +++ b/BlueM.Opt/Common/Constants.vb @@ -36,7 +36,6 @@ Public Module Constants 'Anwendungen Public Const ANW_BLUEM As String = "BlueM.Sim" Public Const ANW_SMUSI As String = "SMUSI" - Public Const ANW_SWMM As String = "SWMM" Public Const ANW_TALSIM As String = "TALSIM" Public Const ANW_TALSIM5 As String = "TALSIM5" Public Const ANW_TESTPROBLEMS As String = "Testproblems" @@ -50,13 +49,13 @@ Public Module Constants Public Const METH_DDS As String = "DDS" Public Const METH_TSP As String = "TSP" - 'Lösungs- / Entscheidungsraum + 'Lösungs- / Entscheidungsraum Public Enum SPACE As Integer DecisionSpace = 0 SolutionSpace = 1 End Enum - 'Option für Startvorgabe für Optimierung + 'Option für Startvorgabe für Optimierung Public Enum EVO_STARTPARAMETERS As Integer Random = 1 Original = 2 @@ -76,17 +75,17 @@ Public Module Constants 'Option zur Erzeugung der Eltern Public Enum PES_REPRODOP As Integer - Selection = 1 'zufällige Selektion as Bestwertspeicher + Selection = 1 'zufällige Selektion as Bestwertspeicher XX_Discrete = 2 'Rekombination nach x/x-Schema, diskretes vertauschen der Gene - XX_Average = 3 'Rekombination nach x/x-Schema, mittelwertbildung der Gene über y-Eltern + XX_Average = 3 'Rekombination nach x/x-Schema, mittelwertbildung der Gene über y-Eltern XY_Discrete = 4 'Rekombination nach x/y-Schema, diskretes vertauschen der Gene - XY_Average = 5 'Rekombination nach x/y-Schema, mittelwertbildung der Gene über y-Eltern + XY_Average = 5 'Rekombination nach x/y-Schema, mittelwertbildung der Gene über y-Eltern Neighborhood = 6 'Neighborhood-Rekombination XX_Average_Discrete = 7 'Rekombination nach x/x-Schema, diskretes vertauschen der Gene, miteln der Strategieparameter XY_Average_Discrete = 8 'Rekombination nach x/y-Schema, diskretes vertauschen der Gene, miteln der Strategieparameter End Enum - 'Option für die Mutation + 'Option für die Mutation Public Enum PES_MUTATIONSOP As Integer Rechenberg = 1 Schwefel = 2 @@ -97,10 +96,10 @@ Public Module Constants Public Enum EVO_POP_ELTERN As Integer Recombination = 1 'Rekombination aus den PopEltern Average = 2 'Mittelwertbildung aus den PopEltern - Selection = 3 'zufällige Selektion aus Bestwertspeicher + Selection = 3 'zufällige Selektion aus Bestwertspeicher End Enum - 'Option zur Ermittlung der Populationsqualität + 'Option zur Ermittlung der Populationsqualität Public Enum EVO_POP_PENALTY As Integer Average = 1 'SingleObjective Worst = 2 'SingleObjective diff --git a/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt b/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt index 26795c22..b4a9f55b 100644 --- a/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt +++ b/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt @@ -5,12 +5,15 @@ BlueM.Opt Release Notes Version 2.6.0 ------------- NEW: -* Added support for Talsim datasets in Talsim5 database format (select `TALSIM5` as the app) +* Added support for Talsim datasets in Talsim5 database format (select `TALSIM5` as the app) #243 CHANGED: * Updated Talsim.Engine to v4.1.22 * Updated BlueM.Wave to v2.17.0 +REMOVED: +* Removed support for SWMM #231 + Version 2.5.0 ------------- NEW: diff --git a/BlueM.Opt/Main/Form1.vb b/BlueM.Opt/Main/Form1.vb index afc46a26..43b2533f 100644 --- a/BlueM.Opt/Main/Form1.vb +++ b/BlueM.Opt/Main/Form1.vb @@ -27,7 +27,7 @@ Partial Public Class Form1 #Region "Eigenschaften" - Private IsInitializing As Boolean 'Gibt an, ob das Formular bereits fertig geladen wurde(beim Laden werden sämtliche Events ausgelöst) + Private IsInitializing As Boolean 'Gibt an, ob das Formular bereits fertig geladen wurde(beim Laden werden sämtliche Events ausgelöst) 'Anwendung Private Anwendung As String @@ -54,7 +54,7 @@ Partial Public Class Form1 Dim _ispause As Boolean = False '''

- ''' Optimierung läuft + ''' Optimierung läuft ''' Private Property isRun() As Boolean Get @@ -120,7 +120,7 @@ Partial Public Class Form1 'Formular initialisieren Call Me.INI() - 'Handler für Klick auf Serien zuweisen + 'Handler für Klick auf Serien zuweisen AddHandler Me.Hauptdiagramm1.ClickSeries, AddressOf seriesClick 'Ende der Initialisierung @@ -129,7 +129,7 @@ Partial Public Class Form1 End Sub ''' - ''' Formular zurücksetzen + ''' Formular zurücksetzen ''' Public Sub INI() @@ -143,9 +143,9 @@ Partial Public Class Form1 'Anwendung '--------- - 'Liste der Anwendungen in ComboBox schreiben und Anfangseinstellung wählen + 'Liste der Anwendungen in ComboBox schreiben und Anfangseinstellung wählen Me.ComboBox_Anwendung.Items.Clear() - Me.ComboBox_Anwendung.Items.AddRange(New Object() {"", ANW_BLUEM, ANW_SWMM, ANW_TALSIM, ANW_TALSIM5, ANW_TESTPROBLEMS, ANW_TSP}) 'ANW_SMUSI entfernt (#184) + Me.ComboBox_Anwendung.Items.AddRange(New Object() {"", ANW_BLUEM, ANW_TALSIM, ANW_TALSIM5, ANW_TESTPROBLEMS, ANW_TSP}) 'ANW_SMUSI entfernt (#184) Me.ComboBox_Anwendung.SelectedIndex = 0 'Datensatz @@ -159,20 +159,20 @@ Partial Public Class Form1 Me.Label_Methode.Enabled = False Me.ComboBox_Methode.Enabled = False - 'Liste der Methoden in ComboBox schreiben und Anfangseinstellung wählen + 'Liste der Methoden in ComboBox schreiben und Anfangseinstellung wählen Me.ComboBox_Methode.Items.Clear() Me.ComboBox_Methode.Items.AddRange(New Object() {"", METH_PES, METH_METAEVO, METH_SENSIPLOT, METH_HOOKEJEEVES, METH_DDS}) Me.ComboBox_Methode.SelectedIndex = 0 'Einstellungen Me.mSettings = New Common.Settings() - Me.EVO_Einstellungen1.Reset() 'für Neustart wichtig + Me.EVO_Einstellungen1.Reset() 'für Neustart wichtig Me.EVO_Einstellungen1.setSettings(Me.mSettings) - 'Monitor zurücksetzen + 'Monitor zurücksetzen Me.Monitor1.Reset() - 'Progress instanzieren und an EVO_Opt_Verlauf übergeben + 'Progress instanzieren und an EVO_Opt_Verlauf übergeben Me.mProgress = New BlueM.Opt.Common.Progress() Me.EVO_Opt_Verlauf1.Initialisieren(Me.mProgress) @@ -224,7 +224,7 @@ Partial Public Class Form1 Private Sub Button_New_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton_New.Click 'Controller stoppen If (Me.STOPPEN()) Then - 'Formular zurücksetzen + 'Formular zurücksetzen Call Me.INI() End If End Sub @@ -241,7 +241,7 @@ Partial Public Class Form1 End Sub - 'Wenn Monitor geöffnet/geschlossen wird, ButtonState aktualisieren + 'Wenn Monitor geöffnet/geschlossen wird, ButtonState aktualisieren '***************************************************************** Private Sub MonitorOpenClose() Handles Monitor1.MonitorClosed, Monitor1.MonitorOpened Me.ToolStripButton_Monitor.Checked = Me.Monitor1.Visible @@ -281,7 +281,7 @@ Partial Public Class Form1 Call about.ShowDialog(Me) End Sub - 'Einstellungen-Button hat selbst keine funktionalität -> nur DropDown + 'Einstellungen-Button hat selbst keine funktionalität -> nur DropDown '******************************************************************** Private Sub Button_Einstellungen_ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripSplitButton_Settings.ButtonClick Call Me.ToolStripSplitButton_Settings.ShowDropDown() @@ -331,7 +331,7 @@ Partial Public Class Form1 Throw New Exception("The loaded settings use a different optimization mode (single-/multiobjective) and are not compatible!") End If - 'Geladene Settings überall neu setzen + 'Geladene Settings überall neu setzen Me.mSettings = settings Me.EVO_Einstellungen1.setSettings(Me.mSettings) Me.Hauptdiagramm1.setSettings(Me.mSettings) @@ -345,10 +345,10 @@ Partial Public Class Form1 #Region "Initialisierung der Anwendungen" - 'Die Anwendung wurde ausgewählt und wird jetzt initialisiert + 'Die Anwendung wurde ausgewählt und wird jetzt initialisiert 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Anwendung wurde ausgewählt + 'Anwendung wurde ausgewählt '************************** Private Sub Combo_App_Changed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox_Anwendung.SelectedIndexChanged If (Not Me.IsInitializing) Then @@ -368,20 +368,20 @@ Partial Public Class Form1 Me.ComboBox_Anwendung.SelectedItem = selectedAnwendung Me.IsInitializing = False - 'Diagramm zurücksetzen + 'Diagramm zurücksetzen Call Me.Hauptdiagramm1.Reset() 'Alles deaktivieren, danach je nach Anwendung aktivieren '------------------------------------------------------- - 'Sim1 zerstören + 'Sim1 zerstören Me.Sim1 = Nothing 'Start Button deaktivieren Me.Button_Start.Enabled = False 'Datensatz-Reset deaktivieren - Me.MenuItem_DatensatzZurücksetzen.Enabled = False + Me.MenuItem_DatensatzZurücksetzen.Enabled = False 'Methodenauswahl deaktivieren Me.Label_Methode.Enabled = False @@ -394,18 +394,18 @@ Partial Public Class Form1 Me.ToolStripButton_SelectedSolutions.Enabled = False Me.ToolStripMenuItem_ErgebnisDBCompare.Enabled = False - 'Multithreading standardmäßig verbieten + 'Multithreading standardmäßig verbieten Me.mSettings.General.MultithreadingAllowed = False 'Mauszeiger busy Cursor = Cursors.WaitCursor - 'Ausgewählte Anwendung speichern + 'Ausgewählte Anwendung speichern Me.Anwendung = selectedAnwendung Select Case Me.Anwendung - Case "" 'Keine Anwendung ausgewählt + Case "" 'Keine Anwendung ausgewählt 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 'nix @@ -438,13 +438,6 @@ Partial Public Class Form1 Sim1 = New BlueM.Opt.Apps.Talsim5() - Case ANW_SWMM 'Anwendung SWMM - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - - 'Objekt der Klasse SWMM initialisieren - Sim1 = New BlueM.Opt.Apps.SWMM() - - Case ANW_TESTPROBLEMS 'Anwendung Testprobleme 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx @@ -461,7 +454,7 @@ Partial Public Class Form1 Case ANW_TSP 'Anwendung Traveling Salesman Problem (TSP) 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - 'HACK: bei TSP Datensatz und Methode nicht notwendig, Abkürzung: + 'HACK: bei TSP Datensatz und Methode nicht notwendig, Abkürzung: 'Start-Button aktivieren (keine Methodenauswahl erforderlich) 'HACK: bei Testproblemen als Methodenauswahl nur PES, H&J, MetaEVO und DDS zulassen! Me.IsInitializing = True @@ -476,7 +469,7 @@ Partial Public Class Form1 'Bei Sim-Anwendungen If (Not IsNothing(Me.Sim1)) Then - 'Settings an Sim1 übergeben + 'Settings an Sim1 übergeben Call Me.Sim1.setSettings(Me.mSettings) 'ggf. Multithreading-Option aktivieren @@ -488,7 +481,7 @@ Partial Public Class Form1 'Datensatz UI aktivieren Call Me.Datensatz_initUI() - 'Progress zurücksetzen + 'Progress zurücksetzen Call Me.mProgress.Initialize() 'log @@ -503,7 +496,7 @@ Partial Public Class Form1 End Try - 'wegen verändertem Setting MultithreadingAllowed + 'wegen verändertem Setting MultithreadingAllowed Call Me.EVO_Einstellungen1.refreshForm() 'Mauszeiger wieder normal @@ -519,10 +512,10 @@ Partial Public Class Form1 Me.Label_Datensatz.Enabled = True Me.ComboBox_Datensatz.Enabled = True - 'Tooltip zurücksetzen + 'Tooltip zurücksetzen Me.ToolTip1.SetToolTip(Me.ComboBox_Datensatz, "") - 'Combo_Datensatz auffüllen + 'Combo_Datensatz auffüllen Call Me.Datensatz_populateCombo() Select Case Me.Anwendung @@ -555,21 +548,21 @@ Partial Public Class Form1 End Sub - 'Combo_Datensatz auffüllen + 'Combo_Datensatz auffüllen '************************* Private Sub Datensatz_populateCombo() Dim i As Integer Dim pfad As String - 'vorherige Einträge löschen + 'vorherige Einträge löschen Me.ComboBox_Datensatz.Items.Clear() Select Case Me.Anwendung Case ANW_TESTPROBLEMS - 'Mit Testproblemen füllen + 'Mit Testproblemen füllen Me.ComboBox_Datensatz.Items.AddRange(Testprobleme1.Testprobleme.ToArray()) Case ANW_TSP @@ -578,14 +571,14 @@ Partial Public Class Form1 Case Else '(Sim-Anwendungen) - 'Mit Benutzer-MRUSimDatensätze füllen + 'Mit Benutzer-MRUSimDatensätze füllen Try If (My.Settings.MRUSimDatensaetze.Count > 0) Then - 'Combobox rückwärts füllen + 'Combobox rückwärts füllen For i = My.Settings.MRUSimDatensaetze.Count - 1 To 0 Step -1 - 'nur existierende, zur Anwendung passende Datensätze anzeigen + 'nur existierende, zur Anwendung passende Datensätze anzeigen pfad = My.Settings.MRUSimDatensaetze(i) If (IO.File.Exists(pfad) _ And IO.Path.GetExtension(pfad).ToUpper() = Me.Sim1.DatensatzExtension) Then @@ -603,7 +596,7 @@ Partial Public Class Form1 End Sub - 'Arbeitsverzeichnis/Datensatz auswählen (nur Sim-Anwendungen) + 'Arbeitsverzeichnis/Datensatz auswählen (nur Sim-Anwendungen) '************************************************************ Private Sub Datensatz_browse(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_BrowseDatensatz.Click @@ -620,7 +613,7 @@ Partial Public Class Form1 OpenFileDialog1.FileName = IO.Path.Combine(Sim1.WorkDir_Original, Sim1.Datensatz & "." & Sim1.DatensatzDateiendungen(0)) End If - 'Dialog öffnen + 'Dialog öffnen DiagResult = OpenFileDialog1.ShowDialog() 'Neuen Datensatz speichern @@ -631,17 +624,17 @@ Partial Public Class Form1 'Datensatz setzen Call Me.INI_Datensatz(pfad) - 'Methodenauswahl wieder zurücksetzen - '(Der Benutzer muss zuerst Ini neu ausführen!) + 'Methodenauswahl wieder zurücksetzen + '(Der Benutzer muss zuerst Ini neu ausführen!) Me.ComboBox_Methode.SelectedItem = "" End If End Sub - 'Sim-Datensatz zurücksetzen + 'Sim-Datensatz zurücksetzen '************************** - Private Sub Datensatz_reset(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem_DatensatzZurücksetzen.Click + Private Sub Datensatz_reset(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem_DatensatzZurücksetzen.Click Call Sim1.resetDatensatz() @@ -649,7 +642,7 @@ Partial Public Class Form1 End Sub - 'Datensatz wurde ausgewählt + 'Datensatz wurde ausgewählt '************************** Private Sub Combo_Datensatz_Changed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox_Datensatz.SelectedIndexChanged If (Not Me.IsInitializing) Then @@ -665,16 +658,16 @@ Partial Public Class Form1 Try - 'Zurücksetzen + 'Zurücksetzen '------------ 'Tooltip Me.ToolTip1.SetToolTip(Me.ComboBox_Datensatz, "") 'Datensatz-Reset - Me.MenuItem_DatensatzZurücksetzen.Enabled = False + Me.MenuItem_DatensatzZurücksetzen.Enabled = False - 'gewählten Datensatz an Anwendung übergeben + 'gewählten Datensatz an Anwendung übergeben '------------------------------------------ Select Case Me.Anwendung @@ -717,7 +710,7 @@ Partial Public Class Form1 End Select - 'Methodenauswahl aktivieren und zurücksetzen + 'Methodenauswahl aktivieren und zurücksetzen '------------------------------------------- Me.Label_Methode.Enabled = True Me.ComboBox_Methode.Enabled = True @@ -725,7 +718,7 @@ Partial Public Class Form1 Me.ComboBox_Methode.SelectedItem = "" Me.IsInitializing = False - 'Progress zurücksetzen + 'Progress zurücksetzen Call Me.mProgress.Initialize() 'log @@ -737,7 +730,7 @@ Partial Public Class Form1 End Sub - 'Methode wurde ausgewählt + 'Methode wurde ausgewählt '************************ Private Sub Combo_Method_Changed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox_Methode.SelectedIndexChanged If (Not Me.IsInitializing) Then @@ -765,10 +758,10 @@ Partial Public Class Form1 Call Me.INI_Problem(selectedMethod) 'Methodenspezifische Vorbereitungen - '(zunächst alles deaktivieren, danach je nach Methode aktivieren) + '(zunächst alles deaktivieren, danach je nach Methode aktivieren) '================================================================ - 'Diagramm zurücksetzen + 'Diagramm zurücksetzen Me.Hauptdiagramm1.Reset() 'Start Button deaktivieren @@ -812,7 +805,7 @@ Partial Public Class Form1 Case METH_HOOKEJEEVES 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - 'Kontrolle: Nur SO möglich! + 'Kontrolle: Nur SO möglich! If (Me.mProblem.Modus = EVO_MODE.Multi_Objective) Then Throw New Exception("The method Hooke and Jeeves is only usable for single-objective optimization problems!") End If @@ -829,7 +822,7 @@ Partial Public Class Form1 Case METH_DDS 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - 'Kontrolle: Nur SO möglich! + 'Kontrolle: Nur SO möglich! If (Me.mProblem.Modus = EVO_MODE.Multi_Objective) Then Throw New Exception("The method DDS is only usable for single-objective optimization problems!") End If @@ -876,17 +869,17 @@ Partial Public Class Form1 If (Me.Anwendung <> ANW_TESTPROBLEMS) Then 'Datensatz-Reset aktivieren - Me.MenuItem_DatensatzZurücksetzen.Enabled = True + Me.MenuItem_DatensatzZurücksetzen.Enabled = True End If - 'Multithreading-Option (de)aktivieren (Kombination ist maßgebend!) + 'Multithreading-Option (de)aktivieren (Kombination ist maßgebend!) Me.mSettings.General.MultithreadingAllowed = (Me.mSettings.General.MultithreadingAllowed And Me.controller.MultithreadingSupported) Call Me.EVO_Einstellungen1.refreshForm() Catch ex As Exception MsgBox("Error while setting the method:" & eol & ex.Message, MsgBoxStyle.Critical) - 'Combobox zurücksetzen + 'Combobox zurücksetzen Me.IsInitializing = True Me.ComboBox_Methode.SelectedIndex = 0 Me.IsInitializing = False @@ -899,31 +892,31 @@ Partial Public Class Form1 End Sub ''' - ''' Problem initialisieren und überall bekannt machen + ''' Problem initialisieren und überall bekannt machen ''' - ''' gewählte Methode + ''' gewählte Methode Private Sub INI_Problem(ByVal Method As String) - 'Neues Problem mit ausgewählter Methode instanzieren + 'Neues Problem mit ausgewählter Methode instanzieren Me.mProblem = New BlueM.Opt.Common.Problem(Method) 'Problemdefinition '================= Select Case Me.Anwendung - Case ANW_BLUEM, ANW_SMUSI, ANW_SWMM, ANW_TALSIM, ANW_TALSIM5 + Case ANW_BLUEM, ANW_SMUSI, ANW_TALSIM, ANW_TALSIM5 'Bei allen Sim-Anwendungen '----------------------------------------------------- - 'WorkDir und Datensatz übergeben + 'WorkDir und Datensatz übergeben Me.mProblem.WorkDir = Sim1.WorkDir_Original Me.mProblem.Datensatz = Sim1.Datensatz 'EVO-Eingabedateien einlesen Call Me.mProblem.Read_InputFiles(Me.Sim1.SimStart, Me.Sim1.SimEnde) - 'Problem an Sim-Objekt übergeben + 'Problem an Sim-Objekt übergeben Call Me.Sim1.setProblem(Me.mProblem) @@ -940,7 +933,7 @@ Partial Public Class Form1 End Select - 'Problem an EVO_Einstellungen übergeben + 'Problem an EVO_Einstellungen übergeben '-------------------------------------- Call Me.EVO_Einstellungen1.setProblem(Me.mProblem) @@ -1036,7 +1029,7 @@ Partial Public Class Form1 'Settings deaktivieren Call Me.EVO_Einstellungen1.freeze() - 'Settings an Hauptdiagramm übergeben + 'Settings an Hauptdiagramm übergeben Call Me.Hauptdiagramm1.setSettings(Me.mSettings) 'Diagramm vorbereiten und initialisieren @@ -1044,7 +1037,7 @@ Partial Public Class Form1 Select Case Anwendung - Case ANW_BLUEM, ANW_SMUSI, ANW_SWMM, ANW_TALSIM, ANW_TALSIM5 + Case ANW_BLUEM, ANW_SMUSI, ANW_TALSIM, ANW_TALSIM5 'Sim-Anwendungen 'Save settings to file @@ -1070,7 +1063,7 @@ Partial Public Class Form1 End If End If - 'Controller für Sim initialisieren und starten + 'Controller für Sim initialisieren und starten Call controller.Init(Me.mProblem, Me.mSettings, Me.mProgress, Me.Hauptdiagramm1) Call controller.InitApp(Me.Sim1) Call controller.Start() @@ -1078,7 +1071,7 @@ Partial Public Class Form1 Case ANW_TESTPROBLEMS 'Testprobleme - 'Controller für Testproblem initialisieren und starten + 'Controller für Testproblem initialisieren und starten Call controller.Init(Me.mProblem, Me.mSettings, Me.mProgress, Me.Hauptdiagramm1) Call controller.InitApp(Me.Testprobleme1) Call controller.Start() @@ -1086,16 +1079,16 @@ Partial Public Class Form1 Case ANW_TSP 'Traveling Salesman - 'Controller für TSP initialisieren und starten + 'Controller für TSP initialisieren und starten Call controller.Init(Me.mProblem, Me.mSettings, Me.mProgress, Me.Hauptdiagramm1) - 'Call controller.InitApp() bei TSP nicht benötigt + 'Call controller.InitApp() bei TSP nicht benötigt Call controller.Start() End Select Catch ex As Exception - 'Globale Fehlerbehandlung für Optimierungslauf: + 'Globale Fehlerbehandlung für Optimierungslauf: Common.Log.AddMessage(Common.Log.levels.error, ex.Message) MsgBox(ex.Message, MsgBoxStyle.Critical, "Error") @@ -1119,7 +1112,7 @@ Partial Public Class Form1 ''' Private Sub PAUSE() - 'nur wenn Optimierung läuft + 'nur wenn Optimierung läuft If (Me.isRun) Then If (Not Me.isPause) Then @@ -1176,7 +1169,7 @@ Partial Public Class Form1 res = MsgBox("Are you sure you want to abort the optimization?", MsgBoxStyle.YesNo) If (res = MsgBoxResult.Yes) Then - 'Pause ausschalten, sonst läuft die immer weiter + 'Pause ausschalten, sonst läuft die immer weiter Me.isPause = False 'Controller stoppen Call Me.controller.Stoppen() @@ -1204,7 +1197,7 @@ Partial Public Class Form1 'Diagrammfunktionen '################### - 'Diagramm-Button hat selbst keine funktionalität -> nur DropDown + 'Diagramm-Button hat selbst keine funktionalität -> nur DropDown '*************************************************************** Private Sub Button_Diagramm_ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripSplitButton_Diagramm.ButtonClick Call Me.ToolStripSplitButton_Diagramm.ShowDropDown() @@ -1265,7 +1258,7 @@ Partial Public Class Form1 Dim Achsen As New Collection ReDim tmpZielindex(2) 'Maximal 3 Achsen - 'Zunächst keine Achsenzuordnung (-1) + 'Zunächst keine Achsenzuordnung (-1) For i = 0 To tmpZielindex.GetUpperBound(0) tmpZielindex(i) = -1 Next @@ -1279,7 +1272,7 @@ Partial Public Class Form1 Call Testprobleme1.DiagInitialise(Me.Hauptdiagramm1) - Case ANW_BLUEM, ANW_SMUSI, ANW_SWMM, ANW_TALSIM, ANW_TALSIM5 + Case ANW_BLUEM, ANW_SMUSI, ANW_TALSIM, ANW_TALSIM5 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Select Case Me.mProblem.Method @@ -1405,7 +1398,7 @@ Partial Public Class Form1 'Multi-Objective '=============== - 'für jedes OptZiel eine Achse hinzufügen + 'für jedes OptZiel eine Achse hinzufügen j = 0 For i = 0 To Me.mProblem.NumObjectives - 1 If (Me.mProblem.List_ObjectiveFunctions(i).isPrimObjective) Then @@ -1489,7 +1482,7 @@ Partial Public Class Form1 End Sub -#Region "Lösungsauswahl" +#Region "Lösungsauswahl" ''' ''' Button to show selected Solutions clicked @@ -1498,12 +1491,12 @@ Partial Public Class Form1 ''' ''' Private Sub ToolStripButton_SelectedSolutions_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton_SelectedSolutions.Click - 'Lösungsdialog initialisieren + 'Lösungsdialog initialisieren If (IsNothing(Me.solutionDialog)) Then Me.solutionDialog = New SolutionDialog(Me.mProblem) End If - 'Lösungsdialog anzeigen + 'Lösungsdialog anzeigen Call Me.solutionDialog.Show() Call Me.solutionDialog.BringToFront() End Sub @@ -1513,7 +1506,7 @@ Partial Public Class Form1 '*************************** Public Sub seriesClick(ByVal sender As Object, ByVal s As Steema.TeeChart.Styles.Series, ByVal valueIndex As Integer, ByVal e As System.Windows.Forms.MouseEventArgs) - 'Notwendige Bedingungen überprüfen + 'Notwendige Bedingungen überprüfen '--------------------------------- If (IsNothing(Sim1)) Then 'Anwendung != Sim @@ -1528,10 +1521,10 @@ Partial Public Class Form1 'Solution-ID indID_clicked = s.Labels(valueIndex) - 'Lösung holen + 'Lösung holen ind = Sim1.OptResult.getSolution(indID_clicked) - 'Lösung auswählen + 'Lösung auswählen Call Me.selectSolution(ind) Catch ex As Exception @@ -1565,26 +1558,26 @@ Partial Public Class Form1 Dim isOK As Boolean - 'Lösung zu ausgewählten Lösungen hinzufügen + 'Lösung zu ausgewählten Lösungen hinzufügen isOK = Sim1.OptResult.selectSolution(ind.ID) If (isOK) Then - 'Lösungsdialog initialisieren + 'Lösungsdialog initialisieren If (IsNothing(Me.solutionDialog)) Then Me.solutionDialog = New SolutionDialog(Me.mProblem) End If - 'Lösungsdialog anzeigen + 'Lösungsdialog anzeigen Call Me.solutionDialog.Show() - 'Lösung zum Lösungsdialog hinzufügen + 'Lösung zum Lösungsdialog hinzufügen Call Me.solutionDialog.addSolution(ind) - 'Lösung im Hauptdiagramm anzeigen + 'Lösung im Hauptdiagramm anzeigen Call Me.Hauptdiagramm1.DrawSelectedSolution(ind) - 'Lösung in den Scatterplots anzeigen + 'Lösung in den Scatterplots anzeigen If (Not IsNothing(Me.scatterplot1)) Then Call Me.scatterplot1.showSelectedSolution(ind) End If @@ -1598,21 +1591,21 @@ Partial Public Class Form1 End If End If - 'Lösungsdialog nach vorne bringen + 'Lösungsdialog nach vorne bringen Call Me.solutionDialog.BringToFront() End Sub - 'Lösungsauswahl zurücksetzen + 'Lösungsauswahl zurücksetzen '*************************** Public Sub clearSelectedSolutions() - 'Serie der ausgewählten Lösungen löschen + 'Serie der ausgewählten Lösungen löschen '======================================= 'Im Hauptdiagramm '---------------- - Call Me.Hauptdiagramm1.LöscheAusgewählteLösungen() + Call Me.Hauptdiagramm1.LöscheAusgewählteLösungen() 'In den Scatterplot-Matrizen '--------------------------- @@ -1629,27 +1622,27 @@ Partial Public Class Form1 Call Me.customPlot.clearSelection() End If - 'Auswahl intern zurücksetzen + 'Auswahl intern zurücksetzen '=========================== Call Sim1.OptResult.clearSelectedSolutions() End Sub ''' - ''' Lösungsauswahl aktualisieren + ''' Lösungsauswahl aktualisieren ''' - ''' Array von Lösungs-IDs + ''' Array von Lösungs-IDs ''' Public Sub updateSelectedSolutions(ByVal selectedSolution_IDs() As Integer) - 'Selektierte Lösungen neu setzen + 'Selektierte Lösungen neu setzen Call Sim1.OptResult.clearSelectedSolutions() For Each id As Integer In selectedSolution_IDs Call Sim1.OptResult.selectSolution(id) Next 'Im Hauptdiagramm neu zeichnen - Call Me.Hauptdiagramm1.LöscheAusgewählteLösungen() + Call Me.Hauptdiagramm1.LöscheAusgewählteLösungen() For Each ind As Common.Individuum In Me.Sim1.OptResult.getSelectedSolutions Call Me.Hauptdiagramm1.DrawSelectedSolution(ind) Next @@ -1679,12 +1672,11 @@ Partial Public Class Form1 End Sub - 'ausgewählte Lösungen simulieren und in Wave anzeigen + 'ausgewählte Lösungen simulieren und in Wave anzeigen '**************************************************** Public Sub simulateSelectedSolutions(ByVal checkedSolution_IDs() As Integer) Dim isOK As Boolean - Dim isSWMM As Boolean Dim WorkDir_Prev, WorkDir As String Dim zre As Wave.TimeSeries @@ -1700,18 +1692,18 @@ Partial Public Class Form1 'Wait cursor Cursor = Cursors.WaitCursor - 'Simulationen in eigenen Unterverzeichnissen ausführen (ohne Threads), - 'WorDir_Current aber merken, und am Ende wieder zurücksetzen! + 'Simulationen in eigenen Unterverzeichnissen ausführen (ohne Threads), + 'WorDir_Current aber merken, und am Ende wieder zurücksetzen! WorkDir_Prev = Sim1.WorkDir_Current 'Wave instanzieren Dim Wave1 As New Wave.Wave() - 'Alle ausgewählten Lösungen durchlaufen + 'Alle ausgewählten Lösungen durchlaufen '====================================== For Each ind As Common.Individuum In Sim1.OptResult.getSelectedSolutions() - 'Lösung per Checkbox ausgewählt? + 'Lösung per Checkbox ausgewählt? '------------------------------- If (Not checkedSolution_IDs.Contains(ind.ID)) Then Continue For @@ -1734,13 +1726,7 @@ Partial Public Class Form1 'TODO: Simulationsfehler abfangen! - 'Sonderfall SWMM-Bechnung: keine Ganglinie anzuzeigen - If (TypeOf Me.Sim1 Is BlueM.Opt.Apps.SWMM) Then - isSWMM = True - Exit Sub - End If - - 'Zu zeichnenden Simulationsreihen zurücksetzen + 'Zu zeichnenden Simulationsreihen zurücksetzen SimSeries.Clear() 'zu zeichnenden Reihen aus Liste der Ziele raussuchen @@ -1757,8 +1743,8 @@ Partial Public Class Form1 If (objective.GetObjType = Common.ObjectiveFunction.ObjectiveType.Series) Then With CType(objective, Common.ObjectiveFunction_Series) 'Referenzreihen nur jeweils ein Mal zeichnen - 'TODO: Dieselbe Referenzreihe könnte aber mehrfach mit jeweils - ' unterschiedlichen Evaluierungszeiträumen definiert sein. + 'TODO: Dieselbe Referenzreihe könnte aber mehrfach mit jeweils + ' unterschiedlichen Evaluierungszeiträumen definiert sein. ' Dann sollte sie auch mehrfach gezeichnet werden. If (Not RefSeries.Contains(.RefSeriesFile & .RefName)) Then RefSeries.Add(.RefName, .RefSeriesFile & .RefName) @@ -1774,7 +1760,7 @@ Partial Public Class Form1 If (Not SimSeries.Contains(.SimResultName)) Then Call SimSeries.Add(.SimResultName, .SimResultName) zre = Sim1.SimResult.Series(.SimResultName).Clone() - 'Lösungsnummer an Titel anhängen + 'Lösungsnummer an Titel anhängen zre.Title &= $" (Solution {ind.ID})" 'Simreihe in Wave laden Call Wave1.Import_Series(zre) @@ -1790,7 +1776,7 @@ Partial Public Class Form1 '------------- Dim app As New BlueM.Wave.App(Wave1) - 'Simulationsverzeichnis zurücksetzen + 'Simulationsverzeichnis zurücksetzen Sim1.WorkDir_Current = WorkDir_Prev 'Cursor @@ -1798,13 +1784,13 @@ Partial Public Class Form1 End Sub -#End Region 'Lösungsauswahl +#End Region 'Lösungsauswahl #End Region 'Diagrammfunktionen #Region "Ergebnisdatenbank" - 'Ergebnis-Button hat selbst keine funktionalität -> nur DropDown + 'Ergebnis-Button hat selbst keine funktionalität -> nur DropDown '*************************************************************** Private Sub Button_ErgebnisDB_ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripSplitButton_ErgebnisDB.ButtonClick Call Me.ToolStripSplitButton_ErgebnisDB.ShowDropDown() @@ -1819,7 +1805,7 @@ Partial Public Class Form1 Try - 'Datei-öffnen Dialog anzeigen + 'Datei-öffnen Dialog anzeigen Me.OpenFileDialog1.Filter = "Access databases (*.mdb)|*.mdb" Me.OpenFileDialog1.Title = "Select result DB" Me.OpenFileDialog1.FileName = "" @@ -1900,7 +1886,7 @@ Partial Public Class Form1 Dim serie As Steema.TeeChart.Styles.Series Dim serie3D As Steema.TeeChart.Styles.Points3D - 'Lösungen + 'Lösungen '======== If (importDialog.ComboBox_SekPop.SelectedItem <> "exclusively") Then @@ -1909,7 +1895,7 @@ Partial Public Class Form1 If (Me.Hauptdiagramm1.ZielIndexZ = -1 And Me.Hauptdiagramm1.ZielIndexY = -1) Then '1D '-- - 'Constraintverletzung prüfen + 'Constraintverletzung prüfen If (ind.Is_Feasible) Then serie = Me.Hauptdiagramm1.getSeriesPoint("Population", "red") Else @@ -1920,7 +1906,7 @@ Partial Public Class Form1 ElseIf (Me.Hauptdiagramm1.ZielIndexZ = -1) Then '2D '-- - 'Constraintverletzung prüfen + 'Constraintverletzung prüfen If (ind.Is_Feasible) Then serie = Me.Hauptdiagramm1.getSeriesPoint("Population", "Orange") Else @@ -1931,7 +1917,7 @@ Partial Public Class Form1 Else '3D '-- - 'Constraintverletzung prüfen + 'Constraintverletzung prüfen If (ind.Is_Feasible) Then serie3D = Me.Hauptdiagramm1.getSeries3DPoint("Population", "Orange") Else @@ -1947,7 +1933,7 @@ Partial Public Class Form1 Call My.Application.DoEvents() - 'Sekundärpopulation + 'Sekundärpopulation '================== If (importDialog.ComboBox_SekPop.SelectedItem <> "none") Then @@ -2023,7 +2009,7 @@ Partial Public Class Form1 'Start-Button deaktivieren Me.Button_Start.Enabled = False - 'Simulationen vorbereiten (weil möglicherweise vorher noch nicht geschehen!) + 'Simulationen vorbereiten (weil möglicherweise vorher noch nicht geschehen!) Call Me.Sim1.prepareSimulation() End If @@ -2052,7 +2038,7 @@ Partial Public Class Form1 Try - 'Datei-öffnen Dialog anzeigen + 'Datei-öffnen Dialog anzeigen Me.OpenFileDialog1.Filter = "Access-Database (*.mdb)|*.mdb" Me.OpenFileDialog1.Title = "Result comparison: select optimization result" Me.OpenFileDialog1.FileName = "" @@ -2129,7 +2115,7 @@ Partial Public Class Form1 'Berechnung indicatorDiff = -HypervolumeDiff.calc_indicator() - 'Nadir-Punkt holen (für spätere Verwendung bei Referenz-Hypervolumen) + 'Nadir-Punkt holen (für spätere Verwendung bei Referenz-Hypervolumen) nadir = HypervolumeDiff.nadir 'In Zwischenablage kopieren @@ -2175,7 +2161,7 @@ Partial Public Class Form1 ''' Die Startwerte der Optparameter evaluieren ''' ''' boolean success - ''' nur für Sim-Anwendungen! + ''' nur für Sim-Anwendungen! Private Function evaluateStartwerte() As Boolean Dim isOK As Boolean diff --git a/BlueM.Opt/Main/My Project/AssemblyInfo.vb b/BlueM.Opt/Main/My Project/AssemblyInfo.vb index 753416fd..1e29c719 100644 --- a/BlueM.Opt/Main/My Project/AssemblyInfo.vb +++ b/BlueM.Opt/Main/My Project/AssemblyInfo.vb @@ -3,9 +3,9 @@ Imports System.Runtime.CompilerServices Imports System.Runtime.InteropServices Imports BlueM.Opt.Common.Constants -' Allgemeine Informationen über eine Assembly werden über die folgende -' Attributgruppe gesteuert. Ändern Sie diese Attributwerte, um die -' Assemblyinformationen zu ändern +' Allgemeine Informationen über eine Assembly werden über die folgende +' Attributgruppe gesteuert. Ändern Sie diese Attributwerte, um die +' Assemblyinformationen zu ändern @@ -13,22 +13,21 @@ Imports BlueM.Opt.Common.Constants & "BlueM.Opt is an optimization framework for optimization, autocalibration and sensitivity analysis of model parameters and the visualization thereof." & eol & eol _ & "Included simulation models:" & eol _ & "* BlueM.Sim v0.9.8 (https://www.bluemodel.org)" & eol _ - & "* SWMM v5.0.018 (http://www.epa.gov/ednnrmrl/models/swmm/)" & eol _ & "* Talsim (https://www.talsim.de/)")> - + -' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: ' Hauptversion ' Nebenversion ' Revision ' Buildnummer -' Sie können alle Werte festlegen, oder für Revision und Buildnummer den Standard +' Sie können alle Werte festlegen, oder für Revision und Buildnummer den Standard ' mit '*' verwenden. Siehe unten From 2d852a8286969223a14c7b181376e275dfc2ae49 Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 19:12:46 +0200 Subject: [PATCH 02/12] remove remaining traces of SMUSI #184 --- BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj | 3 - BlueM.Opt/Apps/SMUSI/Smusi.vb | 383 --------------------------- BlueM.Opt/Apps/Sim.vb | 100 +++---- BlueM.Opt/Common/Constants.vb | 1 - BlueM.Opt/Main/Form1.vb | 15 +- 5 files changed, 54 insertions(+), 448 deletions(-) delete mode 100644 BlueM.Opt/Apps/SMUSI/Smusi.vb diff --git a/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj b/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj index 4c7b240f..ee9e64dc 100644 --- a/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj +++ b/BlueM.Opt/Apps/BlueM.Opt.Apps.vbproj @@ -112,9 +112,6 @@ True
- - Code - diff --git a/BlueM.Opt/Apps/SMUSI/Smusi.vb b/BlueM.Opt/Apps/SMUSI/Smusi.vb deleted file mode 100644 index 48c5e9b4..00000000 --- a/BlueM.Opt/Apps/SMUSI/Smusi.vb +++ /dev/null @@ -1,383 +0,0 @@ -'BlueM.Opt -'Copyright (C) BlueM Dev Group -'Website: -' -'This program is free software: you can redistribute it and/or modify -'it under the terms of the GNU General Public License as published by -'the Free Software Foundation, either version 3 of the License, or -'(at your option) any later version. -' -'This program is distributed in the hope that it will be useful, -'but WITHOUT ANY WARRANTY; without even the implied warranty of -'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -'GNU General Public License for more details. -' -'You should have received a copy of the GNU General Public License -'along with this program. If not, see . -' -Imports System.IO -Imports IHWB.SMUSI.DllAdapter - -''' -''' Klasse SMUSI -''' Funktionen zur Kontrolle von SMUSI -''' -Public Class Smusi - Inherits Sim - -#Region "Eigenschaften" - - 'Eigenschaften - '############# - - Private Const useSmusiExe As Boolean = False 'true = EXE, false = DLL - - 'SMUSI DLL - '--------- - Private dll_path As String - Private smusi_dll As SMUSI_EngineDotNetAccess - -#End Region 'Eigenschaften - -#Region "Properties" - - ''' - ''' Alle Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können - ''' - ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) - Public Overrides ReadOnly Property DatensatzDateiendungen() As Collections.Specialized.StringCollection - Get - Dim exts As New Collections.Specialized.StringCollection() - - exts.AddRange(New String() {"ALL", "AUS", "BEK", "BKL", "BOF", "BWN", "DRO", - "EIN", "FKA", "JGG", "KLA", "RKL", "RUE", "SAM", - "SMZ", "SOP", "SYS", "TGG", "VER", "WIN", "WMB", - "XYZ"}) - - 'TODO: Dateiendungen für SMUSI-Datensatz auf Komplettheit prüfen - - Return exts - - End Get - End Property - - ''' - ''' Ob die Anwendung Multithreading unterstützt - ''' - ''' False - Public Overrides ReadOnly Property MultithreadingSupported() As Boolean - Get - Return False - End Get - End Property - -#End Region 'Properties - -#Region "Methoden" - - 'Methoden - '######## - - 'Konstruktor - '*********** - Public Sub New() - - Call MyBase.New() - - If (Not useSmusiExe) Then - - 'SMUSI DLL instanzieren - '---------------------- - Me.dll_path = IO.Path.Combine(System.Windows.Forms.Application.StartupPath(), "SMUSI\smusi.dll") - - If (File.Exists(Me.dll_path)) Then - Me.smusi_dll = New SMUSI_EngineDotNetAccess(Me.dll_path) - Else - Throw New Exception("SMUSI.dll nicht gefunden!") - End If - End If - - End Sub - - 'Simulationsparameter einlesen - '***************************** - Protected Overrides Sub Read_SimParameter() - - Dim SimStart_str As String = "" - Dim SimEnde_str As String = "" - - 'ALL-Datei öffnen - '---------------- - Dim Datei As String = IO.Path.Combine(Me.WorkDir_Original, Me.Datensatz & ".ALL") - - Dim FiStr As FileStream = New FileStream(Datei, FileMode.Open, IO.FileAccess.ReadWrite) - Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) - Dim StrReadSync As TextReader = TextReader.Synchronized(StrRead) - - 'Alle Zeilen durchlaufen - Dim Zeile As String - Do - Zeile = StrRead.ReadLine.ToString() - - 'Simulationszeitraum auslesen - If (Zeile.StartsWith(" SimBeginn - SimEnde")) Then - SimStart_str = Zeile.Substring(37, 16) - SimEnde_str = Zeile.Substring(56, 16) - Exit Do 'Sobald das Datum gefunden wurde, kann die schleife verlassen werden - End If - - Loop Until StrRead.Peek() = -1 - - 'Schließen der ALL-Datei - StrReadSync.Close() - StrRead.Close() - FiStr.Close() - - 'SimStart und SimEnde in echtes Datum konvertieren - Me.SimStart = New DateTime(SimStart_str.Substring(6, 4), SimStart_str.Substring(3, 2), SimStart_str.Substring(0, 2), SimStart_str.Substring(11, 2), SimStart_str.Substring(14, 2), 0) - Me.SimEnde = New DateTime(SimEnde_str.Substring(6, 4), SimEnde_str.Substring(3, 2), SimEnde_str.Substring(0, 2), SimEnde_str.Substring(11, 2), SimEnde_str.Substring(14, 2), 0) - - 'Zeitschrittweite ist immer 5 Minuten - Me.SimDT = New TimeSpan(0, 5, 0) - - End Sub - - 'SMUSI ausführen (simulieren) - '**************************** - Protected Overrides Function launchSim() As Boolean - - Dim simOK As Boolean - Dim SimCurrent, SimStart, SimEnde As DateTime - - If (useSmusiExe) Then - - 'verwende SMUSI.Win.exe - '---------------------- - Dim exe_path As String - Dim String1 As String - Dim String3 As String - Dim String4 As String - - exe_path = IO.Path.Combine(System.Windows.Forms.Application.StartupPath(), "SMUSI.WIN.exe") - String1 = exe_path - String3 = IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz & ".all") - String4 = """" - - Dim ExterneAnwendung As New System.Diagnostics.Process() - - ExterneAnwendung.StartInfo.FileName = String1 - ExterneAnwendung.StartInfo.Arguments = String4 & String3 & String4 - ExterneAnwendung.StartInfo.CreateNoWindow = True - ExterneAnwendung.Start() - - Do While (Not ExterneAnwendung.HasExited) - ExterneAnwendung.WaitForExit(250) - Loop - - If Not ExterneAnwendung.HasExited Then - ExterneAnwendung.Kill() - End If - ExterneAnwendung = Nothing - - - If File.Exists(IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz & ".sum")) Then - simOK = True - Else - simOK = False - End If - - Else - - 'verwende SMUSI.dll und SMUSI.DllAdapter.dll - '------------------------------------------- - - 'SMUSI DLL neu instanzieren (muss das sein?) - '------------------------------------------- - Me.smusi_dll = Nothing - - Me.smusi_dll = New SMUSI_EngineDotNetAccess(dll_path) - - 'Falls vorher schon initialisiert wurde - Call Me.smusi_dll.Finish() - Call Me.smusi_dll.Dispose() - - Try - - Call smusi_dll.Initialize(IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz)) - - 'Dim SimEnde As DateTime = SMUSI_EngineDotNetAccess.DateTime(smusi_dll.GetSimulationEndDate()) - - ''Simulationszeitraum - 'Do While (SMUSI_EngineDotNetAccess.DateTime(smusi_dll.GetCurrentTime) < SimEnde) - ' Call smusi_dll.PerformTimeStep() - 'Loop - 'Simulationsdaten auslesen - SimStart = SMUSI_EngineDotNetAccess.DateTime(smusi_dll.GetSimulationStartDate()) - SimEnde = SMUSI_EngineDotNetAccess.DateTime(smusi_dll.GetSimulationEndDate()) - SimCurrent = SimStart - Do While (SimCurrent < SimEnde) - - Call smusi_dll.PerformTimeStep() - 'Me.ProgressBar1.PerformStep() - - SimCurrent = SMUSI_EngineDotNetAccess.DateTime(smusi_dll.GetCurrentTime) - - 'If (SimCurrent.Hour = 0 And SimCurrent.Minute = 0) Then - ' 'Nach Warnungen überprüfen - ' 'Call checkForWarnings() - ' 'Anzeige aktualisieren - ' Me.Label_SimDate.Text = SimCurrent - 'End If - - Loop - - 'Simulation erfolgreich - simOK = True - - Catch ex As Exception - - 'Simulationsfehler aufgetreten - MsgBox(ex.Message, MsgBoxStyle.Exclamation, "SMUSI") - simOK = False - - Finally - - Call Me.smusi_dll.Finish() - Call Me.smusi_dll.Dispose() - - End Try - - Me.smusi_dll = Nothing - - End If - - Return simOK - - End Function - - 'TODO: SMUSI Thread-Funktionen - '############################# - Protected Overrides Function launchSim(ByVal Thread_ID As Integer, ByVal Child_ID As Integer) As Boolean - Return Me.launchSim() - End Function - - Protected Overrides Function ThreadFree(ByRef Thread_ID As Integer) As Boolean - Return True - End Function - - Protected Overrides Function ThreadReady(ByRef Thread_ID As Integer, ByRef SimIsOK As Boolean, ByVal Child_ID As Integer) As Boolean - Return True - End Function - - 'Simulationsergebnis verarbeiten - '------------------------------- - Protected Overrides Sub SIM_Ergebnis_Lesen() - - Dim datei As String, DateiPfad As String, element As String, Zeile As String - Dim ASCtmp As Wave.Fileformats.ASC - Dim SpalteVon As Long, SpalteLen As Long, BezVon As Integer - Dim blnValueAdded As Boolean - - 'Altes SimErgebnis löschen - Me.SimResult.Clear() - - 'Neu Steffen - For Each obj As Common.ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions - 'Unterscheidung nach ObjectiveType - Select Case obj.GetObjType - Case Common.ObjectiveFunction.ObjectiveType.Series - element = obj.SimResultName.Substring(0, 4) - datei = element & "_WEL.ASC" - ASCtmp = New Wave.Fileformats.ASC(IO.Path.Combine(Me.WorkDir_Current, datei), True) - 'Simulationsergebnis abspeichern - For Each zre As Wave.TimeSeries In ASCtmp.TimeSeries.Values - Me.SimResult.Series.Add(element & "_" & zre.Title, zre) - Next - ASCtmp = Nothing - 'Next - Case Common.ObjectiveFunction.ObjectiveType.Value - 'TODO: Umbauen, so dass Datei nicht jedes mal geoeffnet werden muss - '.RPT-Datei oeffnen - DateiPfad = IO.Path.Combine(WorkDir_Current, Datensatz & "." & obj.FileExtension) - Dim FiStr As FileStream = New FileStream(DateiPfad, FileMode.Open, IO.FileAccess.Read) - Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) - Dim KeyWord_Block As String - Dim tmpValue As Double - 'Datei durchgehen und mit Block und Spaltenangabe aus obj den gesuchten Wert ermitteln - 'und diesen dann in Sim_Ergebnis schreiben - Dim objValue As Common.Objectivefunction_Value - objValue = obj - Select Case objValue.Block - Case "EntlVolumen" - KeyWord_Block = "* Zulauf" - Select Case objValue.Column - Case "SumVol" - SpalteVon = 116 - SpalteLen = 10 - BezVon = 3 - Case Else - Throw New Exception("Das Schluesselwort für die Spalte ist ungueltig!") - End Select - Case "MaxAbfluss" - KeyWord_Block = "* Maximal" - Select Case objValue.Column - Case "Qmax" - SpalteVon = 22 - SpalteLen = 7 - BezVon = 3 - Case Else - Throw New Exception("Das Schluesselwort für die Spalte ist ungueltig!") - End Select - Case "EntlFracht" - KeyWord_Block = "* Schmutzfracht" - Select Case objValue.Column - Case "CSBspez" - SpalteVon = 108 - SpalteLen = 5 - BezVon = 27 - Case Else - Throw New Exception("Das Schluesselwort für die Spalte ist ungueltig!") - End Select - Case Else - Throw New Exception("Das Schluesselword für den Block ist ungueltig") - End Select - 'Datei durchgehen und nach Schluesselwort suchen - blnValueAdded = False - Do - Zeile = Trim(StrRead.ReadLine.ToString) - Debug.Print(Zeile) - If (Zeile.StartsWith(KeyWord_Block)) Then - Do - Zeile = StrRead.ReadLine.ToString - If (Trim(Zeile.Substring(BezVon, 4)) = obj.SimResultName) Then - tmpValue = Convert.ToDouble(Zeile.Substring(SpalteVon, SpalteLen)) - Me.SimResult.Values.Add(obj.Description, tmpValue) - blnValueAdded = True - Exit Do - End If - Loop Until StrRead.Peek() = -1 - End If - If blnValueAdded Then Exit Do - Loop Until StrRead.Peek() = -1 - StrRead.Close() - FiStr.Close() - - - Case Common.ObjectiveFunction.ObjectiveType.ValueFromSeries - 'TODO - Case Else - 'TODO - End Select - Next - 'Ende neu Steffen - - 'Dateien einlesen - - - 'elemente = Nothing - - End Sub - -#End Region 'Methoden - -End Class diff --git a/BlueM.Opt/Apps/Sim.vb b/BlueM.Opt/Apps/Sim.vb index 4f6affc4..5f50be5b 100644 --- a/BlueM.Opt/Apps/Sim.vb +++ b/BlueM.Opt/Apps/Sim.vb @@ -24,7 +24,7 @@ Imports BlueM ''' ''' Klasse Sim -''' Basisklasse für Simulationsmodelle wie BlueM und SMUSI +''' Basisklasse für Simulationsmodelle wie BlueM und Talsim ''' Public MustInherit Class Sim @@ -36,13 +36,13 @@ Public MustInherit Class Sim 'Generelle Eigenschaften '----------------------- ''' - ''' Eine StringCollection mit allen Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können + ''' Eine StringCollection mit allen Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können ''' - ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) + ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) Public MustOverride ReadOnly Property DatensatzDateiendungen() As Collections.Specialized.StringCollection ''' - ''' Die einen Datensatz repräsentierende Dateiendung (mit Punkt) + ''' Die einen Datensatz repräsentierende Dateiendung (mit Punkt) ''' Public ReadOnly Property DatensatzExtension() As String Get @@ -98,8 +98,8 @@ Public MustInherit Class Sim #Region "Events" ''' - ''' Wird ausgelöst, wenn ein Individuum, - ''' das in einem Array an die Evaluate() Methode übergeben wurde, + ''' Wird ausgelöst, wenn ein Individuum, + ''' das in einem Array an die Evaluate() Methode übergeben wurde, ''' erfolgreich evaluiert wurde ''' ''' das evaluierte Individuum @@ -113,7 +113,7 @@ Public MustInherit Class Sim ''' ''' Gibt an, ob evaluierte Individuen abgespeichert werden sollen ''' - ''' standardmässig True + ''' standardmässig True Public Property StoreIndividuals() As Boolean Get Return Me.mStoreIndividuals @@ -162,7 +162,7 @@ Public MustInherit Class Sim 'Simulationsergebnis instanzieren Me.SimResult.Clear() - 'Standardmässig OptResult verwenden + 'Standardmässig OptResult verwenden Me.mStoreIndividuals = True Me.isPause = False @@ -171,14 +171,14 @@ Public MustInherit Class Sim End Sub ''' - ''' Die Sim-Anwendung für die Simulation vorbereiten + ''' Die Sim-Anwendung für die Simulation vorbereiten ''' Public Overridable Sub prepareSimulation() - 'Datensätze für Multithreading kopieren + 'Datensätze für Multithreading kopieren Call Me.createThreadWorkDirs() - 'Standardmäßig in Ordner Thread_0 simulieren + 'Standardmäßig in Ordner Thread_0 simulieren Me.WorkDir_Current = Me.getThreadWorkDir(0) End Sub @@ -209,7 +209,7 @@ Public MustInherit Class Sim End Sub ''' - ''' Das Problem übergeben + ''' Das Problem übergeben ''' ''' Das Problem Public Overridable Sub setProblem(ByRef prob As BlueM.Opt.Common.Problem) @@ -264,7 +264,7 @@ Public MustInherit Class Sim ''' ''' Evaluiert ein einzelnes Individuum. - ''' Durchläuft alle Schritte vom Schreiben der Modellparameter bis zum Berechnen der Objectives. + ''' Durchläuft alle Schritte vom Schreiben der Modellparameter bis zum Berechnen der Objectives. ''' ''' das zu evaluierende Individuum ''' Ob das Individuum in OptResult-DB gespeichert werden soll @@ -279,7 +279,7 @@ Public MustInherit Class Sim '---------------------- Call Me.PREPARE_Evaluation_PES(ind.OptParameter) - 'Simulation ausführen + 'Simulation ausführen '-------------------- isOK = Me.launchSim() @@ -300,13 +300,13 @@ Public MustInherit Class Sim ''' ''' Evaluiert ein Array von Individuen - ''' Durchläuft alle Schritte vom Schreiben der Modellparameter bis zum Berechnen der Objectives. - ''' Erfolgreich evaluierte Individuen werden mit dem Event IndividuumEvaluated zurückgegeben. + ''' Durchläuft alle Schritte vom Schreiben der Modellparameter bis zum Berechnen der Objectives. + ''' Erfolgreich evaluierte Individuen werden mit dem Event IndividuumEvaluated zurückgegeben. ''' ''' Ein Array von zu evaluierenden Individuen ''' Ob das Individuum in OptResult-DB gespeichert werden soll - ''' True/False für jedes Individuum - ''' je nach Einstellung läuft die Evaluierung in multiplen Threads oder single-threaded ab + ''' True/False für jedes Individuum + ''' je nach Einstellung läuft die Evaluierung in multiplen Threads oder single-threaded ab Public Overloads Function Evaluate(ByRef inds() As BlueM.Opt.Common.Individuum, Optional ByVal storeInDB As Boolean = True) As Boolean() Dim isOK() As Boolean @@ -349,7 +349,7 @@ Public MustInherit Class Sim '---------------------- Call Me.PREPARE_Evaluation_PES(inds(n_ind_Run).OptParameter) - 'Simulation ausführen + 'Simulation ausführen '-------------------- SIM_Eval_is_OK = Me.launchSim(ThreadID_Free, n_ind_Run) @@ -362,14 +362,14 @@ Public MustInherit Class Sim Me.WorkDir_Current = Me.getThreadWorkDir(ThreadID_Ready) - 'HACK: Individuum für Auswertung temporär kopieren um ArrayMismatchException zu umgehen + 'HACK: Individuum für Auswertung temporär kopieren um ArrayMismatchException zu umgehen tmpind = inds(n_ind_Ready) 'Individuum auswerten Try Call Me.SIM_Ergebnis_auswerten(tmpind, storeInDB) - 'Individuum per Event zurückgeben + 'Individuum per Event zurückgeben RaiseEvent IndividuumEvaluated(tmpind, n_ind_Ready) isOK(n_ind_Ready) = True @@ -380,10 +380,10 @@ Public MustInherit Class Sim SIM_Eval_is_OK = False End Try - 'HACK: zurückkopieren (nötig?) + 'HACK: zurückkopieren (nötig?) inds(n_ind_Ready) = tmpind - 'Prüfen, ob alle Individuen fertig + 'Prüfen, ob alle Individuen fertig If (n_ind_Ready = n_individuals - 1) Then Ready = True End If @@ -430,7 +430,7 @@ Public MustInherit Class Sim 'Evaluieren isOK(i) = Me.Evaluate(inds(i), storeInDB) If (isOK(i)) Then - 'erfolgreich evaluiertes Individuum per Event zurückgeben + 'erfolgreich evaluiertes Individuum per Event zurückgeben RaiseEvent IndividuumEvaluated(inds(i), i) End If Next @@ -444,7 +444,7 @@ Public MustInherit Class Sim End Function - 'Evaluierung des SimModells für ParameterOptimierung - Steuerungseinheit + 'Evaluierung des SimModells für ParameterOptimierung - Steuerungseinheit '*********************************************************************** Private Sub PREPARE_Evaluation_PES(ByVal OptParams() As BlueM.Opt.Common.OptParameter) @@ -483,7 +483,7 @@ Public MustInherit Class Sim With Me.mProblem.List_ObjectiveFunctions(i) If (.isGroupLeader) Then - 'Aggregierte Ziele für später aufheben + 'Aggregierte Ziele für später aufheben aggregateIndices.Add(i) Else 'andere Ziele auswerten @@ -498,7 +498,7 @@ Public MustInherit Class Sim aggroziel = Me.mProblem.List_ObjectiveFunctions(j) - 'Zunächst zu Null setzen + 'Zunächst zu Null setzen ind.Objectives(j) = 0 'Alle Gruppenmitglieder suchen @@ -516,7 +516,7 @@ Public MustInherit Class Sim End With Next - 'Zielrichtung berücksichtigen + 'Zielrichtung berücksichtigen ind.Objectives(j) *= aggroziel.Direction Next @@ -525,7 +525,7 @@ Public MustInherit Class Sim ind.Constraints(i) = CalculateConstraint(Me.mProblem.List_Constraintfunctions(i)) Next - 'Lösung im OptResult abspeichern (und zu DB hinzufügen) + 'Lösung im OptResult abspeichern (und zu DB hinzufügen) If (Me.StoreIndividuals And storeInDB) Then Call Me.OptResult.addSolution(ind) End If @@ -538,7 +538,7 @@ Public MustInherit Class Sim Dim i As Integer Dim j As Integer - 'VG ---------- Zusatzroutine für kalibrierung des Tagesgangs + 'VG ---------- Zusatzroutine für kalibrierung des Tagesgangs 'VG Call VG_Kalibrierung_Tagesganglinie() 'VG ---------- Ende @@ -581,7 +581,7 @@ Public MustInherit Class Sim WriteCheck = True DateiPfad = IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz & "." & Me.mProblem.List_ModellParameter(i).Datei) - 'Datei öffnen + 'Datei öffnen FiStr = New FileStream(DateiPfad, FileMode.Open, IO.FileAccess.Read) StrRead = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) StrReadSync = TextReader.Synchronized(StrRead) @@ -600,7 +600,7 @@ Public MustInherit Class Sim StrRead.Close() FiStr.Close() - 'Anzahl verfügbarer Zeichen + 'Anzahl verfügbarer Zeichen AnzZeichen = Me.mProblem.List_ModellParameter(i).SpBis - Me.mProblem.List_ModellParameter(i).SpVon + 1 'Zeile einlesen und splitten @@ -615,7 +615,7 @@ Public MustInherit Class Sim StrRight = "" End If - 'Wert auf verfügbare Stellen kürzen + 'Wert auf verfügbare Stellen kürzen '---------------------------------- 'Auf ganze Zahl runden und zu String konvertieren WertStr = Convert.ToString(Convert.ToInt32(Me.Akt.ModPara(i), Common.Provider.FortranProvider)) @@ -624,21 +624,21 @@ Public MustInherit Class Sim 'Wert zu lang Throw New Exception($"The whole number part of the model parameter '{Me.mProblem.List_ModellParameter(i).Bezeichnung}' ({WertStr}) is longer than the number of available spaces!") End If - 'Anzahl verfügbarer Nachkommastellen = (Anzahl Zeichen) - (Anzahl Vorkommastellen) - (Punkt) + 'Anzahl verfügbarer Nachkommastellen = (Anzahl Zeichen) - (Anzahl Vorkommastellen) - (Punkt) 'Math.Round() akzeptiert max 15 Nachkommastellen AnzNachkomma = Math.Min(AnzZeichen - WertStr.Length - 1, 15) - 'Bei negativen Werten noch ein Zeichen für das Minuszeichen abziehen + 'Bei negativen Werten noch ein Zeichen für das Minuszeichen abziehen If Me.Akt.ModPara(i) < 0 Then AnzNachkomma -= 1 End If If AnzNachkomma > 0 Then - 'Runden auf verfügbare Stellen: + 'Runden auf verfügbare Stellen: WertStr = Convert.ToString(Math.Round(Me.Akt.ModPara(i), AnzNachkomma), Common.Provider.FortranProvider) Else 'Ganzzahligen Wert benutzen End If - 'Falls erforderlich, Wert mit Leerzeichen füllen + 'Falls erforderlich, Wert mit Leerzeichen füllen WertStr = WertStr.PadRight(AnzZeichen) 'Zeile wieder zusammensetzen @@ -664,7 +664,7 @@ Public MustInherit Class Sim End Sub - 'SimModell ausführen (simulieren) + 'SimModell ausführen (simulieren) '******************************** Protected MustOverride Overloads Function launchSim() As Boolean 'mit Threads: @@ -798,7 +798,7 @@ Public MustInherit Class Sim End Sub ''' - ''' Datensätze für Multithreading kopieren + ''' Datensätze für Multithreading kopieren ''' ''' True wenn fertig ''' Erstellt im bin-Ordner Verzeichnisse Thread_0 bis Thread_n mit Kopien des Original-Datensatzes @@ -809,7 +809,7 @@ Public MustInherit Class Sim Dim threadDir As String Dim binPath As String = System.Windows.Forms.Application.StartupPath() - 'Alte Thread-Ordner löschen + 'Alte Thread-Ordner löschen isOK = Me.deleteThreadWorkDirs() 'Datensatz in alle Thread-Ordner kopieren @@ -823,7 +823,7 @@ Public MustInherit Class Sim End Function ''' - ''' Gibt die relativen Pfade aller Datensatz-Dateien zurück + ''' Gibt die relativen Pfade aller Datensatz-Dateien zurück ''' ''' Das zu durchsuchende Verzeichnis ''' @@ -847,9 +847,9 @@ Public MustInherit Class Sim 'Dateiendung bestimmen If (File.Extension.Length > 0) Then ext = File.Extension.Substring(1).ToUpper() - 'Prüfen, ob es sich ume eine zu kopierende Datei handelt + 'Prüfen, ob es sich ume eine zu kopierende Datei handelt If (Me.DatensatzDateiendungen.Contains(ext)) Then - 'Relativen Pfad der Datei zu Array hinzufügen + 'Relativen Pfad der Datei zu Array hinzufügen ReDim Preserve paths(paths.Length) paths(paths.Length - 1) = File.Name End If @@ -859,11 +859,11 @@ Public MustInherit Class Sim 'Unterverzeichnisse rekursiv durchsuchen Dirs = DirInfo.GetDirectories("*.*") For Each dir As IO.DirectoryInfo In Dirs - 'versteckte und solution- sowie sensiplot-Verzeichnisse überspringen + 'versteckte und solution- sowie sensiplot-Verzeichnisse überspringen If Not (dir.Name.StartsWith(".") Or dir.Name.StartsWith("solution_") Or dir.Name.StartsWith("sensiplot_")) Then 'Pfade aus Unterverzeichnis holen subpaths = Me.getDatensatzFiles(dir.FullName) - 'Pfade zu Array hinzufügen + 'Pfade zu Array hinzufügen For Each subpath As String In subpaths subpath = dir.Name & "\" & subpath ReDim Preserve paths(paths.Length) @@ -877,10 +877,10 @@ Public MustInherit Class Sim End Function ''' - ''' Datensätze für Multithreading löschen + ''' Datensätze für Multithreading löschen ''' ''' True wenn fertig - ''' löscht die Ordner Thread_0 bis Thread_9 im bin-Verzeichnis + ''' löscht die Ordner Thread_0 bis Thread_9 im bin-Verzeichnis Private Function deleteThreadWorkDirs() As Boolean Dim i As Integer @@ -901,7 +901,7 @@ Public MustInherit Class Sim End Function ''' - ''' Gibt den Datensatz Ordner eines Threads zurück + ''' Gibt den Datensatz Ordner eines Threads zurück ''' ''' Die ID des Threads Protected Function getThreadWorkDir(ByVal Thread_ID As Integer) As String @@ -919,7 +919,7 @@ Public MustInherit Class Sim #Region "Misc" ''' - ''' Setzt den Datensatz zurück, + ''' Setzt den Datensatz zurück, ''' indem die Startwerte der OptParameter ''' in die Eingabedateien des Original-Datensatzordners ''' geschrieben werden @@ -946,7 +946,7 @@ Public MustInherit Class Sim 'Modellparameter schreiben Call Me.Write_ModellParameter() - 'Arbeitsverzeichnis zurücksetzen + 'Arbeitsverzeichnis zurücksetzen Me.WorkDir_Current = tmp End Sub diff --git a/BlueM.Opt/Common/Constants.vb b/BlueM.Opt/Common/Constants.vb index e84369b0..1102933f 100644 --- a/BlueM.Opt/Common/Constants.vb +++ b/BlueM.Opt/Common/Constants.vb @@ -35,7 +35,6 @@ Public Module Constants 'Anwendungen Public Const ANW_BLUEM As String = "BlueM.Sim" - Public Const ANW_SMUSI As String = "SMUSI" Public Const ANW_TALSIM As String = "TALSIM" Public Const ANW_TALSIM5 As String = "TALSIM5" Public Const ANW_TESTPROBLEMS As String = "Testproblems" diff --git a/BlueM.Opt/Main/Form1.vb b/BlueM.Opt/Main/Form1.vb index 43b2533f..fce38d93 100644 --- a/BlueM.Opt/Main/Form1.vb +++ b/BlueM.Opt/Main/Form1.vb @@ -145,7 +145,7 @@ Partial Public Class Form1 '--------- 'Liste der Anwendungen in ComboBox schreiben und Anfangseinstellung wählen Me.ComboBox_Anwendung.Items.Clear() - Me.ComboBox_Anwendung.Items.AddRange(New Object() {"", ANW_BLUEM, ANW_TALSIM, ANW_TALSIM5, ANW_TESTPROBLEMS, ANW_TSP}) 'ANW_SMUSI entfernt (#184) + Me.ComboBox_Anwendung.Items.AddRange(New Object() {"", ANW_BLUEM, ANW_TALSIM, ANW_TALSIM5, ANW_TESTPROBLEMS, ANW_TSP}) Me.ComboBox_Anwendung.SelectedIndex = 0 'Datensatz @@ -417,13 +417,6 @@ Partial Public Class Form1 Sim1 = New BlueM.Opt.Apps.BlueMSim() - Case ANW_SMUSI 'Anwendung Smusi - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - - 'Objekt der Klasse Smusi initialisieren - 'Sim1 = New BlueM.Opt.Apps.Smusi() - - Case ANW_TALSIM 'Anwendung TALSIM 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx @@ -904,7 +897,7 @@ Partial Public Class Form1 '================= Select Case Me.Anwendung - Case ANW_BLUEM, ANW_SMUSI, ANW_TALSIM, ANW_TALSIM5 + Case ANW_BLUEM, ANW_TALSIM, ANW_TALSIM5 'Bei allen Sim-Anwendungen '----------------------------------------------------- @@ -1037,7 +1030,7 @@ Partial Public Class Form1 Select Case Anwendung - Case ANW_BLUEM, ANW_SMUSI, ANW_TALSIM, ANW_TALSIM5 + Case ANW_BLUEM, ANW_TALSIM, ANW_TALSIM5 'Sim-Anwendungen 'Save settings to file @@ -1272,7 +1265,7 @@ Partial Public Class Form1 Call Testprobleme1.DiagInitialise(Me.Hauptdiagramm1) - Case ANW_BLUEM, ANW_SMUSI, ANW_TALSIM, ANW_TALSIM5 + Case ANW_BLUEM, ANW_TALSIM, ANW_TALSIM5 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Select Case Me.mProblem.Method From b1b2730645f49809599a4e125bb1e8eb1ab67fc6 Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 19:27:59 +0200 Subject: [PATCH 03/12] removed objective function type "Value" (was only used by SWMM and SMUSI) --- BlueM.Opt/Apps/Testprobleme/Testprobleme.vb | 60 ++++++------- BlueM.Opt/Common/BlueM.Opt.Common.vbproj | 1 - .../ObjectiveFunctions/ObjectiveFunction.vb | 7 +- .../Objectivefunction_Value.vb | 68 --------------- BlueM.Opt/Common/Problem.vb | 85 +++++-------------- BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt | 1 + 6 files changed, 56 insertions(+), 166 deletions(-) delete mode 100644 BlueM.Opt/Common/ObjectiveFunctions/Objectivefunction_Value.vb diff --git a/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb b/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb index 102fc0d4..b8983a3c 100644 --- a/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb +++ b/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb @@ -74,7 +74,7 @@ Public Class Testprobleme End Get End Property - 'gewähltes Testproblem holen + 'gewähltes Testproblem holen '*************************** Public ReadOnly Property selectedTestproblem() As String Get @@ -97,7 +97,7 @@ Public Class Testprobleme End Sub - 'Parameterübergabe + 'Parameterübergabe '***************** Public Sub getProblem(ByRef prob As BlueM.Opt.Common.Problem) @@ -106,7 +106,7 @@ Public Class Testprobleme 'Das Problem setzen Me.mProblem = prob - 'Je nach Datensatz/Testproblem initialisierungen durchführen + 'Je nach Datensatz/Testproblem initialisierungen durchführen Select Case Me.mSelectedTestproblem Case TP_SinusFunktion @@ -288,11 +288,11 @@ Public Class Testprobleme End Select - 'Das Problem mit Pseudo-Werten füllen + 'Das Problem mit Pseudo-Werten füllen ReDim Me.mProblem.List_ObjectiveFunctions(Me.mAnzZiele - 1) For i = 0 To Me.mProblem.NumObjectives - 1 'Check_SH: - Me.mProblem.List_ObjectiveFunctions(i) = New Common.Objectivefunction_Value() + Me.mProblem.List_ObjectiveFunctions(i) = New Common.ObjectiveFunction_Series() Me.mProblem.List_ObjectiveFunctions(i).isPrimObjective = True Me.mProblem.List_ObjectiveFunctions(i).Direction = EVO_DIRECTION.Minimization Next @@ -340,7 +340,7 @@ Public Class Testprobleme End Sub - 'Diagramm für Sinus-Funktion initialisieren + 'Diagramm für Sinus-Funktion initialisieren '******************************************* Private Sub DiagInitialise_SinusFunktion(ByRef Diag As BlueM.Opt.Diagramm.Hauptdiagramm) @@ -393,7 +393,7 @@ Public Class Testprobleme End Sub - 'Diagramm für Beale-Problem initialisieren + 'Diagramm für Beale-Problem initialisieren '***************************************** Private Sub DiagInitialise_BealeProblem(ByRef Diag As BlueM.Opt.Diagramm.Hauptdiagramm) @@ -424,7 +424,7 @@ Public Class Testprobleme Call Diag.DiagInitialise("Beale problem", achsen, Me.mProblem) - 'Linie für den Ausgangswert anzeigen + 'Linie für den Ausgangswert anzeigen colorline1 = New Steema.TeeChart.Tools.ColorLine(Diag.Chart) colorline1.AllowDrag = False colorline1.Axis = Diag.Axes.Left @@ -433,7 +433,7 @@ Public Class Testprobleme End Sub - 'Diagramm für Schwefel-Problem initialisieren + 'Diagramm für Schwefel-Problem initialisieren '******************************************** Private Sub DiagInitialise_SchwefelProblem(ByRef Diag As BlueM.Opt.Diagramm.Hauptdiagramm) @@ -473,7 +473,7 @@ Public Class Testprobleme Call Diag.DiagInitialise("Schwefel 2.4 problem", achsen, Me.mProblem) - 'Linie für den Ausgangswert anzeigen + 'Linie für den Ausgangswert anzeigen colorline1 = New Steema.TeeChart.Tools.ColorLine(Diag.Chart) colorline1.AllowDrag = False colorline1.Axis = Diag.Axes.Left @@ -482,7 +482,7 @@ Public Class Testprobleme End Sub - 'Diagramm für MultiObjective-Probleme initialisieren + 'Diagramm für MultiObjective-Probleme initialisieren '*************************************************** Private Sub DiagInitialise_MultiTestProb(ByRef Diag As BlueM.Opt.Diagramm.Hauptdiagramm) @@ -626,7 +626,7 @@ Public Class Testprobleme Case TP_ZitzlerDebT3 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'TODO: Titel der Serien (für Export) + 'TODO: Titel der Serien (für Export) Dim ArrayX(100) As Double Dim ArrayY(100) As Double @@ -710,7 +710,7 @@ Public Class Testprobleme End Sub - 'Diagramm für Box-Problem (3D) initialisieren + 'Diagramm für Box-Problem (3D) initialisieren '******************************************** Private Sub DiagInitialise_3D_Box(ByRef Diag As BlueM.Opt.Diagramm.Hauptdiagramm) @@ -834,7 +834,7 @@ Public Class Testprobleme End Sub - 'Diagramm für Ackley function initialisieren (3D) + 'Diagramm für Ackley function initialisieren (3D) '************************************************ Private Sub DiagInitialise_Ackley(ByRef Diag As BlueM.Opt.Diagramm.Hauptdiagramm) @@ -920,7 +920,7 @@ Public Class Testprobleme End Sub - 'Diagramm für Abhängige Parameter initialisieren + 'Diagramm für Abhängige Parameter initialisieren '*********************************************** Private Sub DiagInitialise_AbhParameter(ByRef Diag As BlueM.Opt.Diagramm.Hauptdiagramm) @@ -1059,7 +1059,7 @@ Public Class Testprobleme Case TP_BealeProblem 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswert berechnen + 'Qualitätswert berechnen '----------------------- x1 = -5 + (ind.OptParameter(0).Xn * 10) x2 = -2 + (ind.OptParameter(1).Xn * 4) @@ -1074,7 +1074,7 @@ Public Class Testprobleme Case TP_Schwefel24Problem 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswert berechnen + 'Qualitätswert berechnen '----------------------- ReDim x_arr(globalAnzPar - 1) For i = 0 To globalAnzPar - 1 @@ -1097,7 +1097,7 @@ Public Class Testprobleme Case TP_Deb1 'Deb 2000, D1 (Konvexe Pareto-Front) 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswert berechnen + 'Qualitätswert berechnen '----------------------- ind.Objectives(0) = ind.OptParameter(0).Xn * (9 / 10) + 0.1 ind.Objectives(1) = (1 + 5 * ind.OptParameter(1).Xn) / (ind.OptParameter(0).Xn * (9 / 10) + 0.1) @@ -1110,7 +1110,7 @@ Public Class Testprobleme Case TP_ZitzlerDebT1 'Zitzler/Deb/Thiele 2000, T1 (Konvexe Pareto-Front) 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswert berechnen + 'Qualitätswert berechnen '----------------------- f1 = ind.OptParameter(0).Xn f2 = 0 @@ -1130,7 +1130,7 @@ Public Class Testprobleme Case TP_ZitzlerDebT2 'Zitzler/Deb/Thiele 2000, T2 (Non-Konvexe Pareto-Front) 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswerte berechnen + 'Qualitätswerte berechnen '------------------------ f1 = ind.OptParameter(0).Xn f2 = 0 @@ -1150,7 +1150,7 @@ Public Class Testprobleme Case TP_ZitzlerDebT3 'Zitzler/Deb/Thiele 2000, T3 (disconected Pareto-Front) 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswerte berechnen + 'Qualitätswerte berechnen '------------------------ f1 = ind.OptParameter(0).Xn f2 = 0 @@ -1170,7 +1170,7 @@ Public Class Testprobleme Case TP_ZitzlerDebT4 'Zitzler/Deb/Thiele 2000, T4 (local/global Pareto-Fronts) 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswerte berechnen + 'Qualitätswerte berechnen '------------------------ f1 = ind.OptParameter(0).Xn f2 = 0 @@ -1191,7 +1191,7 @@ Public Class Testprobleme Case TP_CONSTR 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswerte berechnen + 'Qualitätswerte berechnen '------------------------ f1 = ind.OptParameter(0).Xn * (9 / 10) + 0.1 f2 = (1 + 5 * ind.OptParameter(1).Xn) / (ind.OptParameter(0).Xn * (9 / 10) + 0.1) @@ -1210,10 +1210,10 @@ Public Class Testprobleme 'Zeichnen '-------- If (Not ind.Is_Feasible) Then - 'Ungültige Lösung + 'Ungültige Lösung serie = Diag.getSeriesPoint("Population (invalid)", "Gray", Steema.TeeChart.Styles.PointerStyles.Circle, 2) Else - 'Gültige Lösung + 'Gültige Lösung serie = Diag.getSeriesPoint("Population", "Orange", Steema.TeeChart.Styles.PointerStyles.Circle, 2) End If serie.Add(ind.Objectives(0), ind.Objectives(1)) @@ -1221,7 +1221,7 @@ Public Class Testprobleme Case TP_Box 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswerte berechnen + 'Qualitätswerte berechnen '------------------------ ind.Objectives(0) = ind.OptParameter(0).Xn ind.Objectives(1) = ind.OptParameter(1).Xn @@ -1236,10 +1236,10 @@ Public Class Testprobleme '-------- Dim serie3D As Steema.TeeChart.Styles.Points3D If (Not ind.Is_Feasible) Then - 'Ungültige Lösung + 'Ungültige Lösung serie3D = Diag.getSeries3DPoint("Population (invalid)", "Gray") Else - 'Gültige Lösung + 'Gültige Lösung serie3D = Diag.getSeries3DPoint("Population", "Orange") End If serie3D.Add(ind.Objectives(0), ind.Objectives(1), ind.Objectives(2)) @@ -1247,7 +1247,7 @@ Public Class Testprobleme Case TP_DependentParameters 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - 'Qualitätswerte berechnen + 'Qualitätswerte berechnen '------------------------ ind.Objectives(0) = ind.OptParameter(0).Xn ^ 2 + ind.OptParameter(1).Xn ^ 2 @@ -1317,7 +1317,7 @@ Public Class Testprobleme serie.Add(ind.Objectives(0), ind.Objectives(1)) Case TP_Ackley - 'Qualitätswert berechnen + 'Qualitätswert berechnen '----------------------- x = ind.OptParameter(0).RWert y = ind.OptParameter(1).RWert diff --git a/BlueM.Opt/Common/BlueM.Opt.Common.vbproj b/BlueM.Opt/Common/BlueM.Opt.Common.vbproj index c8d0fabe..1e823c18 100644 --- a/BlueM.Opt/Common/BlueM.Opt.Common.vbproj +++ b/BlueM.Opt/Common/BlueM.Opt.Common.vbproj @@ -92,7 +92,6 @@ - diff --git a/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb b/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb index b728a0a2..aa4bdf13 100644 --- a/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb +++ b/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb @@ -19,7 +19,7 @@ Imports System.Globalization Imports BlueM ''' -''' Klasse für die Definition von Objective Funktionen +''' Klasse für die Definition von Objective Funktionen ''' Public MustInherit Class ObjectiveFunction @@ -46,7 +46,6 @@ Public MustInherit Class ObjectiveFunction Public Enum ObjectiveType As Integer Series = 1 - Value = 2 ValueFromSeries = 3 Aggregate = 5 End Enum @@ -272,7 +271,7 @@ Public MustInherit Class ObjectiveFunction Next objectiveValue = sUnter - Case "NGT", "NÜBER" + Case "NGT", "NÜBER" 'Relative number of timesteps where simulation is greater than reference [%] '--------------------------------------------------------------------------- Dim nUeber As Integer = 0 @@ -283,7 +282,7 @@ Public MustInherit Class ObjectiveFunction Next objectiveValue = nUeber / SimSeries.Length * 100 - Case "SGT", "SÜBER" + Case "SGT", "SÜBER" 'Sum of simulation values greater than reference '----------------------------------------------- Dim sUeber As Double = 0 diff --git a/BlueM.Opt/Common/ObjectiveFunctions/Objectivefunction_Value.vb b/BlueM.Opt/Common/ObjectiveFunctions/Objectivefunction_Value.vb deleted file mode 100644 index dba47cb1..00000000 --- a/BlueM.Opt/Common/ObjectiveFunctions/Objectivefunction_Value.vb +++ /dev/null @@ -1,68 +0,0 @@ -'BlueM.Opt -'Copyright (C) BlueM Dev Group -'Website: -' -'This program is free software: you can redistribute it and/or modify -'it under the terms of the GNU General Public License as published by -'the Free Software Foundation, either version 3 of the License, or -'(at your option) any later version. -' -'This program is distributed in the hope that it will be useful, -'but WITHOUT ANY WARRANTY; without even the implied warranty of -'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -'GNU General Public License for more details. -' -'You should have received a copy of the GNU General Public License -'along with this program. If not, see . -' -Public Class Objectivefunction_Value - Inherits ObjectiveFunction - - ''' - ''' Returns the type of the ObjectiveFunction - ''' - Public Overrides ReadOnly Property GetObjType() As ObjectiveType - Get - Return ObjectiveType.Value - End Get - End Property - - ''' - ''' Reference value - ''' - Public RefValue As Double - - ''' - ''' Section (block) in which the target variable is located - ''' - Public Block As String - - ''' - ''' Target variable (column) within the block - ''' - Public Column As String - - ''' - ''' Calculate ObjectiveFunction value - ''' - ''' simulation result - ''' objective function value - Public Overrides Function calculateObjective(ByVal SimResult As SimResults) As Double - - Dim SimValue As Double - Dim objectiveValue As Double - - 'SimWert aus SimErgebnis rausholen - SimValue = SimResult.Values(Me.Description) - - 'Wertevergleich ausführen - objectiveValue = ObjectiveFunction.compareValues(SimValue, Me.RefValue, Me.Function) - - 'Zielrichtung berücksichtigen - objectiveValue *= Me.Direction - - Return objectiveValue - - End Function - -End Class diff --git a/BlueM.Opt/Common/Problem.vb b/BlueM.Opt/Common/Problem.vb index 23afa629..2e7cb287 100644 --- a/BlueM.Opt/Common/Problem.vb +++ b/BlueM.Opt/Common/Problem.vb @@ -20,7 +20,7 @@ Imports BlueM ''' ''' Klasse Problem -''' Definiert das zu lösende Optimierungsproblem +''' Definiert das zu lösende Optimierungsproblem ''' Public Class Problem @@ -62,7 +62,7 @@ Public Class Problem ''' ''' Liste der Objective Functions ''' - ''' Enthält sowohl Objective Functions als auch PrimaryObjectiveFunctions + ''' Enthält sowohl Objective Functions als auch PrimaryObjectiveFunctions Public List_ObjectiveFunctions() As ObjectiveFunction ''' ''' Liste der Constraint Functions @@ -279,7 +279,7 @@ Public Class Problem '----------- 'Modell-/Optparameter validieren Call Me.Validate_OPT_fits_to_MOD() - 'Prüfen der Anfangswerte + 'Prüfen der Anfangswerte Call Me.Validate_Startvalues() @@ -315,7 +315,7 @@ Public Class Problem ReDim List_OptParameter(AnzParam - 1) - 'Zurück zum Dateianfang und lesen + 'Zurück zum Dateianfang und lesen FiStr.Seek(0, SeekOrigin.Begin) Dim array() As String @@ -383,7 +383,7 @@ Public Class Problem ReDim Me.List_ModellParameter(AnzParam - 1) - 'Zurück zum Dateianfang und lesen + 'Zurück zum Dateianfang und lesen FiStr.Seek(0, SeekOrigin.Begin) Dim array() As String @@ -424,7 +424,6 @@ Public Class Problem Private Sub Read_OBF(ByVal SimStart As DateTime, ByVal SimEnde As DateTime) Const AnzSpalten_ObjFSeries As Integer = 13 'Anzahl Spalten Reihenvergleich in der OBF-Datei - Const AnzSpalten_ObjFValue As Integer = 12 'Anzahl Spalten Wertevergleich in der OBF-Datei Const AnzSpalten_ObjFValueFromSeries As Integer = 13 'Anzahl Spalten Reihenwertevergleich in der OBF-Datei Const AnzSpalten_ObjFAggregate As Integer = 5 'Anzahl Spalten Aggregierte Ziele in der OBF-Datei @@ -454,7 +453,7 @@ Public Class Problem If Zeile.StartsWith("*Series") Then currentObjectiveType = ObjectiveFunction.ObjectiveType.Series ElseIf Zeile.StartsWith("*Values") Then - currentObjectiveType = ObjectiveFunction.ObjectiveType.Value + Throw New Exception("The block ""*Values"" is no longer supported in the OBF file!") ElseIf Zeile.StartsWith("*ValueFromSeries") Then currentObjectiveType = ObjectiveFunction.ObjectiveType.ValueFromSeries ElseIf Zeile.StartsWith("*Aggregate") Then @@ -529,46 +528,6 @@ Public Class Problem Me.List_ObjectiveFunctions(i) = Objective_Series i += 1 - Case ObjectiveFunction.ObjectiveType.Value - - 'Wertevergleich - '============== - - 'Kontrolle - If (WerteArray.GetUpperBound(0) <> AnzSpalten_ObjFValue + 1) Then - Throw New Exception("The block ""Values"" in the OBF input file has the wrong number of columns!") - End If - - 'ObjectiveFunction instanzieren - Dim Objective_Value As New Common.Objectivefunction_Value() - - 'Gemeinsame Spalten einlesen - Call Me.Read_OBF_CommonColumns(Objective_Value, Zeile) - - 'Restliche Spalten einlesen - With Objective_Value - .Block = WerteArray(9).Trim() - .Column = WerteArray(10).Trim() - If (WerteArray(11).Trim() <> "") Then - .RefValue = Convert.ToDouble(WerteArray(11).Trim(), Common.Provider.FortranProvider) - End If - If (WerteArray(12).Trim() <> "") Then - .hasCurrentValue = True - .CurrentValue = Convert.ToDouble(WerteArray(12).Trim(), Common.Provider.FortranProvider) - 'Reverse the sign for objective functions that should be maximized (#198) - If .Direction = EVO_DIRECTION.Maximization Then - .CurrentValue = .CurrentValue * -1 - End If - Else - .hasCurrentValue = False - End If - End With - - 'Neue ObjectiveFunction abspeichern - ReDim Preserve Me.List_ObjectiveFunctions(i) - Me.List_ObjectiveFunctions(i) = Objective_Value - i += 1 - Case ObjectiveFunction.ObjectiveType.ValueFromSeries 'ReihenWertevergleich @@ -754,13 +713,13 @@ Public Class Problem Throw New Exception($"Unable to read reference series '{filePath}'!{eol}Error: {ex.Message}", ex) End Try - 'Zeitraum der Referenzreihe überprüfen + 'Zeitraum der Referenzreihe überprüfen If (refSeries.StartDate > EvalStart Or refSeries.EndDate < EvalEnde) Then 'Referenzreihe deckt Evaluierungszeitraum nicht ab Throw New Exception($"The reference series '{filePath}' does not cover the evaluation period!") End If - 'Referenzreihe auf Evaluierungszeitraum kürzen + 'Referenzreihe auf Evaluierungszeitraum kürzen Call refSeries.Cut(EvalStart, EvalEnde) If refSeries.Length = 0 Then Throw New Exception($"The reference series '{filePath}' is empty after cutting to the evaluation period!") @@ -789,7 +748,7 @@ Public Class Problem 'Format: '*|---------------|----------|-------|-----------|------------|----------------------|-----------------------------| '*| | | | | | Grenzwert | Grenzreihe | - '*| Bezeichnung | GrenzTyp | Datei | SimGröße | Oben/Unten | WertTyp | Grenzwert | Grenzgröße | Datei | + '*| Bezeichnung | GrenzTyp | Datei | SimGröße | Oben/Unten | WertTyp | Grenzwert | Grenzgröße | Datei | '*|---------------|----------|-------|-----------|------------|----------|-----------|------------|----------------| Dim i As Integer @@ -865,7 +824,7 @@ Public Class Problem .GrenzReihe = fileInstance.getTimeSeries(.GrenzGr) End If - 'Zeitraum der Grenzwertreihe überprüfen + 'Zeitraum der Grenzwertreihe überprüfen '-------------------------------------- GrenzStart = .GrenzReihe.StartDate GrenzEnde = .GrenzReihe.EndDate @@ -874,7 +833,7 @@ Public Class Problem 'Grenzwertreihe deckt Simulationszeitraum nicht ab Throw New Exception($"Constraints: The threshold series '{ .GrenzReiheDatei}' does not cover the simulation period!") Else - 'Zielreihe auf Simulationszeitraum kürzen + 'Zielreihe auf Simulationszeitraum kürzen Call .GrenzReihe.Cut(SimStart, SimEnde) If .GrenzReihe.Length = 0 Then Throw New Exception($"Constraints: The threshold series '{ .GrenzReiheDatei}' is empty after cutting to the simulation period!") @@ -901,7 +860,7 @@ Public Class Problem ''' - ''' Prüft ob Optparameter und Modellparameter zusammenpassen + ''' Prüft ob Optparameter und Modellparameter zusammenpassen ''' Private Sub Validate_OPT_fits_to_MOD() @@ -910,7 +869,7 @@ Public Class Problem Dim isValid_B As Boolean = True Dim isValid As Boolean = False - 'A: Prüfung ob für jeden OptParameter mindestens ein Modellparameter existiert + 'A: Prüfung ob für jeden OptParameter mindestens ein Modellparameter existiert For i = 0 To List_OptParameter.GetUpperBound(0) isValid = False For j = 0 To List_ModellParameter.GetUpperBound(0) @@ -923,7 +882,7 @@ Public Class Problem End If Next - 'B: Prüfung ob jeder ModellParameter einem richtigen OptParameter zugewiesen ist. + 'B: Prüfung ob jeder ModellParameter einem richtigen OptParameter zugewiesen ist. For i = 0 To List_ModellParameter.GetUpperBound(0) isValid = False For j = 0 To List_OptParameter.GetUpperBound(0) @@ -947,7 +906,7 @@ Public Class Problem End Sub ''' - ''' Prüft ob die Startwerte der OptParameter innerhalb der Min und Max Grenzen liegen + ''' Prüft ob die Startwerte der OptParameter innerhalb der Min und Max Grenzen liegen ''' Private Sub Validate_Startvalues() Dim i As Integer @@ -960,7 +919,7 @@ Public Class Problem End Sub '''' - '''' Validierungsfunktion der Ziele Datei (Objectives), prüft ob die Gruppenzuordnung passt + '''' Validierungsfunktion der Ziele Datei (Objectives), prüft ob die Gruppenzuordnung passt '''' 'Public Sub Validate_Objectives() @@ -992,8 +951,8 @@ Public Class Problem ''' ''' ''' Beta-Version - erlaubt Kalirbierung der Tagesganlinie - ''' dafür muss für den jeweiligen Tagesgangwert in der .mod Datei in der Spalte "Elem" "TGG_QH" eingetragen werden - ''' Vorschlag: Aktivierung der kalibrierung des Tagesganlinie über einen Schalter, damit diese Funktion nicht bei jeder optimierung aufgerufen wird + ''' dafür muss für den jeweiligen Tagesgangwert in der .mod Datei in der Spalte "Elem" "TGG_QH" eingetragen werden + ''' Vorschlag: Aktivierung der kalibrierung des Tagesganlinie über einen Schalter, damit diese Funktion nicht bei jeder optimierung aufgerufen wird ''' Kontakt: Valentin Gamerith ''' Private Sub VG_Kalibrierung_Tagesganglinie() @@ -1018,13 +977,13 @@ Public Class Problem Next End If Next - 'Überprüft ob 24 Werte zugeordnet wurden + 'Überprüft ob 24 Werte zugeordnet wurden If VG_check_24 = 24 Then 'Faktor um auf 24 zu kommen:Xi = Xsim,i * n/Summe(Xi,Sim) VG_Faktor = VG_check_24 / VG_sum_TGG For i = 0 To List_ModellParameter.GetUpperBound(0) If Trim(List_ModellParameter(i).Element) = "TGG_QH" Then - List_ModellParameter(i).Faktor = VG_Faktor 'setzt den Faktor für den jeweiligen Tagesgangwert + List_ModellParameter(i).Faktor = VG_Faktor 'setzt den Faktor für den jeweiligen Tagesgangwert End If Next Else @@ -1032,10 +991,10 @@ Public Class Problem End Sub ''' - ''' Gibt ein neues Individuum zurück, dessen Optparameter alle auf die Startwerte gesetzt sind + ''' Gibt ein neues Individuum zurück, dessen Optparameter alle auf die Startwerte gesetzt sind ''' ''' - ''' Das Individuum erhält die ID 1 + ''' Das Individuum erhält die ID 1 Public Function getIndividuumStart() As BlueM.Opt.Common.Individuum Dim startind As BlueM.Opt.Common.Individuum diff --git a/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt b/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt index b4a9f55b..23491753 100644 --- a/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt +++ b/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt @@ -13,6 +13,7 @@ CHANGED: REMOVED: * Removed support for SWMM #231 +* Removed support for reading objective functions of type "Values" from OBF files Version 2.5.0 ------------- From 2c8383f0c5861c7613d14161328d35df15465c1c Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 19:37:56 +0200 Subject: [PATCH 04/12] remove mention of ASC result files --- BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb b/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb index aa4bdf13..6cdc30f3 100644 --- a/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb +++ b/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb @@ -76,7 +76,7 @@ Public MustInherit Class ObjectiveFunction Public Factor As Double ''' - ''' File extension of the result file from which to read the simulation result, e.g. "WEL", "ASC", "KTR.WEL", "WBL", etc. + ''' File extension of the result file from which to read the simulation result, e.g. "WEL", "KTR.WEL", "WBL", etc. ''' Public FileExtension As String From 5246ad426f1cf0d1a9d0a221a18b9dce7525d96d Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 20:34:24 +0200 Subject: [PATCH 05/12] remove deprecated objective functions "NashSutt" and "LnNashSutt" --- .../Common/ObjectiveFunctions/ObjectiveFunction.vb | 12 ------------ BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt | 1 + 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb b/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb index 6cdc30f3..96b22692 100644 --- a/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb +++ b/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb @@ -385,18 +385,6 @@ Public MustInherit Class ObjectiveFunction Dim variabilityratio As Double = (std_sim / avg_sim) / (std_obs / avg_obs) objectiveValue = 1 - Math.Sqrt((corr - 1) ^ 2 + (biasratio - 1) ^ 2 + (variabilityratio - 1) ^ 2) - Case "NASHSUTT" - 'Modified Nash Sutcliffe (deprecated) - '1 - NSE - '------------------------------------ - objectiveValue = 1.0 - compareSeries(SimSeries, RefSeries, "NSE") - - Case "LNNASHSUTT" - 'Modified Logarithmic Nash Sutcliffe (deprecated) - '1 - lnNSE - '------------------------------------------------ - objectiveValue = 1.0 - compareSeries(SimSeries, RefSeries, "lnNSE") - Case Else Throw New Exception($"The objective function '{[Function]}' is not supported for series comparisons!") diff --git a/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt b/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt index 23491753..b8bcf228 100644 --- a/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt +++ b/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt @@ -14,6 +14,7 @@ CHANGED: REMOVED: * Removed support for SWMM #231 * Removed support for reading objective functions of type "Values" from OBF files +* Removed deprecated objective functions "NashSutt" and "LnNashSutt" (use "NSE" or "lnNSE" instead) Version 2.5.0 ------------- From 07ec3e3d1f62c6cb5763e3390c428a735e36c684 Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 20:49:57 +0200 Subject: [PATCH 06/12] IDE0140 Simplify object creation --- BlueM.Opt/Apps/BlueM/BlueM.vb | 74 +++++++++++++-------------- BlueM.Opt/Common/Problem.vb | 12 ++--- BlueM.Opt/OptResult/OptResult.vb | 86 ++++++++++++++++---------------- 3 files changed, 86 insertions(+), 86 deletions(-) diff --git a/BlueM.Opt/Apps/BlueM/BlueM.vb b/BlueM.Opt/Apps/BlueM/BlueM.vb index 4d4c11f4..fd6c3b38 100644 --- a/BlueM.Opt/Apps/BlueM/BlueM.vb +++ b/BlueM.Opt/Apps/BlueM/BlueM.vb @@ -51,9 +51,9 @@ Public Class BlueMSim #Region "Properties" ''' - ''' Alle Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können + ''' Alle Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können ''' - ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) + ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) Public Overrides ReadOnly Property DatensatzDateiendungen() As Collections.Specialized.StringCollection Get Dim exts As New Collections.Specialized.StringCollection() @@ -70,7 +70,7 @@ Public Class BlueMSim End Property ''' - ''' Ob die Anwendung Multithreading unterstützt + ''' Ob die Anwendung Multithreading unterstützt ''' ''' True Public Overrides ReadOnly Property MultithreadingSupported() As Boolean @@ -169,12 +169,12 @@ Public Class BlueMSim Dim Ganglinie As String = "" Dim CSV_Format As String = "" - 'ALL-Datei öffnen + 'ALL-Datei öffnen '---------------- Dim Datei As String = IO.Path.Combine(Me.WorkDir_Original, Me.Datensatz & ".ALL") - Dim FiStr As FileStream = New FileStream(Datei, FileMode.Open, IO.FileAccess.Read) - Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New FileStream(Datei, FileMode.Open, IO.FileAccess.Read) + Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) 'Alle Zeilen durchlaufen Dim Zeile As String @@ -192,12 +192,12 @@ Public Class BlueMSim SimDT_str = Zeile.Substring(35).Trim End If - 'Überprüfen ob die Ganglinien (.WEL Datei) ausgegeben wird + 'Überprüfen ob die Ganglinien (.WEL Datei) ausgegeben wird If (Zeile.StartsWith(" Ganglinienausgabe ....... [J/N] :")) Then Ganglinie = Zeile.Substring(35).Trim End If - 'Überprüfen ob CSV Format eingeschaltet ist + 'Überprüfen ob CSV Format eingeschaltet ist If (Zeile.StartsWith(" ... CSV-Format .......... [J/N] :")) Then CSV_Format = Zeile.Substring(35).Trim End If @@ -218,7 +218,7 @@ Public Class BlueMSim 'Fehlermeldung CSv Format nicht eingeschaltet If CSV_Format <> "J" Then - Throw New Exception("Das CSV Format für die .WEL Datei ist nicht eingeschaltet. Bitte in .ALL unter '... CSV-Format' einschalten.") + Throw New Exception("Das CSV Format für die .WEL Datei ist nicht eingeschaltet. Bitte in .ALL unter '... CSV-Format' einschalten.") End If @@ -228,7 +228,7 @@ Public Class BlueMSim #Region "Evaluierung" - 'Gibt zurück ob ein beliebiger Thread beendet ist und ibt die ID diesen freien Threads zurück + 'Gibt zurück ob ein beliebiger Thread beendet ist und ibt die ID diesen freien Threads zurück '******************************************************************************************** Protected Overrides Function ThreadFree(ByRef Thread_ID As Integer) As Boolean ThreadFree = False @@ -243,8 +243,8 @@ Public Class BlueMSim End Function - 'BlauesModell ausführen (simulieren) - 'Startet einen neuen Thread und übergibt ihm die Child ID + 'BlauesModell ausführen (simulieren) + 'Startet einen neuen Thread und übergibt ihm die Child ID '******************************************************** Protected Overrides Function launchSim(ByVal Thread_ID As Integer, ByVal Child_ID As Integer) As Boolean @@ -262,7 +262,7 @@ Public Class BlueMSim End Function - 'BlueM ohne Thread ausführen + 'BlueM ohne Thread ausführen '*************************** Protected Overrides Function launchSim() As Boolean @@ -270,7 +270,7 @@ Public Class BlueMSim Try - 'Datensatz übergeben und initialisieren + 'Datensatz übergeben und initialisieren Call bluem_dll(0).Initialize(IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz)) Dim SimEnde As DateTime = BlueM_EngineDotNetAccess.BlueMDate2DateTime(bluem_dll(0).GetSimulationEndDate()) @@ -308,8 +308,8 @@ Public Class BlueMSim End Function - 'Prüft ob des aktuelle Child mit der ID die oben übergeben wurde fertig ist - 'Gibt die Thread ID zurück um zum auswerten in das Arbeitsverzeichnis zu wechseln + 'Prüft ob des aktuelle Child mit der ID die oben übergeben wurde fertig ist + 'Gibt die Thread ID zurück um zum auswerten in das Arbeitsverzeichnis zu wechseln '******************************************************************************** Protected Overrides Function ThreadReady(ByRef Thread_ID As Integer, ByRef SimIsOK As Boolean, ByVal Child_ID As Integer) As Boolean ThreadReady = False @@ -331,10 +331,10 @@ Public Class BlueMSim '------------------------------- Protected Overrides Sub SIM_Ergebnis_Lesen() - 'Altes Simulationsergebnis löschen + 'Altes Simulationsergebnis löschen Me.SimResult.Clear() - 'Benötigte SimReihen zusammenstellen + 'Benötigte SimReihen zusammenstellen 'TODO: das braucht eigentlich nicht nach jeder Simulation nochmal neu getan zu werden Dim SimReihen As New Dictionary(Of String, List(Of String)) '{file: [series]} SimReihen.Add("WEL", New List(Of String)) @@ -357,15 +357,15 @@ Public Class BlueMSim 'WEL-Datei einlesen '------------------ - Dim WELtmp As Wave.Fileformats.WEL = New Wave.Fileformats.WEL(IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz & ".WEL")) + Dim WELtmp As New Wave.Fileformats.WEL(IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz & ".WEL")) - 'Benötigte Reihen für Import selektieren + 'Benötigte Reihen für Import selektieren For Each series As String In SimReihen("WEL") WELtmp.selectSeries(series) Next 'Datei einlesen WELtmp.readFile() - 'Zeitreihen übernehmen + 'Zeitreihen übernehmen For Each zre As Wave.TimeSeries In WELtmp.TimeSeries.Values Me.SimResult.Series.Add(zre.Title, zre) Next @@ -375,15 +375,15 @@ Public Class BlueMSim If (Me.useKWL) Then Dim KWLpath As String = IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz & ".KWL") - Dim KWLtmp As Wave.Fileformats.WEL = New Wave.Fileformats.WEL(KWLpath) + Dim KWLtmp As New Wave.Fileformats.WEL(KWLpath) - 'Benötigte Reihen für Import selektieren + 'Benötigte Reihen für Import selektieren For Each series As String In SimReihen("KWL") KWLtmp.selectSeries(series) Next 'Datei einlesen KWLtmp.readFile() - 'Zeitreihen übernehmen + 'Zeitreihen übernehmen For Each zre As Wave.TimeSeries In KWLtmp.TimeSeries.Values Me.SimResult.Series.Add(zre.Title, zre) Next @@ -394,9 +394,9 @@ Public Class BlueMSim #End Region 'Evaluierung -#Region "Qualitätswertberechnung" +#Region "Qualitätswertberechnung" - 'Qualitätswert aus PRB-Datei + 'Qualitätswert aus PRB-Datei 'TODO: PRB geht nicht (#153) '*********************** Private Function CalculateObjective_PRB(ByVal objective As Common.ObjectiveFunction) As Double @@ -411,9 +411,9 @@ Public Class BlueMSim ''Diff ''---- - ''Überflüssige Stützstellen (P) entfernen + ''Überflüssige Stützstellen (P) entfernen ''--------------------------------------- - ''Anzahl Stützstellen bestimmen + ''Anzahl Stützstellen bestimmen 'Dim stuetz As Integer = 0 'Dim P_vorher As Double = -99 'For i = 0 To SimReihe.GetUpperBound(0) @@ -433,16 +433,16 @@ Public Class BlueMSim ' stuetz += 1 ' End If 'Next - ''Reihe um eine Stützstelle erweitern + ''Reihe um eine Stützstelle erweitern ''PRBtmp(stuetz, 0) = PRBtmp(stuetz - 1, 0) ''PRBtmp(stuetz, 1) = PRBtmp(stuetz - 1, 1) - ''An Stützstellen der ZielReihe interpolieren + ''An Stützstellen der ZielReihe interpolieren ''------------------------------------------- 'Dim PRBintp(ziel.ZielReihe.GetUpperBound(0), 1) As Object 'Dim j As Integer 'For i = 0 To ziel.ZielReihe.GetUpperBound(0) - ' 'zugehörige Lamelle in SimReihe finden + ' 'zugehörige Lamelle in SimReihe finden ' j = 0 ' Do While (PRBtmp(j, 1) < ziel.ZielReihe(i, 1)) ' j += 1 @@ -470,8 +470,8 @@ Public Class BlueMSim Dim Zeile As String Read_PRB = True - Dim FiStr As FileStream = New FileStream(DateiPfad, FileMode.Open, IO.FileAccess.ReadWrite) - Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New FileStream(DateiPfad, FileMode.Open, IO.FileAccess.ReadWrite) + Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) Dim StrReadSync As TextReader = TextReader.Synchronized(StrRead) 'Array redimensionieren @@ -485,7 +485,7 @@ Public Class BlueMSim End If Loop Until StrRead.Peek() = -1 - 'Zeile mit Spaltenüberschriften überspringen + 'Zeile mit Spaltenüberschriften überspringen Zeile = StrRead.ReadLine.ToString For j = 0 To AnzZeil - 1 @@ -497,9 +497,9 @@ Public Class BlueMSim StrRead.Close() FiStr.Close() - 'Überflüssige Stützstellen (P) entfernen + 'Überflüssige Stützstellen (P) entfernen '--------------------------------------- - 'Anzahl Stützstellen bestimmen + 'Anzahl Stützstellen bestimmen Dim stuetz As Integer = 0 Dim P_vorher As Double = -99 For j = 0 To PRB.GetUpperBound(0) @@ -523,7 +523,7 @@ Public Class BlueMSim End Function -#End Region 'Qualitätswertberechnung +#End Region 'Qualitätswertberechnung #End Region 'Methoden diff --git a/BlueM.Opt/Common/Problem.vb b/BlueM.Opt/Common/Problem.vb index 2e7cb287..9dddd894 100644 --- a/BlueM.Opt/Common/Problem.vb +++ b/BlueM.Opt/Common/Problem.vb @@ -298,8 +298,8 @@ Public Class Problem Dim Datei As String = IO.Path.Combine(Me.mWorkDir, Me.Datensatz & "." & FILEEXT_OPT) - Dim FiStr As FileStream = New FileStream(Datei, FileMode.Open, IO.FileAccess.ReadWrite) - Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New FileStream(Datei, FileMode.Open, IO.FileAccess.ReadWrite) + Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) Dim Zeile As String Dim AnzParam As Integer = 0 @@ -366,8 +366,8 @@ Public Class Problem Dim Datei As String = IO.Path.Combine(Me.mWorkDir, Me.Datensatz & "." & FILEEXT_MOD) - Dim FiStr As FileStream = New FileStream(Datei, FileMode.Open, IO.FileAccess.ReadWrite) - Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New FileStream(Datei, FileMode.Open, IO.FileAccess.ReadWrite) + Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) Dim Zeile As String Dim AnzParam As Integer = 0 @@ -760,8 +760,8 @@ Public Class Problem If (File.Exists(Datei)) Then - Dim FiStr As FileStream = New FileStream(Datei, FileMode.Open, IO.FileAccess.Read) - Dim StrRead As StreamReader = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New FileStream(Datei, FileMode.Open, IO.FileAccess.Read) + Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) i = 0 Do diff --git a/BlueM.Opt/OptResult/OptResult.vb b/BlueM.Opt/OptResult/OptResult.vb index 3ff1d799..240971dc 100644 --- a/BlueM.Opt/OptResult/OptResult.vb +++ b/BlueM.Opt/OptResult/OptResult.vb @@ -34,19 +34,19 @@ Public Class OptResult Private db_path As String 'Pfad zur Ergebnisdatenbank Private db As OleDb.OleDbConnection - 'Array von Lösungen + 'Array von Lösungen Public Solutions() As Common.Individuum - 'Structure für Sekundäre Population + 'Structure für Sekundäre Population Public Structure Struct_SekPop Public iGen As Integer 'Generationsnummer Public SolutionIDs() As Integer 'Array von Solution-IDs End Structure - 'Array von Sekundären Populationen + 'Array von Sekundären Populationen Public SekPops() As Struct_SekPop - 'Array von ausgewählten Lösungen + 'Array von ausgewählten Lösungen Private selSolutionIDs() As Integer ''' @@ -63,7 +63,7 @@ Public Class OptResult ''' optional start time to use for the database filename Public Sub New(ByVal Datensatzname As String, ByRef prob As Common.Problem, Optional ByVal createNewMdb As Boolean = True, Optional starttime As DateTime = Nothing) - 'Standardmäßig mit Optparametern + 'Standardmäßig mit Optparametern Me.holdsOptparameters = True 'Datensatzname speichern @@ -88,18 +88,18 @@ Public Class OptResult #Region "Ergebnisspeicher" - 'Eine Lösung auswählen + 'Eine Lösung auswählen '********************* Public Function selectSolution(ByVal ID As Integer) As Boolean - 'Überprüfen, ob Lösung bereits ausgewählt ist + 'Überprüfen, ob Lösung bereits ausgewählt ist For Each _id As Integer In Me.selSolutionIDs If (_id = ID) Then Return False End If Next - 'Lösung zu Auswahl hinzufügen + 'Lösung zu Auswahl hinzufügen ReDim Preserve Me.selSolutionIDs(Me.selSolutionIDs.GetUpperBound(0) + 1) Me.selSolutionIDs(Me.selSolutionIDs.GetUpperBound(0)) = ID @@ -107,7 +107,7 @@ Public Class OptResult End Function - 'Ausgewählte Lösungen holen + 'Ausgewählte Lösungen holen '************************** Public ReadOnly Property getSelectedSolutions() As Common.Individuum() Get @@ -119,7 +119,7 @@ Public Class OptResult End Get End Property - 'Lösungsauswahl zurücksetzen + 'Lösungsauswahl zurücksetzen '*************************** Public Sub clearSelectedSolutions() @@ -127,11 +127,11 @@ Public Class OptResult End Sub - 'Eine Lösung zum Optimierungsergebnis hinzufügen + 'Eine Lösung zum Optimierungsergebnis hinzufügen '*********************************************** Public Sub addSolution(ByVal Ind As Common.Individuum) - 'Lösung zu OptResult hinzufügen + 'Lösung zu OptResult hinzufügen ReDim Preserve Me.Solutions(Me.Solutions.GetUpperBound(0) + 1) Me.Solutions(Me.Solutions.GetUpperBound(0)) = Ind.Clone() @@ -140,7 +140,7 @@ Public Class OptResult End Sub - 'Eine Lösung identifizieren + 'Eine Lösung identifizieren '************************** Public Function getSolution(ByVal ID As Integer) As Common.Individuum @@ -156,7 +156,7 @@ Public Class OptResult End Function - 'Sekundäre Population hinzufügen + 'Sekundäre Population hinzufügen '******************************* Public Sub setSekPop(ByVal pop() As Common.Individuum, ByVal _igen As Integer) @@ -172,23 +172,23 @@ Public Class OptResult 'SekPop aus DB lesen SekPop = Me.db_getSekPop(_igen) - 'SekPop zu OptResult hinzufügen + 'SekPop zu OptResult hinzufügen Call Me.addSekPop(SekPop) End Sub - 'Sekundäre Population zu OptResult hinzufügen + 'Sekundäre Population zu OptResult hinzufügen '******************************************** Private Sub addSekPop(ByVal _sekpop As Struct_SekPop) - 'Array von Sekundären Populationen um eins erweitern + 'Array von Sekundären Populationen um eins erweitern ReDim Preserve Me.SekPops(Me.SekPops.GetUpperBound(0) + 1) - 'SekPop hinzufügen + 'SekPop hinzufügen Me.SekPops(Me.SekPops.GetUpperBound(0)) = _sekpop End Sub - 'Sekundäre Population holen + 'Sekundäre Population holen '************************** Public Function getSekPop(Optional ByVal _igen As Integer = -1) As Common.Individuum() @@ -203,10 +203,10 @@ Public Class OptResult ReDim sekpopsolutions(-1) - 'Alle Sekundären Populationen durchlaufen + 'Alle Sekundären Populationen durchlaufen For Each sekpop As Struct_SekPop In Me.SekPops If (sekpop.iGen = _igen) Then - 'SekPop gefunden, Lösungen holen + 'SekPop gefunden, Lösungen holen sekpopsolutions = getSolutions(sekpop.SolutionIDs) End If Next @@ -215,7 +215,7 @@ Public Class OptResult End Function - 'Gibt die Penalty-Werte einer Sekundären Population zurück + 'Gibt die Penalty-Werte einer Sekundären Population zurück '********************************************************* Public Function getSekPopValues(Optional ByVal igen As Integer = -1) As Double(,) @@ -228,7 +228,7 @@ Public Class OptResult igen = Me.db_getLastGenNo() End If - 'Wenn es keine Sekundäre Population in der DB gibt, abbrechen + 'Wenn es keine Sekundäre Population in der DB gibt, abbrechen If (igen = -1) Then ReDim values(-1, -1) Return values @@ -248,7 +248,7 @@ Public Class OptResult End Function - 'Lösungen anhand von IDs holen + 'Lösungen anhand von IDs holen '***************************** Private Function getSolutions(ByVal IDs() As Integer) As Common.Individuum() @@ -265,7 +265,7 @@ Public Class OptResult End Function - 'Beste Lösung zurückgeben + 'Beste Lösung zurückgeben '************************ Public Function getBestSolution() As Common.Individuum @@ -288,7 +288,7 @@ Public Class OptResult #Region "Ergebnisdatenbank" - 'Methoden für die Ergebnisdatenbank + 'Methoden für die Ergebnisdatenbank '################################## ''' @@ -339,7 +339,7 @@ Public Class OptResult Dim fieldnames As List(Of String) Call db_connect() - Dim command As OleDbCommand = New OleDbCommand("", db) + Dim command As New OleDbCommand("", db) 'Tabelle 'QWerte' '---------------- @@ -369,12 +369,12 @@ Public Class OptResult End Sub - 'Ergebnisdatenbank für PES vorbereiten + 'Ergebnisdatenbank für PES vorbereiten '************************************* Private Sub db_prepare_PES() Call db_connect() - Dim command As OleDbCommand = New OleDbCommand("", db) + Dim command As New OleDbCommand("", db) 'Tabelle 'OptParameter' '---------------------- @@ -413,13 +413,13 @@ Public Class OptResult End Try End Sub - 'Verbindung zu Ergebnisdatenbank schließen + 'Verbindung zu Ergebnisdatenbank schließen '***************************************** Private Sub db_disconnect() db.Close() End Sub - 'Eine PES-Lösung in die ErgebnisDB schreiben + 'Eine PES-Lösung in die ErgebnisDB schreiben '******************************************* Private Overloads Function db_insert(ByVal ind As Common.Individuum) As Boolean @@ -429,7 +429,7 @@ Public Class OptResult Dim fieldnames As List(Of String) Dim fieldvalues As List(Of String) - Dim command As OleDbCommand = New OleDbCommand("", db) + Dim command As New OleDbCommand("", db) 'Sim schreiben '------------- @@ -475,15 +475,15 @@ Public Class OptResult End Function - 'Sekundäre Population in DB speichern + 'Sekundäre Population in DB speichern '************************************ Private Sub db_setSekPop(ByVal SekPop(,) As Double, ByVal igen As Integer) Call db_connect() - Dim command As OleDbCommand = New OleDbCommand("", db) + Dim command As New OleDbCommand("", db) - ''Alte SekPop löschen + ''Alte SekPop löschen 'command.CommandText = "DELETE FROM SekPop" 'command.ExecuteNonQuery() @@ -493,7 +493,7 @@ Public Class OptResult Dim Sim_ID As Integer For i = 0 To SekPop.GetUpperBound(0) - 'zugehörige Sim_ID bestimmen + 'zugehörige Sim_ID bestimmen bedingung = "" For j = 0 To Me.mProblem.NumPrimObjective - 1 bedingung &= $" AND QWerte.[{Me.mProblem.List_PrimObjectiveFunctions(j).Description}] = " & SekPop(i, j).ToString(Common.Provider.FortranProvider) @@ -584,11 +584,11 @@ Public Class OptResult ''' Ob auch die OptParameter-Werte eingelesen werden sollen ''' ''' Das Optimierungsproblem (d.h. ObjectiveFunctions, OptParameter, Constraints), - ''' ebenso wie die Methode, müssen mit der DB übereinstimmen! + ''' ebenso wie die Methode, müssen mit der DB übereinstimmen! ''' Public Sub db_load(ByVal sourceFile As String, Optional ByVal loadOptParameters As Boolean = True) - 'Optparameter gewünscht? + 'Optparameter gewünscht? Me.holdsOptparameters = loadOptParameters Try @@ -600,7 +600,7 @@ Public Class OptResult Case Common.METH_PES, Common.METH_HOOKEJEEVES, Common.METH_METAEVO 'Individuen laden Call Me.db_getIndividuen_PES() - 'Sekundärpopulationen laden + 'Sekundärpopulationen laden Call Me.db_loadSekPops() Case Common.METH_SENSIPLOT 'Nur Individuen laden @@ -615,7 +615,7 @@ Public Class OptResult End Sub - 'Alle Lösungen aus der DB als PES-Individuen einlesen + 'Alle Lösungen aus der DB als PES-Individuen einlesen '**************************************************** Private Sub db_getIndividuen_PES() @@ -628,7 +628,7 @@ Public Class OptResult 'Connect Call db_connect() - 'Alle Lösungen aus DB lesen + 'Alle Lösungen aus DB lesen '-------------------------- If (Me.holdsOptparameters) Then 'mit OptParameter @@ -646,7 +646,7 @@ Public Class OptResult 'Disconnect Call db_disconnect() - 'Alle Lösungen als Individuen übernehmen + 'Alle Lösungen als Individuen übernehmen '--------------------------------------- ReDim Me.Solutions(numSolutions - 1) @@ -685,7 +685,7 @@ Public Class OptResult End Sub - 'Sekundärpopulationen aus DB laden + 'Sekundärpopulationen aus DB laden '********************************* Private Sub db_loadSekPops() From 542b67b4ae91338f6b79242a489619fdb1ec5818 Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 20:57:41 +0200 Subject: [PATCH 07/12] IDE0017 Use object initializers --- BlueM.Opt/Apps/BlueM/BlueM.vb | 5 +- BlueM.Opt/Apps/Testprobleme/Testprobleme.vb | 160 ++++++++++-------- .../Common/Individuum/Individuum_MetaEvo.vb | 9 +- BlueM.Opt/Common/OptParameter.vb | 28 +-- BlueM.Opt/Common/Provider.vb | 10 +- BlueM.Opt/Diagramm/Diagramm.vb | 64 +++---- BlueM.Opt/Diagramm/Hauptdiagramm.vb | 5 +- BlueM.Opt/Diagramm/Scatterplot.vb | 94 +++++----- BlueM.Opt/Main/SolutionDialog.vb | 67 ++++---- BlueM.Opt/OptResult/OptResult.vb | 5 +- 10 files changed, 239 insertions(+), 208 deletions(-) diff --git a/BlueM.Opt/Apps/BlueM/BlueM.vb b/BlueM.Opt/Apps/BlueM/BlueM.vb index fd6c3b38..a8a1994d 100644 --- a/BlueM.Opt/Apps/BlueM/BlueM.vb +++ b/BlueM.Opt/Apps/BlueM/BlueM.vb @@ -253,8 +253,9 @@ Public Class BlueMSim Folder = getThreadWorkDir(Thread_ID) MyBlueMThreads(Thread_ID) = New BlueMSimThread(Thread_ID, Child_ID, Folder, Datensatz, bluem_dll(Thread_ID)) - MyThreads(Thread_ID) = New Thread(AddressOf MyBlueMThreads(Thread_ID).launchSim) - MyThreads(Thread_ID).IsBackground = True + MyThreads(Thread_ID) = New Thread(AddressOf MyBlueMThreads(Thread_ID).launchSim) With { + .IsBackground = True + } MyThreads(Thread_ID).Start() launchSim = True diff --git a/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb b/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb index b8983a3c..c6336b6d 100644 --- a/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb +++ b/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb @@ -116,8 +116,9 @@ Public Class Testprobleme Me.mAnzConstraints = 0 ReDim Me.mOptPara(Me.mAnzParameter - 1) For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = 0 + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = 0 + } Next Case TP_BealeProblem @@ -127,8 +128,9 @@ Public Class Testprobleme Me.mAnzConstraints = 0 ReDim Me.mOptPara(Me.mAnzParameter - 1) For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = 0.5 + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = 0.5 + } Next Case TP_Schwefel24Problem @@ -138,8 +140,9 @@ Public Class Testprobleme Me.mAnzConstraints = 0 ReDim Me.mOptPara(Me.mAnzParameter - 1) For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = 1 + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = 1 + } Next Case TP_Deb1 @@ -150,8 +153,9 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = Rnd() + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = Rnd() + } Next Case TP_ZitzlerDebT1 @@ -162,8 +166,9 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = Rnd() + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = Rnd() + } Next Case TP_ZitzlerDebT2 @@ -174,8 +179,9 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = Rnd() + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = Rnd() + } Next Case TP_ZitzlerDebT3 @@ -186,8 +192,9 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = Rnd() + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = Rnd() + } Next Case TP_ZitzlerDebT4 @@ -198,8 +205,9 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = Rnd() + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = Rnd() + } Next Case TP_CONSTR @@ -210,8 +218,9 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = Rnd() + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = Rnd() + } Next Case TP_Box @@ -222,8 +231,9 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = Rnd() + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = Rnd() + } Next Case TP_DependentParameters @@ -233,8 +243,9 @@ Public Class Testprobleme Me.mAnzConstraints = 0 ReDim Me.mOptPara(Me.mAnzParameter - 1) For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = 1 + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = 1 + } Next 'Beziehungen Me.mOptPara(0).Beziehung = Common.Constants.Relationship.none @@ -248,8 +259,9 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() - Me.mOptPara(i).Xn = Rnd() + Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + .Xn = Rnd() + } Next For i = 0 To 3 @@ -292,9 +304,10 @@ Public Class Testprobleme ReDim Me.mProblem.List_ObjectiveFunctions(Me.mAnzZiele - 1) For i = 0 To Me.mProblem.NumObjectives - 1 'Check_SH: - Me.mProblem.List_ObjectiveFunctions(i) = New Common.ObjectiveFunction_Series() - Me.mProblem.List_ObjectiveFunctions(i).isPrimObjective = True - Me.mProblem.List_ObjectiveFunctions(i).Direction = EVO_DIRECTION.Minimization + Me.mProblem.List_ObjectiveFunctions(i) = New Common.ObjectiveFunction_Series With { + .isPrimObjective = True, + .Direction = EVO_DIRECTION.Minimization + } Next ReDim Me.mProblem.List_Constraintfunctions(Me.mAnzConstraints - 1) For i = 0 To Me.mProblem.NumConstraints - 1 @@ -425,10 +438,11 @@ Public Class Testprobleme Call Diag.DiagInitialise("Beale problem", achsen, Me.mProblem) 'Linie für den Ausgangswert anzeigen - colorline1 = New Steema.TeeChart.Tools.ColorLine(Diag.Chart) - colorline1.AllowDrag = False - colorline1.Axis = Diag.Axes.Left - colorline1.Value = Ausgangswert + colorline1 = New Steema.TeeChart.Tools.ColorLine(Diag.Chart) With { + .AllowDrag = False, + .Axis = Diag.Axes.Left, + .Value = Ausgangswert + } colorline1.Pen.Color = Drawing.Color.Green End Sub @@ -474,10 +488,11 @@ Public Class Testprobleme Call Diag.DiagInitialise("Schwefel 2.4 problem", achsen, Me.mProblem) 'Linie für den Ausgangswert anzeigen - colorline1 = New Steema.TeeChart.Tools.ColorLine(Diag.Chart) - colorline1.AllowDrag = False - colorline1.Axis = Diag.Axes.Left - colorline1.Value = Ausgangswert + colorline1 = New Steema.TeeChart.Tools.ColorLine(Diag.Chart) With { + .AllowDrag = False, + .Axis = Diag.Axes.Left, + .Value = Ausgangswert + } colorline1.Pen.Color = Drawing.Color.Red End Sub @@ -774,14 +789,14 @@ Public Class Testprobleme Next Next - surface = New Steema.TeeChart.Styles.Surface(Diag.Chart) - surface.Title = "Constraint 1" - surface.IrregularGrid = True - surface.NumXValues = surfaceRes - surface.NumZValues = surfaceRes - surface.Add(ArrayX, ArrayY, ArrayZ) - surface.UseColorRange = False - surface.UsePalette = False + surface = New Steema.TeeChart.Styles.Surface(Diag.Chart) With { + .Title = "Constraint 1", + .IrregularGrid = True, + .NumXValues = surfaceRes, + .NumZValues = surfaceRes, + .UseColorRange = False, + .UsePalette = False + } surface.Brush.Solid = True surface.Brush.Color = System.Drawing.Color.Green surface.Brush.Transparency = 70 @@ -789,6 +804,7 @@ Public Class Testprobleme surface.SideBrush.Visible = True surface.SideBrush.Color = System.Drawing.Color.Red surface.SideBrush.Transparency = 70 + surface.Add(ArrayX, ArrayY, ArrayZ) 'Constraint 2 'x + y <= 0.5 @@ -806,14 +822,14 @@ Public Class Testprobleme Next Next - surface = New Steema.TeeChart.Styles.Surface(Diag.Chart) - surface.Title = "Constraint 2" - surface.IrregularGrid = True - surface.NumXValues = 10 - surface.NumZValues = 10 - surface.Add(ArrayX, ArrayY, ArrayZ) - surface.UseColorRange = False - surface.UsePalette = False + surface = New Steema.TeeChart.Styles.Surface(Diag.Chart) With { + .Title = "Constraint 2", + .IrregularGrid = True, + .NumXValues = 10, + .NumZValues = 10, + .UseColorRange = False, + .UsePalette = False + } surface.Brush.Solid = True surface.Brush.Color = System.Drawing.Color.Blue surface.Brush.Transparency = 70 @@ -821,10 +837,12 @@ Public Class Testprobleme surface.SideBrush.Visible = True surface.SideBrush.Color = System.Drawing.Color.Red surface.SideBrush.Transparency = 70 + surface.Add(ArrayX, ArrayY, ArrayZ) 'Schnittgerade zwischen den Constraints - series3D = New Steema.TeeChart.Styles.Points3D(Diag.Chart) - series3D.Title = "Intersection" + series3D = New Steema.TeeChart.Styles.Points3D(Diag.Chart) With { + .Title = "Intersection" + } series3D.Pointer.Style = Steema.TeeChart.Styles.PointerStyles.Nothing series3D.LinePen.Visible = True series3D.LinePen.Width = 1 @@ -904,18 +922,19 @@ Public Class Testprobleme Next Next - surface = New Steema.TeeChart.Styles.Surface(Diag.Chart) - surface.Title = "Ackley function" - surface.IrregularGrid = True - surface.NumXValues = length - surface.NumZValues = length - surface.Add(ArrayX, ArrayZ, ArrayY) - surface.UseColorRange = False - surface.UsePalette = True - surface.PaletteStyle = Steema.TeeChart.Styles.PaletteStyles.Rainbow + surface = New Steema.TeeChart.Styles.Surface(Diag.Chart) With { + .Title = "Ackley function", + .IrregularGrid = True, + .NumXValues = length, + .NumZValues = length, + .UseColorRange = False, + .UsePalette = True, + .PaletteStyle = Steema.TeeChart.Styles.PaletteStyles.Rainbow + } surface.Brush.Solid = True surface.Brush.Transparency = 70 surface.Pen.Visible = False + surface.Add(ArrayX, ArrayZ, ArrayY) End Sub @@ -982,14 +1001,14 @@ Public Class Testprobleme Next Next - surface = New Steema.TeeChart.Styles.Surface(Diag.Chart) - surface.Title = "X = Y" - surface.IrregularGrid = True - surface.NumXValues = surfaceRes - surface.NumZValues = surfaceRes - surface.Add(ArrayX, ArrayY, ArrayZ) - surface.UseColorRange = False - surface.UsePalette = False + surface = New Steema.TeeChart.Styles.Surface(Diag.Chart) With { + .Title = "X = Y", + .IrregularGrid = True, + .NumXValues = surfaceRes, + .NumZValues = surfaceRes, + .UseColorRange = False, + .UsePalette = False + } surface.Brush.Solid = True surface.Brush.Color = System.Drawing.Color.Green surface.Brush.Transparency = 70 @@ -997,6 +1016,7 @@ Public Class Testprobleme surface.SideBrush.Visible = True surface.SideBrush.Color = System.Drawing.Color.Red surface.SideBrush.Transparency = 70 + surface.Add(ArrayX, ArrayY, ArrayZ) End Sub diff --git a/BlueM.Opt/Common/Individuum/Individuum_MetaEvo.vb b/BlueM.Opt/Common/Individuum/Individuum_MetaEvo.vb index 018e955d..9d69c5e5 100644 --- a/BlueM.Opt/Common/Individuum/Individuum_MetaEvo.vb +++ b/BlueM.Opt/Common/Individuum/Individuum_MetaEvo.vb @@ -49,10 +49,11 @@ Public Class Individuum_MetaEvo 'Initialisieren der Optparameter For i = 0 To numberOptparas - 1 - Me.mOptparameter(i) = New OptParameter() - Me.mOptparameter(i).Min = Individuum.mProblem.List_OptParameter(i).Min - Me.mOptparameter(i).Max = Individuum.mProblem.List_OptParameter(i).Max - Me.mOptparameter(i).Bezeichnung = Individuum.mProblem.List_OptParameter(i).Bezeichnung + Me.mOptparameter(i) = New OptParameter With { + .Min = Individuum.mProblem.List_OptParameter(i).Min, + .Max = Individuum.mProblem.List_OptParameter(i).Max, + .Bezeichnung = Individuum.mProblem.List_OptParameter(i).Bezeichnung + } Next 'Constraints auf 0 setzen diff --git a/BlueM.Opt/Common/OptParameter.vb b/BlueM.Opt/Common/OptParameter.vb index b8e5a5c5..2531e4df 100644 --- a/BlueM.Opt/Common/OptParameter.vb +++ b/BlueM.Opt/Common/OptParameter.vb @@ -17,7 +17,7 @@ ' ''' ''' Klasse OptParameter -''' für das Speichern eines Optimierungsparameters und zugehöriger Informationen +''' für das Speichern eines Optimierungsparameters und zugehöriger Informationen ''' Public Class OptParameter @@ -29,8 +29,8 @@ Public Class OptParameter 'Parameterwerte Public Xn As Double 'Skalierter Parameterwert - Public Min As Double 'Minwert für die Umrechnung in reellen Parameterwert - Public Max As Double 'Maxwert für die Umrechnung in reellen Parameterwert + Public Min As Double 'Minwert für die Umrechnung in reellen Parameterwert + Public Max As Double 'Maxwert für die Umrechnung in reellen Parameterwert Public Property RWert() As Double 'Reeller Parameterwert Get @@ -45,7 +45,7 @@ Public Class OptParameter 'Schrittweite Public Dn As Double - 'Schiefemaß + 'Schiefemaß Public C As Double 'Beziehung @@ -84,16 +84,16 @@ Public Class OptParameter '******************************* Public Function Clone() As OptParameter - Clone = New OptParameter() - - Clone.Bezeichnung = Me.Bezeichnung - Clone.Einheit = Me.Einheit - Clone.Xn = Me.Xn - Clone.Dn = Me.Dn - Clone.Min = Me.Min - Clone.Max = Me.Max - Clone.StartWert = Me.StartWert - Clone.Beziehung = Me.Beziehung + Clone = New OptParameter With { + .Bezeichnung = Me.Bezeichnung, + .Einheit = Me.Einheit, + .Xn = Me.Xn, + .Dn = Me.Dn, + .Min = Me.Min, + .Max = Me.Max, + .StartWert = Me.StartWert, + .Beziehung = Me.Beziehung + } Return Clone diff --git a/BlueM.Opt/Common/Provider.vb b/BlueM.Opt/Common/Provider.vb index b75f7ab1..de091e8c 100644 --- a/BlueM.Opt/Common/Provider.vb +++ b/BlueM.Opt/Common/Provider.vb @@ -23,11 +23,11 @@ Public Module Provider Get 'Fortran Provider einrichten '--------------------------- - Dim provider As New NumberFormatInfo() - - provider.NumberDecimalSeparator = "." - provider.NumberGroupSeparator = "" - provider.NumberGroupSizes = New Integer() {3} + Dim provider As New NumberFormatInfo With { + .NumberDecimalSeparator = ".", + .NumberGroupSeparator = "", + .NumberGroupSizes = New Integer() {3} + } Return provider End Get diff --git a/BlueM.Opt/Diagramm/Diagramm.vb b/BlueM.Opt/Diagramm/Diagramm.vb index db2d984c..6e04ce81 100644 --- a/BlueM.Opt/Diagramm/Diagramm.vb +++ b/BlueM.Opt/Diagramm/Diagramm.vb @@ -18,7 +18,7 @@ Imports System.Drawing ''' -''' Klasse stellt Diagrammfunktionalitäten zur Verfügung +''' Klasse stellt Diagrammfunktionalitäten zur Verfügung ''' ''' Erweiterung der Klasse Steema.TeeChart.TChart Public Class Diagramm @@ -46,7 +46,7 @@ Public Class Diagramm Me.Chart.Axes.Bottom.Grid.Visible = True End Sub - 'Diagramm zurücksetzen + 'Diagramm zurücksetzen '********************* Public Sub Reset() With Me @@ -72,7 +72,7 @@ Public Class Diagramm #Region "Serienverwaltung" 'Serien-Initialisierung (Punkt) - 'gibt die Serie zurück + 'gibt die Serie zurück '****************************** Public Function getSeriesPoint(ByVal title As String, _ Optional ByVal colorName As String = "", _ @@ -84,7 +84,7 @@ Public Class Diagramm Dim baseColor, borderColor As Color Dim serie As Steema.TeeChart.Styles.Points - 'Überprüfen, ob Serie bereits existiert + 'Überprüfen, ob Serie bereits existiert For i = 0 To Me.Chart.Series.Count - 1 If (Me.Chart.Series(i).Title = title) Then serie = Me.Chart.Series(i) @@ -92,13 +92,14 @@ Public Class Diagramm End If Next - 'Sonst Serie neu hinzufügen - serie = New Steema.TeeChart.Styles.Points(Me.Chart) - serie.Title = title + 'Sonst Serie neu hinzufügen + serie = New Steema.TeeChart.Styles.Points(Me.Chart) With { + .Title = title, + .ColorEach = ColEach + } serie.Pointer.Style = style serie.Pointer.HorizSize = size serie.Pointer.VertSize = size - serie.ColorEach = ColEach If (Not colorName = "") Then baseColor = Color.FromName(colorName) serie.Pointer.Color = baseColor @@ -106,7 +107,7 @@ Public Class Diagramm borderColor = getDarkerColor(baseColor) serie.Pointer.Pen.Color = borderColor End If - + Call Me.add_MarksTips(serie) serie.Cursor = Windows.Forms.Cursors.Hand @@ -115,7 +116,7 @@ Public Class Diagramm End Function 'Serien-Initialisierung (Linie) - 'gibt die Serie zurück + 'gibt die Serie zurück '****************************** Public Function getSeriesLine(ByVal title As String, _ Optional ByVal colorName As String = "") As Steema.TeeChart.Styles.Line @@ -123,7 +124,7 @@ Public Class Diagramm Dim i As Integer Dim serie As Steema.TeeChart.Styles.Line - 'Überprüfen, ob Serie bereits existiert + 'Überprüfen, ob Serie bereits existiert For i = 0 To Me.Chart.Series.Count - 1 If (Me.Chart.Series(i).Title = title) Then serie = Me.Chart.Series(i) @@ -131,9 +132,10 @@ Public Class Diagramm End If Next - 'Sonst Serie neu hinzufügen - serie = New Steema.TeeChart.Styles.Line(Me.Chart) - serie.Title = title + 'Sonst Serie neu hinzufügen + serie = New Steema.TeeChart.Styles.Line(Me.Chart) With { + .Title = title + } If (Not colorName = "") Then serie.Color = Drawing.Color.FromName(colorName) End If @@ -145,7 +147,7 @@ Public Class Diagramm End Function 'Serien-Initialisierung (3DPunkt) - 'gibt die Serie zurück + 'gibt die Serie zurück '******************************** Public Function getSeries3DPoint(ByVal title As String, _ Optional ByVal colorName As String = "", _ @@ -155,9 +157,9 @@ Public Class Diagramm Dim i As Integer Dim baseColor, borderColor As Color - Dim serie As New Steema.TeeChart.Styles.Points3D + Dim serie As Steema.TeeChart.Styles.Points3D - 'Überprüfen, ob Serie bereits existiert + 'Überprüfen, ob Serie bereits existiert For i = 0 To Me.Chart.Series.Count - 1 If (Me.Chart.Series(i).Title = title) Then serie = Me.Chart.Series(i) @@ -165,16 +167,17 @@ Public Class Diagramm End If Next - 'Sonst Serie neu hinzufügen - serie = New Steema.TeeChart.Styles.Points3D(Me.Chart) - serie.Title = title + 'Sonst Serie neu hinzufügen + serie = New Steema.TeeChart.Styles.Points3D(Me.Chart) With { + .Title = title, + .Depth = size, + .ColorEach = ColEach + } serie.Pointer.Style = style serie.Pointer.HorizSize = size serie.Pointer.VertSize = size serie.Pointer.Draw3D = True - serie.Depth = size serie.LinePen.Visible = False - serie.ColorEach = ColEach If (Not colorName = "") Then baseColor = Drawing.Color.FromName(colorName) serie.Color = baseColor @@ -191,7 +194,7 @@ Public Class Diagramm End Function - 'Serien werden von Hinten gelöscht + 'Serien werden von Hinten gelöscht '********************************* Sub DeleteSeries(ByVal Max As Integer, ByVal Min As Integer) @@ -204,16 +207,17 @@ Public Class Diagramm End Sub - 'MarksTips zu einer Serie hinzufügen + 'MarksTips zu einer Serie hinzufügen '*********************************** Public Sub add_MarksTips(ByVal serie As Steema.TeeChart.Styles.Series, Optional ByVal style As Steema.TeeChart.Styles.MarksStyles = Steema.TeeChart.Styles.MarksStyles.Label) Dim myMarksTip As Steema.TeeChart.Tools.MarksTip - myMarksTip = New Steema.TeeChart.Tools.MarksTip(Me.Chart) - myMarksTip.Series = serie - myMarksTip.MouseAction = Steema.TeeChart.Tools.MarksTipMouseAction.Move - myMarksTip.MouseDelay = 10 'millisekunden - myMarksTip.Style = style + myMarksTip = New Steema.TeeChart.Tools.MarksTip(Me.Chart) With { + .Series = serie, + .MouseAction = Steema.TeeChart.Tools.MarksTipMouseAction.Move, + .MouseDelay = 10, 'millisekunden + .Style = style + } End Sub @@ -222,7 +226,7 @@ Public Class Diagramm #Region "Misc" ''' - ''' Erzeugt von einer übergebenen Farbe eine etwas dunklere Farbe + ''' Erzeugt von einer übergebenen Farbe eine etwas dunklere Farbe ''' ''' die Basisfarbe ''' eine etwas dunklere Farbe diff --git a/BlueM.Opt/Diagramm/Hauptdiagramm.vb b/BlueM.Opt/Diagramm/Hauptdiagramm.vb index 474e3a4f..cbd63a5d 100644 --- a/BlueM.Opt/Diagramm/Hauptdiagramm.vb +++ b/BlueM.Opt/Diagramm/Hauptdiagramm.vb @@ -113,8 +113,9 @@ Public Class Hauptdiagramm .Chart.Aspect.Zoom = 66 'Rotate Tool - Dim rotate As New Steema.TeeChart.Tools.Rotate(.Chart) - rotate.Button = Windows.Forms.MouseButtons.Right + Dim rotate As New Steema.TeeChart.Tools.Rotate(.Chart) With { + .Button = Windows.Forms.MouseButtons.Right + } End If diff --git a/BlueM.Opt/Diagramm/Scatterplot.vb b/BlueM.Opt/Diagramm/Scatterplot.vb index 44cb4a7e..8000e9e1 100644 --- a/BlueM.Opt/Diagramm/Scatterplot.vb +++ b/BlueM.Opt/Diagramm/Scatterplot.vb @@ -19,7 +19,7 @@ Imports System.Windows.Forms Imports System.Drawing ''' -''' Zeigt den Lösungs- oder Entscheidungsraum in Form einer Scatterplot-Matrix an +''' Zeigt den Lösungs- oder Entscheidungsraum in Form einer Scatterplot-Matrix an ''' Partial Public Class Scatterplot Inherits System.Windows.Forms.Form @@ -42,9 +42,9 @@ Partial Public Class Scatterplot End Property ''' - ''' Event wird ausgelöst, wenn in der Scatterplot-Matrix eine Lösung ausgewählt wird + ''' Event wird ausgelöst, wenn in der Scatterplot-Matrix eine Lösung ausgewählt wird ''' - ''' Das ausgewählte Individuum + ''' Das ausgewählte Individuum ''' wird von Form1.selectSolution() verarbeitet Public Event pointSelected(ByVal ind As Common.Individuum) @@ -59,15 +59,15 @@ Partial Public Class Scatterplot Dim Dialog As ScatterplotDialog Dim diagresult As DialogResult - ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. + ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. InitializeComponent() - ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. + ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. 'Problem speichern Me.mProblem = prob - 'Optimierungsergebnis übergeben + 'Optimierungsergebnis übergeben Me.OptResult = optres Me.OptResultRef = optresref @@ -77,7 +77,7 @@ Partial Public Class Scatterplot diagresult = Dialog.ShowDialog() If (diagresult = DialogResult.OK) Then - 'Einstellungen übernehmen + 'Einstellungen übernehmen Me.ShownSpace = Dialog.selectedSpace Me.selectedIndices = Dialog.selectedIndices Me.ShowSekPopOnly = Dialog.ShowSekPopOnly @@ -124,7 +124,7 @@ Partial Public Class Scatterplot End Select - 'Bereits ausgewählte Lösungen anzeigen + 'Bereits ausgewählte Lösungen anzeigen For Each ind As Common.Individuum In Me.OptResult.getSelectedSolutions Call Me.showSelectedSolution(ind) Next @@ -134,7 +134,7 @@ Partial Public Class Scatterplot End Sub - 'Lösungsraum zeichnen + 'Lösungsraum zeichnen '******************** Private Sub draw_solutionspace() @@ -146,7 +146,7 @@ Partial Public Class Scatterplot Dim serie, serie_inv As Steema.TeeChart.Styles.Series Dim shape1 As Steema.TeeChart.Styles.Shape - 'Min und Max für Achsen bestimmen + 'Min und Max für Achsen bestimmen '-------------------------------- ReDim min(Me.dimension - 1) ReDim max(Me.dimension - 1) @@ -154,13 +154,13 @@ Partial Public Class Scatterplot min(i) = Double.MaxValue max(i) = Double.MinValue If (Me.ShowSekPopOnly) Then - 'Nur Sekundäre Population + 'Nur Sekundäre Population For Each ind In Me.OptResult.getSekPop() min(i) = Math.Min(ind.Objectives(Me.selectedIndices(i)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction, min(i)) max(i) = Math.Max(ind.Objectives(Me.selectedIndices(i)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction, max(i)) Next Else - 'Alle Lösungen + 'Alle Lösungen For Each ind In Me.OptResult.Solutions min(i) = Math.Min(ind.Objectives(Me.selectedIndices(i)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction, min(i)) max(i) = Math.Max(ind.Objectives(Me.selectedIndices(i)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction, max(i)) @@ -192,10 +192,10 @@ Partial Public Class Scatterplot Next - 'Schleife über Spalten + 'Schleife über Spalten '--------------------- For i = 0 To Me.dimension - 1 - 'Schleife über Reihen + 'Schleife über Reihen '-------------------- For j = 0 To Me.dimension - 1 @@ -247,11 +247,11 @@ Partial Public Class Scatterplot If (max(i) >= 1000 Or min(i) <= -1000) Then .Axes.Bottom.Labels.ValueFormat = "0.##E0" If (max(j) >= 1000 Or min(j) <= -1000) Then .Axes.Left.Labels.ValueFormat = "0.##E0" - 'Achsen nur an den Rändern anzeigen + 'Achsen nur an den Rändern anzeigen '---------------------------------- 'YAchsen If (i = 0) Then - 'Achse standardmäßig anzeigen + 'Achse standardmäßig anzeigen ElseIf (i = Me.dimension - 1) Then 'Achse rechts anzeigen .Axes.Left.OtherSide = True @@ -266,7 +266,7 @@ Partial Public Class Scatterplot 'Achse oben anzeigen .Axes.Bottom.OtherSide = True ElseIf (j = Me.dimension - 1) Then - 'Achse standardmäßig anzeigen + 'Achse standardmäßig anzeigen Else 'Achse verstecken .Axes.Bottom.Title.Visible = False @@ -281,12 +281,12 @@ Partial Public Class Scatterplot (Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).hasCurrentValue Or Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).hasCurrentValue)) Then - shape1 = New Steema.TeeChart.Styles.Shape(.Chart) - shape1.Style = Steema.TeeChart.Styles.ShapeStyles.Rectangle - shape1.Title = "Area of improvement" - 'Shape formatieren - shape1.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer)) 'Light Green, 75% transparent + shape1 = New Steema.TeeChart.Styles.Shape(.Chart) With { + .Style = Steema.TeeChart.Styles.ShapeStyles.Rectangle, + .Title = "Area of improvement", + .Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer)) 'Light Green, 75% transparent + } shape1.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer)) 'Light Green, 75% transparent shape1.Pen.Transparency = 0 shape1.Pen.Color = Color.Green @@ -333,20 +333,20 @@ Partial Public Class Scatterplot 'add event handler AddHandler Me.NearestPointTools(i, j).Change, AddressOf Me.OnNearestPointChange - 'Lösungen eintragen + 'Lösungen eintragen '================== If Not Me.ShowSekPopOnly Then - 'Alle Lösungen + 'Alle Lösungen '------------- serie = .getSeriesPoint($"{xAchse}, {yAchse}", "Orange", Steema.TeeChart.Styles.PointerStyles.Circle, 2) serie_inv = .getSeriesPoint($"{xAchse}, {yAchse} (invalid)", "Gray", Steema.TeeChart.Styles.PointerStyles.Circle, 2) For Each ind In Me.OptResult.Solutions - 'Constraintverletzung prüfen + 'Constraintverletzung prüfen If (ind.Is_Feasible) Then - 'gültige Lösung Zeichnen + 'gültige Lösung Zeichnen serie.Add(ind.Objectives(Me.selectedIndices(i)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction, ind.Objectives(Me.selectedIndices(j)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).Direction, ind.ID.ToString()) Else - 'ungültige Lösung zeichnen + 'ungültige Lösung zeichnen serie_inv.Add(ind.Objectives(Me.selectedIndices(i)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction, ind.Objectives(Me.selectedIndices(j)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).Direction, ind.ID.ToString()) End If Next @@ -354,7 +354,7 @@ Partial Public Class Scatterplot Me.NearestPointTools(i, j).Series = serie End If - 'Sekundäre Population + 'Sekundäre Population '-------------------- serie = .getSeriesPoint($"{xAchse}, {yAchse} (sec pop)", "Green", Steema.TeeChart.Styles.PointerStyles.Circle, 2) For Each ind In Me.OptResult.getSekPop() @@ -484,7 +484,7 @@ Partial Public Class Scatterplot Dim max() As Double Dim serie, serie_inv As Steema.TeeChart.Styles.Series - 'Min und Max für Achsen bestimmen + 'Min und Max für Achsen bestimmen '-------------------------------- ReDim min(Me.dimension - 1) ReDim max(Me.dimension - 1) @@ -493,10 +493,10 @@ Partial Public Class Scatterplot max(i) = Me.mProblem.List_OptParameter(Me.selectedIndices(i)).Max Next - 'Schleife über Spalten + 'Schleife über Spalten '--------------------- For i = 0 To Me.dimension - 1 - 'Schleife über Reihen + 'Schleife über Reihen '-------------------- For j = 0 To Me.dimension - 1 @@ -548,11 +548,11 @@ Partial Public Class Scatterplot 'If (max(i) >= 1000 Or min(i) <= -1000) Then .Axes.Bottom.Labels.ValueFormat = "0.##E0" 'If (max(j) >= 1000 Or min(j) <= -1000) Then .Axes.Left.Labels.ValueFormat = "0.##E0" - 'Achsen nur an den Rändern anzeigen + 'Achsen nur an den Rändern anzeigen '---------------------------------- 'YAchsen If (i = 0) Then - 'Achse standardmäßig anzeigen + 'Achse standardmäßig anzeigen ElseIf (i = Me.dimension - 1) Then 'Achse rechts anzeigen .Axes.Left.OtherSide = True @@ -567,7 +567,7 @@ Partial Public Class Scatterplot 'Achse oben anzeigen .Axes.Bottom.OtherSide = True ElseIf (j = dimension - 1) Then - 'Achse standardmäßig anzeigen + 'Achse standardmäßig anzeigen Else 'Achse verstecken .Axes.Bottom.Title.Visible = False @@ -589,17 +589,17 @@ Partial Public Class Scatterplot 'Punkte eintragen '================ If Not Me.ShowSekPopOnly Then - 'Alle Lösungen + 'Alle Lösungen '------------- serie = .getSeriesPoint($"{xAchse}, {yAchse}", "Orange", Steema.TeeChart.Styles.PointerStyles.Circle, 2) serie_inv = .getSeriesPoint($"{xAchse}, {yAchse} (invalid)", "Gray", Steema.TeeChart.Styles.PointerStyles.Circle, 2) For Each ind As Common.Individuum In Me.OptResult.Solutions - 'Constraintverletzung prüfen + 'Constraintverletzung prüfen If (ind.Is_Feasible) Then - 'gültige Lösung Zeichnen + 'gültige Lösung Zeichnen serie.Add(ind.OptParameter_RWerte(Me.selectedIndices(i)), ind.OptParameter_RWerte(Me.selectedIndices(j)), ind.ID.ToString()) Else - 'ungültige Lösung zeichnen + 'ungültige Lösung zeichnen serie_inv.Add(ind.OptParameter_RWerte(Me.selectedIndices(i)), ind.OptParameter_RWerte(Me.selectedIndices(j)), ind.ID.ToString()) End If Next @@ -607,7 +607,7 @@ Partial Public Class Scatterplot Me.NearestPointTools(i, j).Series = serie End If - 'Sekundäre Population + 'Sekundäre Population '-------------------- serie = .getSeriesPoint($"{xAchse}, {yAchse} (sec pop)", "Green", Steema.TeeChart.Styles.PointerStyles.Circle, 2) For Each ind As Common.Individuum In Me.OptResult.getSekPop() @@ -718,7 +718,7 @@ Partial Public Class Scatterplot End If End Sub - 'Einen Punkt auswählen + 'Einen Punkt auswählen '********************* Private Sub seriesClick(ByVal sender As Object, ByVal s As Steema.TeeChart.Styles.Series, ByVal valueIndex As Integer, ByVal e As System.Windows.Forms.MouseEventArgs) @@ -731,13 +731,13 @@ Partial Public Class Scatterplot 'Solution-ID indID_clicked = s.Labels(valueIndex) - 'Lösung holen + 'Lösung holen '------------ ind = Me.OptResult.getSolution(indID_clicked) If (ind.ID = indID_clicked) Then - 'Lösung auswählen (wird von Form1.selectSolution() verarbeitet) + 'Lösung auswählen (wird von Form1.selectSolution() verarbeitet) RaiseEvent pointSelected(ind) End If @@ -788,16 +788,16 @@ Partial Public Class Scatterplot End Sub ''' - ''' Eine ausgewählte Lösung in den Diagrammen anzeigen + ''' Eine ausgewählte Lösung in den Diagrammen anzeigen ''' - ''' das ausgewählte Individuum + ''' das ausgewählte Individuum ''' wird von Form1.selectSolution() aufgerufen Public Sub showSelectedSolution(ByVal ind As Common.Individuum) Dim serie As Steema.TeeChart.Styles.Series Dim i, j As Integer - 'Lösung in alle Diagramme eintragen + 'Lösung in alle Diagramme eintragen '---------------------------------- For i = 0 To dimension - 1 For j = 0 To dimension - 1 @@ -833,7 +833,7 @@ Partial Public Class Scatterplot End Sub ''' - ''' Serie der ausgewählten Lösungen löschen + ''' Serie der ausgewählten Lösungen löschen ''' Public Sub clearSelection() @@ -843,7 +843,7 @@ Partial Public Class Scatterplot For i = 0 To Me.Diags.GetUpperBound(0) For j = 0 To Me.Diags.GetUpperBound(1) - 'Serie löschen + 'Serie löschen serie = Me.Diags(i, j).getSeriesPoint("Selected solutions") serie.Dispose() diff --git a/BlueM.Opt/Main/SolutionDialog.vb b/BlueM.Opt/Main/SolutionDialog.vb index da17cf50..b30ef2f1 100644 --- a/BlueM.Opt/Main/SolutionDialog.vb +++ b/BlueM.Opt/Main/SolutionDialog.vb @@ -16,7 +16,7 @@ 'along with this program. If not, see . ' ''' -''' Zeigt die ausgewählten Lösungen an +''' Zeigt die ausgewählten Lösungen an ''' Partial Public Class SolutionDialog Inherits System.Windows.Forms.Form @@ -54,10 +54,10 @@ Partial Public Class SolutionDialog ''' Das Problem Public Sub New(ByRef prob As BlueM.Opt.Common.Problem) - ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. + ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. InitializeComponent() - ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. + ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. 'Problem speichern Me.mProblem = prob @@ -76,7 +76,11 @@ Partial Public Class SolutionDialog 'Ziele '-------- For Each feature As Common.ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions - column = New DataGridViewTextBoxColumn() + column = New DataGridViewTextBoxColumn With { + .Name = feature.Description, + .ReadOnly = True, + .DefaultCellStyle = cellstyle.Clone() + } If (feature.isPrimObjective) Then cellstyle.BackColor = Color.LightGreen column.HeaderText = feature.Description & " (*)" @@ -86,9 +90,6 @@ Partial Public Class SolutionDialog column.HeaderText = feature.Description column.HeaderCell.ToolTipText = "Secondary objective function" End If - column.ReadOnly = True - column.Name = feature.Description - column.DefaultCellStyle = cellstyle.Clone() Me.DataGridView1.Columns.Add(column) Next @@ -97,12 +98,13 @@ Partial Public Class SolutionDialog cellstyle.BackColor = Color.LightCoral For Each Constraint As Common.Constraintfunction In Me.mProblem.List_Constraintfunctions - column = New DataGridViewTextBoxColumn() - column.ReadOnly = True - column.HeaderText = Constraint.Bezeichnung + column = New DataGridViewTextBoxColumn With { + .Name = Constraint.Bezeichnung, + .DefaultCellStyle = cellstyle.Clone(), + .ReadOnly = True, + .HeaderText = Constraint.Bezeichnung + } column.HeaderCell.ToolTipText = "Constraint" - column.Name = Constraint.Bezeichnung - column.DefaultCellStyle = cellstyle.Clone() Me.DataGridView1.Columns.Add(column) Next @@ -111,12 +113,13 @@ Partial Public Class SolutionDialog cellstyle.BackColor = Color.LightGray For Each OptPara As BlueM.Opt.Common.OptParameter In Me.mProblem.List_OptParameter - column = New DataGridViewTextBoxColumn() - column.ReadOnly = True - column.HeaderText = OptPara.Bezeichnung + column = New DataGridViewTextBoxColumn With { + .Name = OptPara.Bezeichnung, + .DefaultCellStyle = cellstyle.Clone(), + .ReadOnly = True, + .HeaderText = OptPara.Bezeichnung + } column.HeaderCell.ToolTipText = "Optimization parameter" - column.Name = OptPara.Bezeichnung - column.DefaultCellStyle = cellstyle.Clone() Me.DataGridView1.Columns.Add(column) Next @@ -129,9 +132,9 @@ Partial Public Class SolutionDialog End Sub ''' - ''' Ein Individuum zur Lösungsauswahl hinzufügen + ''' Ein Individuum zur Lösungsauswahl hinzufügen ''' - ''' das ausgewählte Individuum + ''' das ausgewählte Individuum Public Sub addSolution(ByVal ind As Common.Individuum) Dim i As Integer @@ -169,7 +172,7 @@ Partial Public Class SolutionDialog row.CreateCells(Me.DataGridView1, cellvalues) row.HeaderCell.Value = ind.ID.ToString() - 'Zeile hinzufügen + 'Zeile hinzufügen Me.DataGridView1.Rows.Add(row) 'Spalten anpassen @@ -177,7 +180,7 @@ Partial Public Class SolutionDialog End Sub - 'Automatisches speichern von Zellenänderungen + 'Automatisches speichern von Zellenänderungen '******************************************** Private Sub dataGridView1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged @@ -187,45 +190,45 @@ Partial Public Class SolutionDialog End Sub - 'Nicht angehakte Lösungen aus Lösungsauwahl entfernen + 'Nicht angehakte Lösungen aus Lösungsauwahl entfernen '**************************************************** Private Sub ToolStripButton_unselect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton_unselect.Click - 'Zeilen löschen + 'Zeilen löschen For Each row As DataGridViewRow In Me.DataGridView1.Rows If (row.Cells(0).Value = "False") Then Me.DataGridView1.Rows.Remove(row) End If Next - 'Event auslösen + 'Event auslösen RaiseEvent SelectedSolutionsChanged(Me.checkedSolutions) End Sub - 'Lösungsauswahl zurücksetzen + 'Lösungsauswahl zurücksetzen '*************************** Private Sub ToolStripButton_Clear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton_Clear.Click - 'Alle Zeilen löschen + 'Alle Zeilen löschen Call Me.DataGridView1.Rows.Clear() - 'Lösungsdialog verstecken + 'Lösungsdialog verstecken Call Me.Hide() - 'Event auslösen + 'Event auslösen RaiseEvent SelectedSolutionsCleared() End Sub - 'Ausgewählte Lösungen simulieren + 'Ausgewählte Lösungen simulieren '******************************* Private Sub ToolStripButton_Simulate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton_Wave.Click 'Cursor Cursor = Cursors.WaitCursor - 'Event auslösen + 'Event auslösen RaiseEvent SelectedSolutionsSimulationRequested(Me.checkedSolutions) 'Cursor @@ -264,11 +267,11 @@ Partial Public Class SolutionDialog RaiseEvent SelectedSolutionsIDRequested(id) End Sub - 'Form schließen + 'Form schließen '************** Private Sub SolutionDialog_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing - 'verhindern, dass das Formular komplett gelöscht wird + 'verhindern, dass das Formular komplett gelöscht wird e.Cancel = True 'Formular verstecken diff --git a/BlueM.Opt/OptResult/OptResult.vb b/BlueM.Opt/OptResult/OptResult.vb index 240971dc..66aa319c 100644 --- a/BlueM.Opt/OptResult/OptResult.vb +++ b/BlueM.Opt/OptResult/OptResult.vb @@ -562,8 +562,9 @@ Public Class OptResult Call db_connect() Try - command = New OleDbCommand("", db) - command.CommandText = "SELECT MAX(Generation) FROM SekPop" + command = New OleDbCommand("", db) With { + .CommandText = "SELECT MAX(Generation) FROM SekPop" + } igen = command.ExecuteScalar() Catch ex As Exception 'Keine SekPop vorhanden From 0855c6674ca83ed9b2474f19267df8bc12e5dc83 Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 20:59:23 +0200 Subject: [PATCH 08/12] IDE0028 Use collection initializers or expressions --- BlueM.Opt/Apps/BlueM/BlueM.vb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/BlueM.Opt/Apps/BlueM/BlueM.vb b/BlueM.Opt/Apps/BlueM/BlueM.vb index a8a1994d..cc35921c 100644 --- a/BlueM.Opt/Apps/BlueM/BlueM.vb +++ b/BlueM.Opt/Apps/BlueM/BlueM.vb @@ -335,10 +335,11 @@ Public Class BlueMSim 'Altes Simulationsergebnis löschen Me.SimResult.Clear() - 'Benötigte SimReihen zusammenstellen + 'Benötigte SimReihen zusammenstellen {file: [series]} 'TODO: das braucht eigentlich nicht nach jeder Simulation nochmal neu getan zu werden - Dim SimReihen As New Dictionary(Of String, List(Of String)) '{file: [series]} - SimReihen.Add("WEL", New List(Of String)) + Dim SimReihen As New Dictionary(Of String, List(Of String)) From { + {"WEL", New List(Of String)} + } If Me.useKWL Then SimReihen.Add("KWL", New List(Of String)) End If From da359761a425b5f8768398dd9b5647b900c4a865 Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 21:12:42 +0200 Subject: [PATCH 09/12] simplify Color.FromArgb calls --- BlueM.Opt/Diagramm/Scatterplot.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BlueM.Opt/Diagramm/Scatterplot.vb b/BlueM.Opt/Diagramm/Scatterplot.vb index 8000e9e1..a1748959 100644 --- a/BlueM.Opt/Diagramm/Scatterplot.vb +++ b/BlueM.Opt/Diagramm/Scatterplot.vb @@ -285,9 +285,9 @@ Partial Public Class Scatterplot shape1 = New Steema.TeeChart.Styles.Shape(.Chart) With { .Style = Steema.TeeChart.Styles.ShapeStyles.Rectangle, .Title = "Area of improvement", - .Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer)) 'Light Green, 75% transparent + .Color = System.Drawing.Color.FromArgb(64, 128, 255, 128) 'Light Green, 75% transparent } - shape1.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer)) 'Light Green, 75% transparent + shape1.Brush.Color = System.Drawing.Color.FromArgb(64, 128, 255, 128) 'Light Green, 75% transparent shape1.Pen.Transparency = 0 shape1.Pen.Color = Color.Green shape1.Pen.Width = 1 From 44df1d8ccdc7497cbe589089f6f8052e2b019291 Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 21:21:49 +0200 Subject: [PATCH 10/12] remove superfluous namespace mentions --- BlueM.Opt/Diagramm/Diagramm.vb | 4 ++-- BlueM.Opt/Diagramm/Scatterplot.vb | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/BlueM.Opt/Diagramm/Diagramm.vb b/BlueM.Opt/Diagramm/Diagramm.vb index 6e04ce81..4ae457f6 100644 --- a/BlueM.Opt/Diagramm/Diagramm.vb +++ b/BlueM.Opt/Diagramm/Diagramm.vb @@ -137,7 +137,7 @@ Public Class Diagramm .Title = title } If (Not colorName = "") Then - serie.Color = Drawing.Color.FromName(colorName) + serie.Color = Color.FromName(colorName) End If Call Me.add_MarksTips(serie, Steema.TeeChart.Styles.MarksStyles.XY) @@ -179,7 +179,7 @@ Public Class Diagramm serie.Pointer.Draw3D = True serie.LinePen.Visible = False If (Not colorName = "") Then - baseColor = Drawing.Color.FromName(colorName) + baseColor = Color.FromName(colorName) serie.Color = baseColor 'Border-Color etwas dunkler borderColor = getDarkerColor(baseColor) diff --git a/BlueM.Opt/Diagramm/Scatterplot.vb b/BlueM.Opt/Diagramm/Scatterplot.vb index a1748959..7cddc604 100644 --- a/BlueM.Opt/Diagramm/Scatterplot.vb +++ b/BlueM.Opt/Diagramm/Scatterplot.vb @@ -259,7 +259,7 @@ Partial Public Class Scatterplot 'Achse verstecken .Axes.Left.Title.Visible = False .Axes.Left.Labels.CustomSize = 1 - .Axes.Left.Labels.Font.Color = System.Drawing.Color.Empty + .Axes.Left.Labels.Font.Color = Color.Empty End If 'XAchsen If (j = 0) Then @@ -271,7 +271,7 @@ Partial Public Class Scatterplot 'Achse verstecken .Axes.Bottom.Title.Visible = False .Axes.Bottom.Labels.CustomSize = 1 - .Axes.Bottom.Labels.Font.Color = System.Drawing.Color.Empty + .Axes.Bottom.Labels.Font.Color = Color.Empty End If 'IstWerte eintragen @@ -285,9 +285,9 @@ Partial Public Class Scatterplot shape1 = New Steema.TeeChart.Styles.Shape(.Chart) With { .Style = Steema.TeeChart.Styles.ShapeStyles.Rectangle, .Title = "Area of improvement", - .Color = System.Drawing.Color.FromArgb(64, 128, 255, 128) 'Light Green, 75% transparent + .Color = Color.FromArgb(64, 128, 255, 128) 'Light Green, 75% transparent } - shape1.Brush.Color = System.Drawing.Color.FromArgb(64, 128, 255, 128) 'Light Green, 75% transparent + shape1.Brush.Color = Color.FromArgb(64, 128, 255, 128) 'Light Green, 75% transparent shape1.Pen.Transparency = 0 shape1.Pen.Color = Color.Green shape1.Pen.Width = 1 @@ -560,7 +560,7 @@ Partial Public Class Scatterplot 'Achse verstecken .Axes.Left.Title.Visible = False .Axes.Left.Labels.CustomSize = 1 - .Axes.Left.Labels.Font.Color = System.Drawing.Color.Empty + .Axes.Left.Labels.Font.Color = Color.Empty End If 'XAchsen If (j = 0) Then @@ -572,7 +572,7 @@ Partial Public Class Scatterplot 'Achse verstecken .Axes.Bottom.Title.Visible = False .Axes.Bottom.Labels.CustomSize = 1 - .Axes.Bottom.Labels.Font.Color = System.Drawing.Color.Empty + .Axes.Bottom.Labels.Font.Color = Color.Empty End If 'setup NearestPoint tool From b6072fa4c09a889ab6ed199c81b900e09d66522d Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 21:40:22 +0200 Subject: [PATCH 11/12] rename changelog file --- BlueM.Opt/Main/BlueM.Opt.vbproj | 4 +- ...UEM.OPT_RELEASE-NOTES.txt => CHANGELOG.md} | 5 +- BlueM.Opt/Main/Form1.Designer.vb | 54 +++++++++---------- BlueM.Opt/Main/Form1.resX | 14 ++--- BlueM.Opt/Main/Form1.vb | 6 +-- 5 files changed, 38 insertions(+), 45 deletions(-) rename BlueM.Opt/Main/{BLUEM.OPT_RELEASE-NOTES.txt => CHANGELOG.md} (96%) diff --git a/BlueM.Opt/Main/BlueM.Opt.vbproj b/BlueM.Opt/Main/BlueM.Opt.vbproj index f114a9e7..e452288f 100644 --- a/BlueM.Opt/Main/BlueM.Opt.vbproj +++ b/BlueM.Opt/Main/BlueM.Opt.vbproj @@ -278,9 +278,9 @@ MyApplicationCodeGenerator Application.Designer.vb - + Always - + diff --git a/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt b/BlueM.Opt/Main/CHANGELOG.md similarity index 96% rename from BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt rename to BlueM.Opt/Main/CHANGELOG.md index b8bcf228..021248d4 100644 --- a/BlueM.Opt/Main/BLUEM.OPT_RELEASE-NOTES.txt +++ b/BlueM.Opt/Main/CHANGELOG.md @@ -1,6 +1,5 @@ -=============================================================== -BlueM.Opt Release Notes -=============================================================== +BlueM.Opt Release Notes +======================= Version 2.6.0 ------------- diff --git a/BlueM.Opt/Main/Form1.Designer.vb b/BlueM.Opt/Main/Form1.Designer.vb index be052b93..d658b0d5 100644 --- a/BlueM.Opt/Main/Form1.Designer.vb +++ b/BlueM.Opt/Main/Form1.Designer.vb @@ -4,11 +4,11 @@ Partial Class Form1 Public Sub New() MyBase.New() - 'Dieser Aufruf ist für den Windows Form-Designer erforderlich. + 'Dieser Aufruf ist für den Windows Form-Designer erforderlich. IsInitializing = True InitializeComponent() End Sub - 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. Protected Overloads Overrides Sub Dispose(ByVal Disposing As Boolean) If Disposing Then If Not components Is Nothing Then @@ -17,12 +17,12 @@ Partial Class Form1 End If MyBase.Dispose(Disposing) End Sub - 'Wird vom Windows Form-Designer benötigt. + 'Wird vom Windows Form-Designer benötigt. Private components As System.ComponentModel.IContainer Public ToolTip1 As System.Windows.Forms.ToolTip - 'Hinweis: Die folgende Prozedur wird vom Windows Form-Designer benötigt. - 'Das Verändern mit dem Windows Form-Designer ist nicht möglich. - 'Das Verändern mit dem Code-Editor ist nicht möglich. + 'Hinweis: Die folgende Prozedur wird vom Windows Form-Designer benötigt. + 'Das Verändern mit dem Windows Form-Designer ist nicht möglich. + 'Das Verändern mit dem Code-Editor ist nicht möglich. Private Sub InitializeComponent() Me.components = New System.ComponentModel.Container() Dim MenuStrip1 As System.Windows.Forms.MenuStrip @@ -36,9 +36,9 @@ Partial Class Form1 Dim ToolStripSeparator7 As System.Windows.Forms.ToolStripSeparator Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1)) Dim Margins1 As Steema.TeeChart.Margins = New Steema.TeeChart.Margins() - Me.MenuItem_DatensatzZurücksetzen = New System.Windows.Forms.ToolStripMenuItem() + Me.MenuItem_DatensatzZurücksetzen = New System.Windows.Forms.ToolStripMenuItem() Me.ToolStripMenuItem_Help = New System.Windows.Forms.ToolStripMenuItem() - Me.ReleaseNotesToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem() + Me.ToolStripMenuItem_Changelog = New System.Windows.Forms.ToolStripMenuItem() Me.ToolStripMenuItem_About = New System.Windows.Forms.ToolStripMenuItem() Me.ToolTip1 = New System.Windows.Forms.ToolTip(Me.components) Me.Button_Start = New System.Windows.Forms.Button() @@ -99,22 +99,22 @@ Partial Class Form1 ' 'MenuItem_Tools ' - MenuItem_Tools.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MenuItem_DatensatzZurücksetzen}) + MenuItem_Tools.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MenuItem_DatensatzZurücksetzen}) MenuItem_Tools.Name = "MenuItem_Tools" MenuItem_Tools.Size = New System.Drawing.Size(46, 20) MenuItem_Tools.Text = "Tools" ' - 'MenuItem_DatensatzZurücksetzen + 'MenuItem_DatensatzZurücksetzen ' - Me.MenuItem_DatensatzZurücksetzen.Enabled = False - Me.MenuItem_DatensatzZurücksetzen.Name = "MenuItem_DatensatzZurücksetzen" - Me.MenuItem_DatensatzZurücksetzen.Size = New System.Drawing.Size(143, 22) - Me.MenuItem_DatensatzZurücksetzen.Text = "Reset dataset" + Me.MenuItem_DatensatzZurücksetzen.Enabled = False + Me.MenuItem_DatensatzZurücksetzen.Name = "MenuItem_DatensatzZurücksetzen" + Me.MenuItem_DatensatzZurücksetzen.Size = New System.Drawing.Size(143, 22) + Me.MenuItem_DatensatzZurücksetzen.Text = "Reset dataset" ' 'MenuItem_Info ' MenuItem_Info.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right - MenuItem_Info.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripMenuItem_Help, Me.ReleaseNotesToolStripMenuItem, Me.ToolStripMenuItem_About}) + MenuItem_Info.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripMenuItem_Help, Me.ToolStripMenuItem_Changelog, Me.ToolStripMenuItem_About}) MenuItem_Info.Name = "MenuItem_Info" MenuItem_Info.Size = New System.Drawing.Size(24, 20) MenuItem_Info.Text = "?" @@ -122,19 +122,19 @@ Partial Class Form1 'ToolStripMenuItem_Help ' Me.ToolStripMenuItem_Help.Name = "ToolStripMenuItem_Help" - Me.ToolStripMenuItem_Help.Size = New System.Drawing.Size(145, 22) + Me.ToolStripMenuItem_Help.Size = New System.Drawing.Size(180, 22) Me.ToolStripMenuItem_Help.Text = "Help" ' - 'ReleaseNotesToolStripMenuItem + 'ToolStripMenuItem_Changelog ' - Me.ReleaseNotesToolStripMenuItem.Name = "ReleaseNotesToolStripMenuItem" - Me.ReleaseNotesToolStripMenuItem.Size = New System.Drawing.Size(145, 22) - Me.ReleaseNotesToolStripMenuItem.Text = "Release notes" + Me.ToolStripMenuItem_Changelog.Name = "ToolStripMenuItem_Changelog" + Me.ToolStripMenuItem_Changelog.Size = New System.Drawing.Size(180, 22) + Me.ToolStripMenuItem_Changelog.Text = "Changelog" ' 'ToolStripMenuItem_About ' Me.ToolStripMenuItem_About.Name = "ToolStripMenuItem_About" - Me.ToolStripMenuItem_About.Size = New System.Drawing.Size(145, 22) + Me.ToolStripMenuItem_About.Size = New System.Drawing.Size(180, 22) Me.ToolStripMenuItem_About.Text = "About" ' 'ToolStripSeparator4 @@ -313,7 +313,7 @@ Partial Class Form1 ' Me.ToolStripMenuItem_SettingsLoad.Image = Global.BlueM.Opt.My.Resources.Resources.page_white_get Me.ToolStripMenuItem_SettingsLoad.Name = "ToolStripMenuItem_SettingsLoad" - Me.ToolStripMenuItem_SettingsLoad.Size = New System.Drawing.Size(180, 22) + Me.ToolStripMenuItem_SettingsLoad.Size = New System.Drawing.Size(153, 22) Me.ToolStripMenuItem_SettingsLoad.Text = "Load settings..." ' 'ToolStripSplitButton_ErgebnisDB @@ -555,7 +555,6 @@ Partial Class Form1 Me.Hauptdiagramm1.Axes.Bottom.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray Me.Hauptdiagramm1.Axes.Bottom.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Title.Shadow.Brush.Visible = True - Me.Hauptdiagramm1.Axes.Bottom.UseMaxPixelPos = True ' ' ' @@ -668,7 +667,6 @@ Partial Class Form1 Me.Hauptdiagramm1.Axes.Depth.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray Me.Hauptdiagramm1.Axes.Depth.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Title.Shadow.Brush.Visible = True - Me.Hauptdiagramm1.Axes.Depth.UseMaxPixelPos = True ' ' ' @@ -781,7 +779,6 @@ Partial Class Form1 Me.Hauptdiagramm1.Axes.DepthTop.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray Me.Hauptdiagramm1.Axes.DepthTop.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Title.Shadow.Brush.Visible = True - Me.Hauptdiagramm1.Axes.DepthTop.UseMaxPixelPos = True ' ' ' @@ -894,7 +891,6 @@ Partial Class Form1 Me.Hauptdiagramm1.Axes.Left.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray Me.Hauptdiagramm1.Axes.Left.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Title.Shadow.Brush.Visible = True - Me.Hauptdiagramm1.Axes.Left.UseMaxPixelPos = True ' ' ' @@ -1007,7 +1003,6 @@ Partial Class Form1 Me.Hauptdiagramm1.Axes.Right.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray Me.Hauptdiagramm1.Axes.Right.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Title.Shadow.Brush.Visible = True - Me.Hauptdiagramm1.Axes.Right.UseMaxPixelPos = True ' ' ' @@ -1120,7 +1115,6 @@ Partial Class Form1 Me.Hauptdiagramm1.Axes.Top.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray Me.Hauptdiagramm1.Axes.Top.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Title.Shadow.Brush.Visible = True - Me.Hauptdiagramm1.Axes.Top.UseMaxPixelPos = True ' ' ' @@ -1713,7 +1707,7 @@ Partial Class Form1 Private WithEvents Label_Methode As System.Windows.Forms.Label Friend WithEvents Button_BrowseDatensatz As System.Windows.Forms.Button Friend WithEvents ComboBox_Datensatz As System.Windows.Forms.ComboBox - Private WithEvents MenuItem_DatensatzZurücksetzen As System.Windows.Forms.ToolStripMenuItem + Private WithEvents MenuItem_DatensatzZurücksetzen As System.Windows.Forms.ToolStripMenuItem Private WithEvents ToolStripMenuItem_About As System.Windows.Forms.ToolStripMenuItem Private WithEvents ToolStripMenuItem_Help As System.Windows.Forms.ToolStripMenuItem Friend WithEvents ToolStrip1 As System.Windows.Forms.ToolStrip @@ -1735,6 +1729,6 @@ Partial Class Form1 Private WithEvents ToolStripButton_Monitor As System.Windows.Forms.ToolStripButton Private WithEvents ToolStripMenuItem_SettingsLoad As System.Windows.Forms.ToolStripMenuItem Friend WithEvents ToolStripButton_SelectedSolutions As System.Windows.Forms.ToolStripButton - Friend WithEvents ReleaseNotesToolStripMenuItem As ToolStripMenuItem + Friend WithEvents ToolStripMenuItem_Changelog As ToolStripMenuItem Friend WithEvents ToolStripButton_CustomPlot As ToolStripButton End Class diff --git a/BlueM.Opt/Main/Form1.resX b/BlueM.Opt/Main/Form1.resX index a5366971..b3c5d69c 100644 --- a/BlueM.Opt/Main/Form1.resX +++ b/BlueM.Opt/Main/Form1.resX @@ -164,13 +164,13 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVDhPYxgQ8NXbt+CTq+uDz/ZOBVAh0sBHZ5fHf2ZO - ///J3O4hVIh48D80lO2zrf3dT+aW7z8aWZDugk/Wjr0fTW12AQ1ihgrhBi71Fwscqs89dKo6Bbbpk7Vd - 4AdjmyefDGxEwQpA4FdW+vrvyYm/fyUnrocKwYFzzeknczZe+F8wf+//yIxVZ1+YOH7rCaxpNs/a1maa - tuGBUdraAobvSYm//23d9P9rZOTfX5GRZlC9DC61p+xtK49+sCk69MYtf1f1M1PH22tckreZZm9ZbZCy - 9nfPwgP/deNWPGD4mZiw/mtMzO9v4eGXPgcG3vvm63tyRVzTIvviYw9tSg/Zgwz7aGwx84Oe6UawyUBg - lLK2wCBp5SPd+MWogRhaf4WtP3ny7jOecZ/e2Dq9em9ife2Nnsmf95omX98pGfNDlWEH9vUnJRyqTh2z - Lz2y1KLwGOd7UyuDN4bmf/9Nm/L/lbr2H6gyTOBSe77AuerMc6B/3wA1l0KFweCttuH6V0pav98qamME - MBw4lZ98MHnNxf92ZQdeQoVIA/YVxwpsSw8+sC7cT166HmDAwAAA59q+iZSjxgMAAAAASUVORK5CYII= + ///J3O4hVIh48D80lO2zrf3dT+YW7z8aWZDugk/Wjr0fTW12AQ1ihgrhBi71Fwvsq889dKo6Bbbpk7Vd + 4AdjmyefDGxEwQpA4FdW+vpvSQm/fyUnrocKwYFzzeknczZe+F8wf+//yIxVZ18YO37rCaxpNs/a1maa + tuGBUdraAoZviQm//23d9P9LRMTfX5GRZlC9DC61p+xtKo98sCk69MYtf1f1M1PH22tckreZZm9ZrZ+8 + 5nfPwgP/deNWPGD4mZiw/ktMzO9v4eGXPgcG3vvm63tyRVzTIvuiYw9tSg/Zgwz7aGwx84Oe6UawyUBg + lLK2wCBp5SPd+MWogRhaf4WtP3ny7jMesZ/e2Dq9em9ife21rvGf9xomX98pGfNDlWEH9vUnJRyqTh2z + Lz2y1KLwGOd7UyuD14bmf/9Nm/L/pbrWH6gyTOBSe77AuerMc6B/3wA1l0KFweCttuH6l4qav98qamME + MBw4lZ98MHnNxf92ZftfQoVIA/YVxwpsSw8+sC7cT166HmDAwAAApzK+Z4emFvoAAAAASUVORK5CYII= diff --git a/BlueM.Opt/Main/Form1.vb b/BlueM.Opt/Main/Form1.vb index fce38d93..ce5af913 100644 --- a/BlueM.Opt/Main/Form1.vb +++ b/BlueM.Opt/Main/Form1.vb @@ -258,14 +258,14 @@ Partial Public Class Form1 End Sub ''' - ''' Handles Release notes menu item clicked + ''' Handles Changelog menu item clicked ''' Opens the release notes ''' ''' ''' - Private Sub ReleaseNotesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ReleaseNotesToolStripMenuItem.Click + Private Sub ToolStripMenuItem_Changelog_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem_Changelog.Click Dim filepath As String - filepath = IO.Path.Combine(Application.StartupPath, "BLUEM.OPT_RELEASE-NOTES.txt") + filepath = IO.Path.Combine(Application.StartupPath, "CHANGELOG.md") Try System.Diagnostics.Process.Start(filepath) Catch ex As Exception From 26cb8cc94fbd32f58a207e6611c55200ff09f3cc Mon Sep 17 00:00:00 2001 From: jamaa <90166+jamaa@users.noreply.github.com> Date: Sat, 16 May 2026 23:29:15 +0200 Subject: [PATCH 12/12] consistent use of imports and namespaces --- BlueM.Opt/Algos/ES/ESController.vb | 145 ++++---- BlueM.Opt/Algos/ES/Functions.vb | 108 +++--- BlueM.Opt/Algos/ES/PES.vb | 286 ++++++++-------- .../Algos/HookeAndJeeves/HJController.vb | 60 ++-- .../Algos/HookeAndJeeves/HookeAndJeeves.vb | 32 +- BlueM.Opt/Algos/IController/IController.vb | 14 +- BlueM.Opt/Algos/SensiPlot/ParameterSampler.vb | 11 +- .../Algos/SensiPlot/SensiPlotController.vb | 34 +- BlueM.Opt/Algos/TSP/TSP.vb | 96 +++--- BlueM.Opt/Algos/TSP/TSPController.vb | 59 ++-- BlueM.Opt/Apps/BlueM/BlueM.vb | 26 +- BlueM.Opt/Apps/BlueM/BlueMThread.vb | 5 +- BlueM.Opt/Apps/Sim.vb | 107 +++--- BlueM.Opt/Apps/TALSIM/TALSIM.vb | 51 ++- BlueM.Opt/Apps/TALSIM/TALSIM5.vb | 41 ++- BlueM.Opt/Apps/TALSIM/TALSIM5Thread.vb | 32 +- BlueM.Opt/Apps/TALSIM/TALSIM5_Dialog.vb | 10 +- BlueM.Opt/Apps/TALSIM/TALSIMThread.vb | 26 +- BlueM.Opt/Apps/Testprobleme/Testprobleme.vb | 69 ++-- BlueM.Opt/Common/FileHelper.vb | 15 +- BlueM.Opt/Common/Individuum/Individuum.vb | 32 +- BlueM.Opt/Common/Individuum/Individuum_PES.vb | 2 +- BlueM.Opt/Common/Log.vb | 8 +- .../ObjectiveFunctions/ObjectiveFunction.vb | 2 - BlueM.Opt/Common/OptParameter.vb | 4 +- BlueM.Opt/Common/Problem.vb | 96 +++--- BlueM.Opt/Common/Provider.vb | 5 +- BlueM.Opt/Common/Settings/Settings.vb | 10 +- BlueM.Opt/Diagramm/CustomPlot.vb | 31 +- BlueM.Opt/Diagramm/Diagramm.vb | 3 +- BlueM.Opt/Diagramm/Hauptdiagramm.vb | 41 +-- BlueM.Opt/Diagramm/Monitor.vb | 11 +- BlueM.Opt/Diagramm/Scatterplot.vb | 57 ++-- BlueM.Opt/Diagramm/ScatterplotDialog.vb | 29 +- BlueM.Opt/Main/AboutBox.Designer.vb | 4 +- BlueM.Opt/Main/EVO_Einstellungen.vb | 56 +-- BlueM.Opt/Main/EVO_Opt_Verlauf.vb | 18 +- BlueM.Opt/Main/Form1.Designer.vb | 322 +++++++++--------- BlueM.Opt/Main/Form1.vb | 112 +++--- BlueM.Opt/Main/My Project/AssemblyInfo.vb | 8 +- BlueM.Opt/Main/SolutionDialog.vb | 14 +- BlueM.Opt/OptResult/MDBImportDialog.vb | 22 +- BlueM.Opt/OptResult/OptResult.vb | 65 ++-- .../ParameterSampling.vb | 11 +- 44 files changed, 1098 insertions(+), 1092 deletions(-) diff --git a/BlueM.Opt/Algos/ES/ESController.vb b/BlueM.Opt/Algos/ES/ESController.vb index 4e6a5c54..ebcc2739 100644 --- a/BlueM.Opt/Algos/ES/ESController.vb +++ b/BlueM.Opt/Algos/ES/ESController.vb @@ -15,11 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports BlueM.Opt.Common.Constants -Imports System.Windows.Forms -Imports System.ComponentModel Imports System.Drawing -Imports System.Threading +Imports BlueM.Opt.Common ''' ''' Kontrolliert den Ablauf der Evolutionsstrategie @@ -36,60 +33,60 @@ Public Class ESController End Get End Property - Private myProblem As BlueM.Opt.Common.Problem - Private mySettings As BlueM.Opt.Common.Settings - Private myProgress As BlueM.Opt.Common.Progress - Private myMonitor As BlueM.Opt.Diagramm.Monitor - Private myHauptDiagramm As BlueM.Opt.Diagramm.Hauptdiagramm + Private myProblem As Problem + Private mySettings As Settings + Private myProgress As Progress + Private myMonitor As Diagramm.Monitor + Private myHauptDiagramm As Diagramm.Hauptdiagramm - Private myAppType As BlueM.Opt.Common.ApplicationTypes - Private WithEvents Sim1 As BlueM.Opt.Apps.Sim - Private Testprobleme1 As BlueM.Opt.Apps.Testprobleme + Private myAppType As ApplicationTypes + Private WithEvents Sim1 As Apps.Sim + Private Testprobleme1 As Apps.Testprobleme Private PES1 As PES Private stopped As Boolean - 'Serien für Monitor + 'Serien für Monitor Private Line_Dn() As Steema.TeeChart.Styles.Line Private Line_Hypervolume As Steema.TeeChart.Styles.Line #Region "Methoden" ''' - ''' Initialisiert den ES-Controller und übergibt alle erforderlichen Objekte + ''' Initialisiert den ES-Controller und übergibt alle erforderlichen Objekte ''' ''' ''' ''' ''' - Public Sub Init(ByRef inputProblem As BlueM.Opt.Common.Problem, _ - ByRef inputSettings As BlueM.Opt.Common.Settings, _ - ByRef inputProgress As BlueM.Opt.Common.Progress, _ - ByRef inputHptDiagramm As BlueM.Opt.Diagramm.Hauptdiagramm) Implements IController.Init + Public Sub Init(ByRef inputProblem As Problem, + ByRef inputSettings As Settings, + ByRef inputProgress As Progress, + ByRef inputHptDiagramm As Diagramm.Hauptdiagramm) Implements IController.Init Me.myProblem = inputProblem Me.mySettings = inputSettings Me.myProgress = inputProgress Me.myHauptDiagramm = inputHptDiagramm - Me.myMonitor = BlueM.Opt.Diagramm.Monitor.getInstance() + Me.myMonitor = Diagramm.Monitor.getInstance() End Sub ''' - ''' Initialisiert den Controller für Sim-Anwendungen + ''' Initialisiert den Controller für Sim-Anwendungen ''' ''' die Simulationsanwendung - Public Sub InitApp(ByRef inputSim As BlueM.Opt.Apps.Sim) Implements IController.InitApp + Public Sub InitApp(ByRef inputSim As Apps.Sim) Implements IController.InitApp Me.myAppType = ApplicationTypes.Sim Me.Sim1 = inputSim End Sub ''' - ''' Initialisiert den Controller für Testprobleme + ''' Initialisiert den Controller für Testprobleme ''' - Public Sub InitApp(ByRef inputTestprobleme As BlueM.Opt.Apps.Testprobleme) Implements IController.InitApp + Public Sub InitApp(ByRef inputTestprobleme As Apps.Testprobleme) Implements IController.InitApp Me.myAppType = ApplicationTypes.Testproblems Me.Testprobleme1 = inputTestprobleme End Sub @@ -120,24 +117,24 @@ Public Class ESController ''' ''' zu verarbeitendes Individuum ''' 0-basierte Nachfahre-Nummer - ''' Fängt auch das Multithreading-Event Sim.IndividuumEvaluated ab - Private Sub processIndividuum(ByRef ind As Common.Individuum, ByVal iNachfahre As Integer) Handles Sim1.IndividuumEvaluated + ''' Fängt auch das Multithreading-Event Sim.IndividuumEvaluated ab + Private Sub processIndividuum(ByRef ind As Individuum, ByVal iNachfahre As Integer) Handles Sim1.IndividuumEvaluated Call Me.processIndividuum_PES(ind, iNachfahre) End Sub #Region "PES" - 'Anwendung Evolutionsstrategie für Parameter Optimierung - hier Steuerung + 'Anwendung Evolutionsstrategie für Parameter Optimierung - hier Steuerung '************************************************************************ Private Sub STARTEN_PES() Dim i_Nachf, durchlauf As Integer - Dim inds() As Common.Individuum_PES + Dim inds() As Individuum_PES Dim isOK() As Boolean 'Hypervolumen instanzieren - Dim Hypervolume As BlueM.Opt.MO_Indicators.Indicators - Hypervolume = BlueM.Opt.MO_Indicators.MO_IndicatorFabrik.GetInstance(BlueM.Opt.MO_Indicators.MO_IndicatorFabrik.IndicatorsType.Hypervolume, Me.myProblem.NumPrimObjective) + Dim Hypervolume As MO_Indicators.Indicators + Hypervolume = MO_Indicators.MO_IndicatorFabrik.GetInstance(MO_Indicators.MO_IndicatorFabrik.IndicatorsType.Hypervolume, Me.myProblem.NumPrimObjective) 'Schritte 0: Objekt der Klasse PES wird erzeugt '********************************************** @@ -152,23 +149,23 @@ Public Class ESController durchlauf = 1 - 'Über alle Runden + 'Über alle Runden 'xxxxxxxxxxxxxxxx For PES1.PES_iAkt.iAktRunde = 0 To Me.mySettings.PES.Pop.N_Runden - 1 - Common.Log.AddMessage(Common.Log.levels.info, $"Starting round {PES1.PES_iAkt.iAktRunde}...") + Log.AddMessage(Log.levels.info, $"Starting round {PES1.PES_iAkt.iAktRunde}...") Call PES1.EsResetPopBWSpeicher() 'Nur bei Komma Strategie - 'Über alle Populationen + 'Über alle Populationen 'xxxxxxxxxxxxxxxxxxxxxx For PES1.PES_iAkt.iAktPop = 0 To Me.mySettings.PES.Pop.N_Popul - 1 - Common.Log.AddMessage(Common.Log.levels.info, $"Starting population {PES1.PES_iAkt.iAktPop}...") + Log.AddMessage(Log.levels.info, $"Starting population {PES1.PES_iAkt.iAktPop}...") 'POPULATIONS REPRODUKTIONSPROZESS '################################ - 'Ermitteln der neuen Ausgangswerte für Nachkommen aus den Eltern der Population + 'Ermitteln der neuen Ausgangswerte für Nachkommen aus den Eltern der Population Call PES1.EsPopReproduktion() 'POPULATIONS MUTATIONSPROZESS @@ -176,18 +173,18 @@ Public Class ESController 'Mutieren der Ausgangswerte der Population Call PES1.EsPopMutation() - 'Über alle Generationen + 'Über alle Generationen 'xxxxxxxxxxxxxxxxxxxxxx For PES1.PES_iAkt.iAktGen = 0 To Me.mySettings.PES.N_Gen - 1 - Common.Log.AddMessage(Common.Log.levels.info, $"Starting generation {PES1.PES_iAkt.iAktGen}...") + Log.AddMessage(Log.levels.info, $"Starting generation {PES1.PES_iAkt.iAktGen}...") Call PES1.EsResetBWSpeicher() 'Nur bei Komma Strategie ReDim inds(Me.mySettings.PES.N_Nachf - 1) ReDim isOK(Me.mySettings.PES.N_Nachf - 1) - 'Schleife über alle Nachkommen + 'Schleife über alle Nachkommen 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx For i_Nachf = 0 To Me.mySettings.PES.N_Nachf - 1 @@ -197,7 +194,7 @@ Public Class ESController durchlauf += 1 'Neues Individuum instanzieren - inds(i_Nachf) = New Common.Individuum_PES("PES", durchlauf) + inds(i_Nachf) = New Individuum_PES("PES", durchlauf) 'Neue Parameter holen Call PES_getNewParameters(inds(i_Nachf)) @@ -207,7 +204,7 @@ Public Class ESController 'Testprobleme immer direkt auswerten '=================================== - 'Lösung evaluieren und zeichnen + 'Lösung evaluieren und zeichnen Call Testprobleme1.Evaluate(inds(i_Nachf), PES1.PES_iAkt.iAktPop, Me.myHauptDiagramm) 'Evaluierung verarbeiten @@ -228,7 +225,7 @@ Public Class ESController '---------------------------- If (Not isOK(i_Nachf)) Then - Common.Log.AddMessage(Common.Log.levels.warning, $"Evaluation of child {i_Nachf} was unsuccessful, a new parameter set will be generated and evaluated...") + Log.AddMessage(Log.levels.warning, $"Evaluation of child {i_Nachf} was unsuccessful, a new parameter set will be generated and evaluated...") Dim n_Tries As Integer = 0 @@ -260,7 +257,7 @@ Public Class ESController If (Me.mySettings.General.UseMultithreading) Then 'Simulationsanwendungen mit Multithreading - 'nachträglich auswerten + 'nachträglich auswerten '========================================= 'Alle Individuen evaluieren @@ -277,7 +274,7 @@ Public Class ESController If errorcount > 0 Then Dim msg As String msg = $"Evaluation of {errorcount} children of the current generation failed, will generate and evaluate new parameter sets..." - Common.Log.AddMessage(Common.Log.levels.warning, msg) + Log.AddMessage(Log.levels.warning, msg) End If 'Alle evaluierten Individuen durchlaufen @@ -309,68 +306,68 @@ Public Class ESController End If - 'erfolgreich evaluierte Individuen wurden bereits über Event verarbeitet + 'erfolgreich evaluierte Individuen wurden bereits über Event verarbeitet Next End If 'Ende alle Nachfahren (multithread) 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - Common.Log.AddMessage(Common.Log.levels.info, $"Generation {PES1.PES_iAkt.iAktGen} completed.") + Log.AddMessage(Log.levels.info, $"Generation {PES1.PES_iAkt.iAktGen} completed.") - 'SELEKTIONSPROZESS Schritt 2 für NDSorting sonst Xe = Xb + 'SELEKTIONSPROZESS Schritt 2 für NDSorting sonst Xe = Xb 'Die neuen Eltern werden generiert - Common.Log.AddMessage(Common.Log.levels.info, "Determining new parents...") + Log.AddMessage(Log.levels.info, "Determining new parents...") Call PES1.EsEltern() - 'Sekundäre Population + 'Sekundäre Population '==================== - If (Me.mySettings.PES.OptModus = Common.Constants.EVO_MODE.Multi_Objective) Then + If (Me.mySettings.PES.OptModus = Constants.EVO_MODE.Multi_Objective) Then - Common.Log.AddMessage(Common.Log.levels.info, "Updating secondary population...") + Log.AddMessage(Log.levels.info, "Updating secondary population...") 'SekPop abspeichern '------------------ If (Not IsNothing(Sim1)) Then - Call Sim1.OptResult.setSekPop(PES1.SekundärQb, PES1.PES_iAkt.iAktGen) + Call Sim1.OptResult.setSekPop(PES1.SekundärQb, PES1.PES_iAkt.iAktGen) End If 'SekPop zeichnen '--------------- If (Not IsNothing(Sim1)) Then - 'Umweg über Sim1.OptResult gehen, weil es im PES keine Individuum-IDs gibt (#177) + 'Umweg über Sim1.OptResult gehen, weil es im PES keine Individuum-IDs gibt (#177) Call Me.myHauptDiagramm.ZeichneSekPopulation(Sim1.OptResult.getSekPop()) Else - Call Me.myHauptDiagramm.ZeichneSekPopulation(PES1.SekundärQb) + Call Me.myHauptDiagramm.ZeichneSekPopulation(PES1.SekundärQb) End If 'Hypervolumen berechnen und Zeichnen '----------------------------------- - Call Hypervolume.update_dataset(Common.Individuum.Get_All_Penalty_of_Array(PES1.SekundärQb)) + Call Hypervolume.update_dataset(Common.Individuum.Get_All_Penalty_of_Array(PES1.SekundärQb)) Call Me.ZeichneNadirpunkt(Hypervolume.nadir) Call Me.ZeichneHyperVolumen(PES1.PES_iAkt.iAktGen + 1, Math.Abs(Hypervolume.calc_indicator())) End If - 'ggf. alte Generation aus Diagramm löschen + 'ggf. alte Generation aus Diagramm löschen If (Me.mySettings.General.DrawOnlyCurrentGeneration _ And PES1.PES_iAkt.iAktGen < Me.mySettings.PES.N_Gen - 1) Then - Call Me.myHauptDiagramm.LöscheLetzteGeneration(PES1.PES_iAkt.iAktPop) + Call Me.myHauptDiagramm.LöscheLetzteGeneration(PES1.PES_iAkt.iAktPop) End If 'Verlauf aktualisieren Me.myProgress.iNachf = 0 Me.myProgress.iGen = PES1.PES_iAkt.iAktGen + 1 - System.Windows.Forms.Application.DoEvents() + Windows.Forms.Application.DoEvents() Next 'Ende alle Generationen 'xxxxxxxxxxxxxxxxxxxxxxxxxxx - System.Windows.Forms.Application.DoEvents() + Windows.Forms.Application.DoEvents() 'POPULATIONS SELEKTIONSPROZESS Schritt 1 '######################################## - 'Einordnen der Qualitätsfunktion im PopulationsBestwertspeicher + 'Einordnen der Qualitätsfunktion im PopulationsBestwertspeicher Call PES1.EsPopBest() 'Verlauf aktualisieren @@ -393,13 +390,13 @@ Public Class ESController End Sub ''' - ''' Führt Reproduktion und Mutation aus und kopiert die neu gewonnenen Parameter ins Individuum + ''' Führt Reproduktion und Mutation aus und kopiert die neu gewonnenen Parameter ins Individuum ''' ''' Das Individuum, dessen Parameter erneuert werden soll - Private Sub PES_getNewParameters(ByRef ind As BlueM.Opt.Common.Individuum_PES) + Private Sub PES_getNewParameters(ByRef ind As Individuum_PES) 'REPRODUKTIONSPROZESS - 'Ermitteln der neuen Ausgangswerte für Nachkommen aus den Eltern + 'Ermitteln der neuen Ausgangswerte für Nachkommen aus den Eltern Call PES1.EsReproduktion() 'MUTATIONSPROZESS @@ -407,22 +404,22 @@ Public Class ESController Call PES1.EsMutation() 'Auslesen der variierten Parameter und in Individuum kopieren - ind.OptParameter = BlueM.Opt.Common.OptParameter.Clone_Array(PES1.EsGetParameter()) + ind.OptParameter = OptParameter.Clone_Array(PES1.EsGetParameter()) End Sub ''' - ''' Verarbeitet ein evaluiertes Individuum für PES: + ''' Verarbeitet ein evaluiertes Individuum für PES: ''' * Individuum im PES-Bestwertspeicher einordnen - ''' * Lösung im Hauptdiagramm zeichnen + ''' * Lösung im Hauptdiagramm zeichnen ''' * Dn im Monitor zeichnen ''' * Verlaufsanzeige aktualisieren ''' ''' Das zu verarbeitende Individuum ''' 0-basierte Nachfahrens-Nummer - Private Sub processIndividuum_PES(ByRef ind As Common.Individuum_PES, ByVal iNachfahre As Integer) + Private Sub processIndividuum_PES(ByRef ind As Individuum_PES, ByVal iNachfahre As Integer) - 'Lösung im Hauptdiagramm zeichnen (Testprobleme zeichnen sich selber) + 'Lösung im Hauptdiagramm zeichnen (Testprobleme zeichnen sich selber) If (myAppType = ApplicationTypes.Sim) Then Call Me.myHauptDiagramm.ZeichneIndividuum(ind, PES1.PES_iAkt.iAktRunde, PES1.PES_iAkt.iAktPop, PES1.PES_iAkt.iAktGen, iNachfahre + 1, Color.Orange) End If @@ -431,15 +428,15 @@ Public Class ESController Me.Zeichne_Dn(PES1.PES_iAkt.iAktGen * Me.mySettings.PES.N_Nachf + iNachfahre + 1, ind) 'SELEKTIONSPROZESS Schritt 1 - 'Einordnen der Qualitätsfunktion im Bestwertspeicher bei SO - 'Falls MO Einordnen der Qualitätsfunktion in NDSorting + 'Einordnen der Qualitätsfunktion im Bestwertspeicher bei SO + 'Falls MO Einordnen der Qualitätsfunktion in NDSorting PES1.PES_iAkt.iAktNachf = iNachfahre Call PES1.EsBest(ind) 'Verlauf aktualisieren (don't use iNachf as they are not always processed in order) Me.myProgress.NextNachf() - System.Windows.Forms.Application.DoEvents() + Windows.Forms.Application.DoEvents() End Sub @@ -466,7 +463,7 @@ Public Class ESController If (Me.mySettings.PES.SetMutation.IsDnVektor) Then - 'Bei PES-Schrittweitenvektor eine Linie für jeden Parameter + 'Bei PES-Schrittweitenvektor eine Linie für jeden Parameter ReDim Me.Line_Dn(Me.myProblem.List_OptParameter.Length - 1) For i As Integer = 0 To Me.myProblem.List_OptParameter.Length - 1 Me.Line_Dn(i) = Me.myMonitor.Diag.getSeriesLine("Step size " & Me.myProblem.List_OptParameter(i).Bezeichnung) @@ -511,10 +508,10 @@ Public Class ESController Me.Line_Hypervolume = Me.myMonitor.Diag.getSeriesLine("Hypervolume", "Red") Me.Line_Hypervolume.CustomHorizAxis = Me.myMonitor.Diag.Axes.Top Me.Line_Hypervolume.CustomVertAxis = Me.myMonitor.Diag.Axes.Right - Me.Line_Hypervolume.Color = System.Drawing.Color.Red + Me.Line_Hypervolume.Color = Color.Red Me.Line_Hypervolume.Pointer.Visible = True Me.Line_Hypervolume.Pointer.Style = Steema.TeeChart.Styles.PointerStyles.Circle - Me.Line_Hypervolume.Pointer.Brush.Color = System.Drawing.Color.Red + Me.Line_Hypervolume.Pointer.Brush.Color = Color.Red Me.Line_Hypervolume.Pointer.HorizSize = 2 Me.Line_Hypervolume.Pointer.VertSize = 2 Me.Line_Hypervolume.Pointer.Pen.Visible = False @@ -534,9 +531,9 @@ Public Class ESController ''' ''' Schrittweite(n) in Monitordiagramm eintragen ''' - ''' Durchlaufnummer (für X-Achse) + ''' Durchlaufnummer (für X-Achse) ''' Individuum, dessen Schrittweite(n) gezeichnet werden sollen - Private Sub Zeichne_Dn(ByVal durchlauf As Integer, ByVal ind As Common.Individuum) + Private Sub Zeichne_Dn(ByVal durchlauf As Integer, ByVal ind As Individuum) Dim i As Integer diff --git a/BlueM.Opt/Algos/ES/Functions.vb b/BlueM.Opt/Algos/ES/Functions.vb index 20a2970d..1d2d745b 100644 --- a/BlueM.Opt/Algos/ES/Functions.vb +++ b/BlueM.Opt/Algos/ES/Functions.vb @@ -18,13 +18,13 @@ Imports BlueM.Opt.Common ''' -''' 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 ''' 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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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) @@ -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 @@ -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 @@ -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 @@ -250,7 +250,7 @@ Public Class Functions ''' ''' 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) ''' ''' zu sortierendes Array von Individuen ''' Anzahl dominanter Individuen (Front) @@ -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) @@ -279,7 +279,7 @@ 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) @@ -287,17 +287,17 @@ Public Class Functions 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 @@ -411,9 +411,9 @@ 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 @@ -421,48 +421,48 @@ Public Class Functions 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 diff --git a/BlueM.Opt/Algos/ES/PES.vb b/BlueM.Opt/Algos/ES/PES.vb index 194a8a21..9cb9395f 100644 --- a/BlueM.Opt/Algos/ES/PES.vb +++ b/BlueM.Opt/Algos/ES/PES.vb @@ -20,7 +20,7 @@ Imports BlueM.Opt.Common ''' ''' Klasse PES (Parametric Evolution Strategy) ''' Modifizierte Evolutionsstrategie nach Rechenberg und Schwefel -''' Klasse enthält alle Funktionen und Methoden zur Anwendung der Evolutionsstrategie +''' Klasse enthält alle Funktionen und Methoden zur Anwendung der Evolutionsstrategie ''' Literatur: ''' 1) Rechenberg, Ingo, Evolutionsstrategie '94, Fromman-Holzboog, 1994 ''' 2) Schwefel, Hans-Paul, Evolution and Optimum Seeking, Wiley, 1995 @@ -39,12 +39,12 @@ Public Class PES Private AktPara() As OptParameter 'Diese Struktur speichert den aktuellen Zustand - 'ToDo: Könnte man auch entfernen wenn man die Schleifenkontrolle ins Form legt + 'ToDo: Könnte man auch entfernen wenn man die Schleifenkontrolle ins Form legt Public Structure Struct_iAkt - Dim iAktRunde As Integer 'Zähler für aktuelle Runde - Dim iAktPop As Integer 'Zähler für aktuelle Population - Dim iAktGen As Integer 'Zähler für aktuelle Generation - Dim iAktNachf As Integer 'Zähler für aktuellen Nachfahren + Dim iAktRunde As Integer 'Zähler für aktuelle Runde + Dim iAktPop As Integer 'Zähler für aktuelle Population + Dim iAktGen As Integer 'Zähler für aktuelle Generation + Dim iAktNachf As Integer 'Zähler für aktuellen Nachfahren End Structure 'Muss Public sein, da das Form hiermit die Schleifen kontrolliert @@ -55,23 +55,23 @@ Public Class PES Private Dp(,,) As Double 'PopulationsElternschrittweite '---PopBestwerte------- - Private Xbpop(,,) As Double 'Bestwertspeicher Variablenwerte für eine Population - Private Dbpop(,,) As Double 'Bestwertspeicher Schrittweite für eine Population - Private Qbpop(,) As Double 'Bestwertspeicher für eine Population + Private Xbpop(,,) As Double 'Bestwertspeicher Variablenwerte für eine Population + Private Dbpop(,,) As Double 'Bestwertspeicher Schrittweite für eine Population + Private Qbpop(,) As Double 'Bestwertspeicher für eine Population '---Elternwerte-------- Private Xe(,,) As Double 'Elternwerte der Variablen Private De(,,) As Double 'Elternschrittweite - Private Div(,) As Double 'Diversitätsmass + Private Div(,) As Double 'Diversitätsmass Private Front(,) As Integer 'Front '---Bestwerte---------- Public Structure Bestwerte - Dim Xb(,,) As Double 'Bestwertspeicher Variablenwerte für eine Generation - Dim Db(,,) As Double 'Bestwertspeicher Schrittweite für eine Generation - Dim Qb(,,) As Double 'Bestwertspeicher für eine Generation - Dim Rb(,,) As Double 'Restriktionen für eine Generation - Dim Div(,) As Double 'Diversität der Individuen für eine Generation + Dim Xb(,,) As Double 'Bestwertspeicher Variablenwerte für eine Generation + Dim Db(,,) As Double 'Bestwertspeicher Schrittweite für eine Generation + Dim Qb(,,) As Double 'Bestwertspeicher für eine Generation + Dim Rb(,,) As Double 'Restriktionen für eine Generation + Dim Div(,) As Double 'Diversität der Individuen für eine Generation Dim Front(,) As Double 'Front der Individuen End Structure @@ -79,9 +79,9 @@ Public Class PES '---Stuff-------------- Private Distanceb() As Double 'Array mit Crowding-Distance (Neighbourhood-Rekomb.) - Private PenaltyDistance(,) As Double 'Array für normierte Raumabstände (Neighbourhood-Rekomb.) + Private PenaltyDistance(,) As Double 'Array für normierte Raumabstände (Neighbourhood-Rekomb.) '--------------------- - Public SekundärQb(-1) As Individuum 'Sekundäre Population wird mit -1 initialisiert dann länge 0 + Public SekundärQb(-1) As Individuum 'Sekundäre Population wird mit -1 initialisiert dann länge 0 Const galpha As Double = 1.3 'Faktor alpha = 1.3 auf Generationsebene nach Rechenberg Const palpha As Double = 1.1 'Faktor alpha = 1.1 auf Populationsebene nach Rechenberg @@ -121,7 +121,7 @@ Public Class PES Me.mProblem = prob 'Schritt 1: PES - SETTINGS - 'Optionen der Evolutionsstrategie werden übergeben + 'Optionen der Evolutionsstrategie werden übergeben Call PES_Form_Settings(settings) 'Schritt 2: PES - PREPARE @@ -135,20 +135,20 @@ Public Class PES End Sub 'Schritt 1: SETTINGS - 'Function ES_SETTINGS übergibt Optionen für Evolutionsstrategie und Prüft die eingestellten Optionen + 'Function ES_SETTINGS übergibt Optionen für Evolutionsstrategie und Prüft die eingestellten Optionen '*************************************************************************************************** Private Sub PES_Form_Settings(ByRef settings As Settings) - 'Überprüfung der Übergebenen Werte + 'Überprüfung der Übergebenen Werte 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - If (Not System.Enum.IsDefined(GetType(EVO_STRATEGY), settings.PES.Strategie)) Then + If (Not [Enum].IsDefined(GetType(EVO_STRATEGY), settings.PES.Strategie)) Then Throw New Exception("Invalid setting for 'Strategy'!") End If - If (Not System.Enum.IsDefined(GetType(EVO_STARTPARAMETERS), settings.PES.Startparameter)) Then + If (Not [Enum].IsDefined(GetType(EVO_STARTPARAMETERS), settings.PES.Startparameter)) Then Throw New Exception("Invalid setting for 'Start values'!") End If 'Schrittweite - If (Not System.Enum.IsDefined(GetType(PES_MUTATIONSOP), settings.PES.Mutationsop)) Then + If (Not [Enum].IsDefined(GetType(PES_MUTATIONSOP), settings.PES.Mutationsop)) Then Throw New Exception("Invalid setting for 'Mutation'!") End If If (settings.PES.SetMutation.DnStart < 0) Then @@ -168,7 +168,7 @@ Public Class PES Throw New Exception("The number of children can not be less than 1!") End If 'Eltern - If (Not System.Enum.IsDefined(GetType(PES_REPRODOP), settings.PES.Reproduktionsop)) Then + If (Not [Enum].IsDefined(GetType(PES_REPRODOP), settings.PES.Reproduktionsop)) Then Throw New Exception("Invalid setting for the determination of parents!") End If If (settings.PES.OptModus = EVO_MODE.Single_Objective And settings.PES.Reproduktionsop = PES_REPRODOP.Neighborhood) Then @@ -190,14 +190,14 @@ Public Class PES If (settings.PES.Pop.N_Popul < settings.PES.Pop.N_PopEltern) Then Throw New Exception("The number of population parents can not be larger than the number of populations!") End If - If (Not System.Enum.IsDefined(GetType(EVO_POP_ELTERN), settings.PES.Pop.PopEltern)) Then + If (Not [Enum].IsDefined(GetType(EVO_POP_ELTERN), settings.PES.Pop.PopEltern)) Then Throw New Exception("Invalid setting for the determination of population parents!") End If - If (Not System.Enum.IsDefined(GetType(EVO_STRATEGY), settings.PES.Pop.PopStrategie)) Then + If (Not [Enum].IsDefined(GetType(EVO_STRATEGY), settings.PES.Pop.PopStrategie)) Then Throw New Exception("Invalid setting for 'Selection' at the population level!") End If - 'Übergabe der Optionen + 'Übergabe der Optionen 'xxxxxxxxxxxxxxxxxxxxx Me.mSettings = settings @@ -205,15 +205,15 @@ Public Class PES End Sub 'Schritt 2: PREPARE - 'Initialisiert benötigte dynamische Arrays und legt Anzahl der Zielfunktionen fest + 'Initialisiert benötigte dynamische Arrays und legt Anzahl der Zielfunktionen fest 'Initialisiert alle internen Arrays und setzt den - 'Bestwertspeicher auf sehr großen Wert (Strategie minimiert in dieser Umsetzung) - 'TODO: ESPrepare Für Paretooptimierung noch nicht fertig!!!! + 'Bestwertspeicher auf sehr großen Wert (Strategie minimiert in dieser Umsetzung) + 'TODO: ESPrepare Für Paretooptimierung noch nicht fertig!!!! '******************************************************************************* Private Sub PES_Prepare() Dim m, n, l As Integer - 'Überprüfung der Eingabeparameter (es muss mindestens ein Parameter variiert und eine + 'Überprüfung der Eingabeparameter (es muss mindestens ein Parameter variiert und eine 'Penaltyfunktion ausgewertet werden) If (Me.mProblem.NumOptParams <= 0 Or Me.mProblem.NumPrimObjective <= 0) Then @@ -242,7 +242,7 @@ Public Class PES ReDim Best.Div(mSettings.PES.N_Eltern - 1, mSettings.PES.Pop.N_Popul - 1) ReDim Best.Front(mSettings.PES.N_Eltern - 1, mSettings.PES.Pop.N_Popul - 1) - 'NDSorting wird nur benötigt, falls eine Paretofront approximiert wird + 'NDSorting wird nur benötigt, falls eine Paretofront approximiert wird If (mSettings.PES.OptModus = EVO_MODE.Multi_Objective) Then NDSorting = Individuum.New_Indi_Array(Individuum.Individuumsklassen.Individuum_PES, mSettings.PES.N_Eltern + mSettings.PES.N_Nachf, "NDSorting") If (mSettings.PES.Reproduktionsop = PES_REPRODOP.Neighborhood) Then @@ -254,7 +254,7 @@ Public Class PES For n = 0 To mSettings.PES.N_Eltern - 1 For m = 0 To mSettings.PES.Pop.N_Popul - 1 For l = 0 To Me.mProblem.NumPrimObjective - 1 - 'Qualität der Eltern (Anzahl = parents) wird auf sehr großen Wert gesetzt + 'Qualität der Eltern (Anzahl = parents) wird auf sehr großen Wert gesetzt Best.Qb(n, m, l) = 1.0E+300 Next l If (Me.mProblem.NumConstraints > 0) Then @@ -273,11 +273,11 @@ Public Class PES Select Case mSettings.PES.Pop.PopPenalty Case EVO_POP_PENALTY.Crowding - 'Qualität der Populationseltern wird auf sehr großen Wert gesetzt + 'Qualität der Populationseltern wird auf sehr großen Wert gesetzt Qbpop(n, m) = 1.0E+300 Case EVO_POP_PENALTY.Span - 'Qualität der Populationseltern wird auf 0 gesetzt + 'Qualität der Populationseltern wird auf 0 gesetzt Qbpop(n, m) = 0 End Select Next m @@ -285,7 +285,7 @@ Public Class PES Else For n = 0 To mSettings.PES.Pop.N_Popul - 1 For m = 0 To Me.mProblem.NumPrimObjective - 1 - 'Qualität der Populationseltern wird auf sehr großen Wert gesetzt + 'Qualität der Populationseltern wird auf sehr großen Wert gesetzt Qbpop(n, m) = 1.0E+300 Next m Next n @@ -294,7 +294,7 @@ Public Class PES 'Zufallsgenerator initialisieren Randomize() - 'Informationen über aktuelle Runden übergeben + 'Informationen über aktuelle Runden übergeben PES_iAkt.iAktRunde = 0 PES_iAkt.iAktPop = 0 PES_iAkt.iAktGen = 0 @@ -302,9 +302,9 @@ Public Class PES End Sub - 'Schritt 1: Function ES_STARTVALUES setzt die Startwerte - Vorsicht: ÜBERLADEN - 'PES_Settings.iStartPar 1: Zufällige Startwert -> Schrittweite = Startschrittweite - ' -> Parameterwert = zufällig [0,1] + 'Schritt 1: Function ES_STARTVALUES setzt die Startwerte - Vorsicht: ÜBERLADEN + 'PES_Settings.iStartPar 1: Zufällige Startwert -> Schrittweite = Startschrittweite + ' -> Parameterwert = zufällig [0,1] 'PES_Settings.iStartPar 2: Originalparameter -> Schrittweite = Startschrittweite ' -> Parameterwert = Originalparameter '*********************************************************************************** @@ -318,7 +318,7 @@ Public Class PES Throw New Exception($"The start value of the optimization parameter '{Me.mProblem.List_OptParameter(i).Bezeichnung}' is not between 0 und 1. It must be scaled to this range!") End If AktPara(i) = Me.mProblem.List_OptParameter(i).Clone() - 'Startschrittweite übernehmen + 'Startschrittweite übernehmen AktPara(i).Dn = mSettings.PES.SetMutation.DnStart Next @@ -327,16 +327,16 @@ Public Class PES 'Zufallsgenerator initialisieren Randomize() - 'Die Startparameter für die Eltern werden gesetzt + 'Die Startparameter für die Eltern werden gesetzt Select Case Me.mSettings.PES.Startparameter - Case EVO_STARTPARAMETERS.Random 'Zufällige Startwerte + Case EVO_STARTPARAMETERS.Random 'Zufällige Startwerte For v = 0 To Me.mProblem.NumOptParams - 1 For n = 0 To mSettings.PES.N_Eltern - 1 For m = 0 To mSettings.PES.Pop.N_PopEltern - 1 - 'Startwert für die Elternschrittweite wird zugewiesen + 'Startwert für die Elternschrittweite wird zugewiesen Dp(v, n, m) = AktPara(0).Dn - 'Startwert für die Eltern werden zugewiesen + 'Startwert für die Eltern werden zugewiesen '(Zufallszahl zwischen 0 und 1) Xp(v, n, m) = Rnd() Next m @@ -347,9 +347,9 @@ Public Class PES For v = 0 To Me.mProblem.NumOptParams - 1 For n = 0 To mSettings.PES.N_Eltern - 1 For m = 0 To mSettings.PES.Pop.N_PopEltern - 1 - 'Startwert für die Elternschrittweite wird zugewiesen + 'Startwert für die Elternschrittweite wird zugewiesen Dp(v, n, m) = AktPara(0).Dn - 'Startwert für die Eltern werden zugewiesen + 'Startwert für die Eltern werden zugewiesen '(alle gleich Anfangswerte) Xp(v, n, m) = AktPara(v).Xn Next m @@ -359,7 +359,7 @@ Public Class PES End Sub - 'ES_GET_PARAMETER - dient zur Rückgabe der mutierten Parameter + 'ES_GET_PARAMETER - dient zur Rückgabe der mutierten Parameter '************************************************************* Public Function EsGetParameter() As OptParameter() @@ -391,11 +391,11 @@ Public Class PES Public Sub EsPopReproduktion() Dim m, n, v As Integer - Dim R As Integer 'Zufälliger Integer Wert + Dim R As Integer 'Zufälliger Integer Wert Select Case mSettings.PES.Pop.PopEltern - Case EVO_POP_ELTERN.Recombination 'MultiRekombination über alle Eltern (x/x,y) oder (x/x+y) + Case EVO_POP_ELTERN.Recombination 'MultiRekombination über alle Eltern (x/x,y) oder (x/x+y) For n = 0 To mSettings.PES.N_Eltern - 1 R = Int(mSettings.PES.Pop.N_PopEltern * Rnd()) For v = 0 To Me.mProblem.NumOptParams - 1 @@ -406,8 +406,8 @@ Public Class PES Next v Next n - Case EVO_POP_ELTERN.Average 'Mittelwertbildung über alle Eltern - 'Ermitteln der Elter und Schrittweite über Mittelung der Elternschrittweiten + Case EVO_POP_ELTERN.Average 'Mittelwertbildung über alle Eltern + 'Ermitteln der Elter und Schrittweite über Mittelung der Elternschrittweiten For v = 0 To Me.mProblem.NumOptParams - 1 For n = 0 To mSettings.PES.N_Eltern - 1 De(v, n, PES_iAkt.iAktPop) = 0 @@ -421,7 +421,7 @@ Public Class PES Next n Next v - Case EVO_POP_ELTERN.Selection 'Zufallswahl über alle Eltern + Case EVO_POP_ELTERN.Selection 'Zufallswahl über alle Eltern R = Int(mSettings.PES.Pop.N_PopEltern * Rnd()) 'Zufallszahl entscheidet welcher 'Elternteil vererbt wird For v = 0 To Me.mProblem.NumOptParams - 1 @@ -437,12 +437,12 @@ Public Class PES End Sub - 'ES_VARIA - REPRODUKTIONSPROZESS - Ermitteln der neuen Ausgangswerte für Nachkommen aus den Eltern + 'ES_VARIA - REPRODUKTIONSPROZESS - Ermitteln der neuen Ausgangswerte für Nachkommen aus den Eltern '************************************************************************************************* Public Sub EsReproduktion() Dim i, v, n, j As Integer - Dim R As Integer 'Zufälliger Integer Wert + Dim R As Integer 'Zufälliger Integer Wert Dim Realisierungsspeicher() As Integer Dim Elternspeicher() As Integer Dim Elter As Integer @@ -451,7 +451,7 @@ Public Class PES Select Case mSettings.PES.Reproduktionsop - Case PES_REPRODOP.Selection 'Zufallswahl über alle Eltern + Case PES_REPRODOP.Selection 'Zufallswahl über alle Eltern R = Int(mSettings.PES.N_Eltern * Rnd()) 'Zufallszahl entscheidet 'welcher Enternteil vererbt wird @@ -501,9 +501,9 @@ Public Class PES Case PES_REPRODOP.XY_Discrete 'Multi-Rekombination nach X/Y-Schema, diskrete Vertauschung 'Realisierungsspeicher und Elternspeicher initialisieren - 'Anzahl der benötigten Eltern (Y) + 'Anzahl der benötigten Eltern (Y) ReDim Realisierungsspeicher(mSettings.PES.N_RekombXY - 1) - 'Anzahl der Verfügbaren Eltern (n_Eltern) + 'Anzahl der Verfügbaren Eltern (n_Eltern) ReDim Elternspeicher(mSettings.PES.N_Eltern - 1) 'Setzen der Eltern Indizes For i = 0 To (mSettings.PES.N_Eltern - 1) @@ -512,7 +512,7 @@ Public Class PES 'Auswahl der Y-Eltern For i = 0 To mSettings.PES.N_RekombXY - 1 '1. Runde erlaubt Auswahl aus allen Eltern - '2. Runde hat nur noch n_Eltern - 1 zur Verfügung + '2. Runde hat nur noch n_Eltern - 1 zur Verfügung 'usw. 'Kein Elter darf doppelt gezogen werden If (mSettings.PES.Is_DiversityTournament) Then @@ -565,9 +565,9 @@ Public Class PES Case PES_REPRODOP.XY_Average 'Multi-Rekombination nach X/Y-Schema, Mittelung der Gene 'Realisierungsspeicher und Elternspeicher initialisieren - 'Anzahl der benötigten Eltern (Y) + 'Anzahl der benötigten Eltern (Y) ReDim Realisierungsspeicher(mSettings.PES.N_RekombXY - 1) - 'Anzahl der Verfügbaren Eltern (n_Eltern) + 'Anzahl der Verfügbaren Eltern (n_Eltern) ReDim Elternspeicher(mSettings.PES.N_Eltern - 1) 'Setzen der Eltern Indizes For i = 0 To (mSettings.PES.N_Eltern - 1) @@ -576,7 +576,7 @@ Public Class PES 'Auswahl der Y-Eltern For i = 0 To mSettings.PES.N_RekombXY - 1 '1. Runde erlaubt Auswahl aus allen Eltern - '2. Runde hat nur noch n_Eltern - 1 zur Verfügung + '2. Runde hat nur noch n_Eltern - 1 zur Verfügung 'usw. 'Kein Elter darf doppelt gezogen werden If (mSettings.PES.Is_DiversityTournament) Then @@ -631,9 +631,9 @@ Public Class PES Case PES_REPRODOP.XY_Average_Discrete 'Realisierungsspeicher und Elternspeicher initialisieren - 'Anzahl der benötigten Eltern (Y) + 'Anzahl der benötigten Eltern (Y) ReDim Realisierungsspeicher(mSettings.PES.N_RekombXY - 1) - 'Anzahl der Verfügbaren Eltern (n_Eltern) + 'Anzahl der Verfügbaren Eltern (n_Eltern) ReDim Elternspeicher(mSettings.PES.N_Eltern - 1) 'Setzen der Eltern Indizes For i = 0 To (mSettings.PES.N_Eltern - 1) @@ -642,7 +642,7 @@ Public Class PES 'Auswahl der Y-Eltern For i = 0 To mSettings.PES.N_RekombXY - 1 '1. Runde erlaubt Auswahl aus allen Eltern - '2. Runde hat nur noch n_Eltern - 1 zur Verfügung + '2. Runde hat nur noch n_Eltern - 1 zur Verfügung 'usw. 'Kein Elter darf doppelt gezogen werden If (mSettings.PES.Is_DiversityTournament) Then @@ -703,14 +703,14 @@ Public Class PES ' Z2 = Int(Settings.PES.n_Eltern * Rnd()) 'Loop While Z1 = Z2 - ''Tournament über Crowding Distance + ''Tournament über Crowding Distance 'If Distanceb(Z1) > Distanceb(Z2) Then ' Elter = Z1 'Else ' Elter = Z2 'End If - 'Anzahl der Verfügbaren Eltern (n_Eltern) + 'Anzahl der Verfügbaren Eltern (n_Eltern) ReDim Elternspeicher(mSettings.PES.N_Eltern - 1) 'Setzen der Eltern Indizes For i = 0 To (mSettings.PES.N_Eltern - 1) @@ -788,9 +788,9 @@ Public Class PES Public Sub EsPopMutation() Dim i, v, n As Integer - Dim DeTemp(,,) As Double 'Temporäre Schrittweiten für Eltern - Dim XeTemp(,,) As Double 'Temporäre Parameterwerte für Eltern - Dim expo As Integer 'Exponent für Schrittweite (+/-1) + Dim DeTemp(,,) As Double 'Temporäre Schrittweiten für Eltern + Dim XeTemp(,,) As Double 'Temporäre Parameterwerte für Eltern + Dim expo As Integer 'Exponent für Schrittweite (+/-1) ReDim DeTemp(Me.mProblem.NumOptParams - 1, mSettings.PES.N_Eltern - 1, mSettings.PES.Pop.N_Popul - 1) ReDim XeTemp(Me.mProblem.NumOptParams - 1, mSettings.PES.N_Eltern - 1, mSettings.PES.Pop.N_Popul - 1) @@ -802,7 +802,7 @@ Public Class PES expo = (2 * Int(Rnd() + 0.5) - 1) 'Schrittweite wird mutiert DeTemp(0, 0, PES_iAkt.iAktPop) = De(0, 0, PES_iAkt.iAktPop) * palpha ^ expo - 'Schrittweite für alle übernehmen + 'Schrittweite für alle übernehmen For n = 0 To mSettings.PES.N_Eltern - 1 For v = 0 To Me.mProblem.NumOptParams - 1 DeTemp(v, n, PES_iAkt.iAktPop) = DeTemp(0, 0, PES_iAkt.iAktPop) @@ -817,13 +817,13 @@ Public Class PES i = 0 Do i += 1 - 'Abbruchkriterium für abhängige Parameter + 'Abbruchkriterium für abhängige Parameter '---------------------------------------- If (i >= 1000) Then - 'Es konnte kein gültiger Parametersatz generiert werden! - 'Vermutlich ist die aktuelle Schrittweite nicht groß genug. + 'Es konnte kein gültiger Parametersatz generiert werden! + 'Vermutlich ist die aktuelle Schrittweite nicht groß genug. 'Elterwert des aktuellen Parameters auf aktuellen Wert - 'des Parameters setzen, von dem der aktuelle Parameter abhängig ist + 'des Parameters setzen, von dem der aktuelle Parameter abhängig ist Xe(v, n, PES_iAkt.iAktPop) = XeTemp(v - 1, n, PES_iAkt.iAktPop) i = 0 End If @@ -839,23 +839,23 @@ Public Class PES 'Normalverteilte Zufallszahl mit Standardabweichung 1/sqr(varanz) Dim Z As Double - Z = System.Math.Sqrt(-2 * System.Math.Log(1 - Rnd()) / Me.mProblem.NumOptParams) * System.Math.Sin(6.2832 * Rnd()) - 'Mutation wird durchgeführt + Z = Math.Sqrt(-2 * Math.Log(1 - Rnd()) / Me.mProblem.NumOptParams) * Math.Sin(6.2832 * Rnd()) + 'Mutation wird durchgeführt XeTemp(v, n, PES_iAkt.iAktPop) = Xe(v, n, PES_iAkt.iAktPop) + DeTemp(v, n, PES_iAkt.iAktPop) * Z - ' Restriktion für die mutierten Werte + ' Restriktion für die mutierten Werte Loop While (XeTemp(v, n, PES_iAkt.iAktPop) < 0 Or XeTemp(v, n, PES_iAkt.iAktPop) > 1 Or Not checkBeziehungPop(v, n, XeTemp)) Next v - 'Mutierte Werte übernehmen + 'Mutierte Werte übernehmen '------------------------- For v = 0 To Me.mProblem.NumOptParams - 1 De(v, n, PES_iAkt.iAktPop) = DeTemp(v, n, PES_iAkt.iAktPop) Xe(v, n, PES_iAkt.iAktPop) = XeTemp(v, n, PES_iAkt.iAktPop) Next v - Div(n, PES_iAkt.iAktPop) = 0 'Diversität wird erst nach der ersten Generation bestimmt + Div(n, PES_iAkt.iAktPop) = 0 'Diversität wird erst nach der ersten Generation bestimmt Next n @@ -868,10 +868,10 @@ Public Class PES Dim v, i As Integer 'Allgemeine Variablen - Dim XnTemp() As Double 'Temporäre Parameterwerte für Nachkomme - Dim DnTemp() As Double 'Temporäre Schrittweiten für Nachkomme - Dim CTemp() As Double 'Temporäres Schiefemaß für Nachkomme - Dim expo As Integer 'Exponent für Schrittweite (+/-1) + Dim XnTemp() As Double 'Temporäre Parameterwerte für Nachkomme + Dim DnTemp() As Double 'Temporäre Schrittweiten für Nachkomme + Dim CTemp() As Double 'Temporäres Schiefemaß für Nachkomme + Dim expo As Integer 'Exponent für Schrittweite (+/-1) ReDim XnTemp(Me.mProblem.NumOptParams - 1) ReDim DnTemp(Me.mProblem.NumOptParams - 1) @@ -893,16 +893,16 @@ Public Class PES DnTemp(0) = AktPara(0).Dn * galpha ^ expo End If - 'Über alle Parameter + 'Über alle Parameter For v = 0 To Me.mProblem.NumOptParams - 1 i = 0 Do i += 1 - 'Abbruchkriterium für abhängige Parameter + 'Abbruchkriterium für abhängige Parameter '---------------------------------------- If (i >= 1000) Then - 'Es konnte kein gültiger Parametersatz generiert werden! Vermutlich ist die aktuelle Schrittweite nicht groß genug. - 'Elterwert des aktuellen Parameters auf aktuellen Wert des Parameters setzen, von dem der aktuelle Parameter abhängig ist + 'Es konnte kein gültiger Parametersatz generiert werden! Vermutlich ist die aktuelle Schrittweite nicht groß genug. + 'Elterwert des aktuellen Parameters auf aktuellen Wert des Parameters setzen, von dem der aktuelle Parameter abhängig ist i = 0 AktPara(v).Xn = XnTemp(v - 1) End If @@ -919,14 +919,14 @@ Public Class PES End If 'Normalverteilte Zufallszahl mit Standardabweichung 1/sqr(varanz) - 'Z = System.Math.Sqrt(-2 * System.Math.Log(1 - Rnd()) / Me.mProblem.NumParams) * System.Math.Sin(6.2832 * Rnd()) + 'Z = Math.Sqrt(-2 * Math.Log(1 - Rnd()) / Me.mProblem.NumParams) * Math.Sin(6.2832 * Rnd()) 'Normalverteilte Zufallszahl mit Standardabweichung 1/sqr(var.anz), , Mittelwert 0 Z = Me.NormalDistributationRND(1 / Math.Sqrt(Me.mProblem.NumOptParams), 0.0) - 'Mutation wird durchgeführt + 'Mutation wird durchgeführt '************************** XnTemp(v) = AktPara(v).Xn + DnTemp(v) * Z - 'Restriktion für die mutierten Werte + 'Restriktion für die mutierten Werte Loop While (XnTemp(v) < 0 Or XnTemp(v) > 1 Or Not checkBeziehung(v, XnTemp)) Next v @@ -954,17 +954,17 @@ Public Class PES ZFix = Me.NormalDistributationRND(1.0, 0.0) End If - 'Über alle Parameter + 'Über alle Parameter '******************* For v = 0 To Me.mProblem.NumOptParams - 1 i = 0 Do i += 1 - 'Abbruchkriterium für abhängige Parameter + 'Abbruchkriterium für abhängige Parameter '---------------------------------------- If (i >= 1000) Then - 'Es konnte kein gültiger Parametersatz generiert werden! Vermutlich ist die aktuelle Schrittweite nicht groß genug. - 'Elterwert des aktuellen Parameters auf aktuellen Wert des Parameters setzen, von dem der aktuelle Parameter abhängig ist + 'Es konnte kein gültiger Parametersatz generiert werden! Vermutlich ist die aktuelle Schrittweite nicht groß genug. + 'Elterwert des aktuellen Parameters auf aktuellen Wert des Parameters setzen, von dem der aktuelle Parameter abhängig ist i = 0 AktPara(v).Xn = XnTemp(v - 1) End If @@ -984,21 +984,21 @@ Public Class PES End If 'Normalverteilte Zufallszahl mit Standardabweichung 1/sqr(varanz) - 'Z = System.Math.Sqrt(-2 * System.Math.Log(1 - Rnd()) / Me.mProblem.NumParams) * System.Math.Sin(6.2832 * Rnd()) + 'Z = Math.Sqrt(-2 * Math.Log(1 - Rnd()) / Me.mProblem.NumParams) * Math.Sin(6.2832 * Rnd()) 'Normalverteilte Zufallszahl mit Standardabweichung 1, Mittelwert 0 Z = Me.NormalDistributationRND(1.0, 0.0) - 'Mutation wird durchgeführt + 'Mutation wird durchgeführt '************************** XnTemp(v) = AktPara(v).Xn + DnTemp(v) * Z - 'Restriktion für die mutierten Werte + 'Restriktion für die mutierten Werte Loop While (XnTemp(v) < 0 Or XnTemp(v) > 1 Or Not checkBeziehung(v, XnTemp)) Next v End Select - 'Mutierte Werte übernehmen + 'Mutierte Werte übernehmen '------------------------- For v = 0 To Me.mProblem.NumOptParams - 1 AktPara(v).Dn = DnTemp(v) @@ -1007,7 +1007,7 @@ Public Class PES End Sub - 'normalverteilte Zufallszahl für Schwefelmutation + 'normalverteilte Zufallszahl für Schwefelmutation '************************************************ Public Function NormalDistributationRND(ByVal sd As Double, ByVal mean As Double) As Double Dim fac As Double @@ -1026,15 +1026,15 @@ Public Class PES Return gauss End Function - 'ES_POP_BEST - Einordnen der Qualitätsfunktion im PopulationsBestwertspeicher + 'ES_POP_BEST - Einordnen der Qualitätsfunktion im PopulationsBestwertspeicher '**************************************************************************** Public Sub EsPopBest() Dim m, i, j, n As Integer Dim h1, h2 As Double - 'Der schlechtetste der besten Qualitätswerte wird bestimmt ; Position -> i - '(höchster Wert der Penaltyfunktion, niedrigster Wert der Crowding Distance) + 'Der schlechtetste der besten Qualitätswerte wird bestimmt ; Position -> i + '(höchster Wert der Penaltyfunktion, niedrigster Wert der Crowding Distance) i = 0 h1 = Qbpop(0, 0) For m = 1 To mSettings.PES.Pop.N_Popul - 1 @@ -1061,8 +1061,8 @@ Public Class PES End If Next m - 'Der schlechtetste der besten Qualitätswerte wird bestimmt ; Position -> i - '(höchster Wert der Kostenfunktion, niedrigster Wert der Spannweite) + 'Der schlechtetste der besten Qualitätswerte wird bestimmt ; Position -> i + '(höchster Wert der Kostenfunktion, niedrigster Wert der Spannweite) If (mSettings.PES.OptModus = EVO_MODE.Multi_Objective) Then j = 0 h2 = Qbpop(0, 1) @@ -1074,7 +1074,7 @@ Public Class PES Next m End If - 'Qualität der aktuellen Population wird bestimmt + 'Qualität der aktuellen Population wird bestimmt h1 = 0 If (mSettings.PES.OptModus = EVO_MODE.Single_Objective) Then For m = 0 To mSettings.PES.N_Eltern - 1 @@ -1085,16 +1085,16 @@ Public Class PES h1 = NDS_Crowding_Distance_Count(h2) End If - 'Falls die Qualität des aktuellen Population besser ist (Penaltyfunktion geringer) + 'Falls die Qualität des aktuellen Population besser ist (Penaltyfunktion geringer) 'als die schlechteste im Bestwertspeicher, wird diese ersetzt If (mSettings.PES.OptModus = EVO_MODE.Single_Objective) Then If h1 < Qbpop(i, 0) Then Qbpop(i, 0) = h1 For m = 0 To Me.mProblem.NumOptParams - 1 For n = 0 To mSettings.PES.N_Eltern - 1 - 'Die Schrittweite wird ebenfalls übernommen + 'Die Schrittweite wird ebenfalls übernommen Dbpop(m, n, i) = Best.Db(m, n, PES_iAkt.iAktPop) - 'Die eigentlichen Parameterwerte werden übernommen + 'Die eigentlichen Parameterwerte werden übernommen Xbpop(m, n, i) = Best.Xb(m, n, PES_iAkt.iAktPop) Next n Next m @@ -1107,9 +1107,9 @@ Public Class PES Qbpop(i, 0) = h1 For m = 0 To Me.mProblem.NumOptParams - 1 For n = 0 To mSettings.PES.N_Eltern - 1 - 'Die Schrittweite wird ebenfalls übernommen + 'Die Schrittweite wird ebenfalls übernommen Dbpop(m, n, i) = Best.Db(m, n, PES_iAkt.iAktPop) - 'Die eigentlichen Parameterwerte werden übernommen + 'Die eigentlichen Parameterwerte werden übernommen Xbpop(m, n, i) = Best.Xb(m, n, PES_iAkt.iAktPop) Next n Next m @@ -1120,9 +1120,9 @@ Public Class PES Qbpop(j, 1) = h2 For m = 0 To Me.mProblem.NumOptParams - 1 For n = 0 To mSettings.PES.N_Eltern - 1 - 'Die Schrittweite wird ebenfalls übernommen + 'Die Schrittweite wird ebenfalls übernommen Dbpop(m, n, j) = Best.Db(m, n, PES_iAkt.iAktPop) - 'Die eigentlichen Parameterwerte werden übernommen + 'Die eigentlichen Parameterwerte werden übernommen Xbpop(m, n, j) = Best.Xb(m, n, PES_iAkt.iAktPop) Next n Next m @@ -1132,7 +1132,7 @@ Public Class PES End Sub - 'ES_BEST - Einordnen der Qualitätsfunktion im Bestwertspeicher + 'ES_BEST - Einordnen der Qualitätsfunktion im Bestwertspeicher '************************************************************* Public Sub EsBest(ByVal Ind As Individuum) @@ -1142,8 +1142,8 @@ Public Class PES If (mSettings.PES.OptModus = EVO_MODE.Single_Objective) Then 'SO - Standard ES nach Rechenberg '-------------------------------- - 'Der schlechteste der besten Qualitätswerte wird bestimmt ; Position -> j - '(höchster Wert der Penaltyfunktion) + 'Der schlechteste der besten Qualitätswerte wird bestimmt ; Position -> j + '(höchster Wert der Penaltyfunktion) j = 0 h = Best.Qb(0, PES_iAkt.iAktPop, 0) @@ -1154,14 +1154,14 @@ Public Class PES End If Next m - 'Falls die Qualität des aktuellen Nachkommen besser ist (Penaltyfunktion geringer) + 'Falls die Qualität des aktuellen Nachkommen besser ist (Penaltyfunktion geringer) 'als die schlechteste im Bestwertspeicher, wird dieser ersetzt If Ind.PrimObjectives(0) < Best.Qb(j, PES_iAkt.iAktPop, 0) Then Best.Qb(j, PES_iAkt.iAktPop, 0) = Ind.PrimObjectives(0) For v = 0 To Me.mProblem.NumOptParams - 1 - 'Die Schrittweite wird ebenfalls übernommen + 'Die Schrittweite wird ebenfalls übernommen Best.Db(v, j, PES_iAkt.iAktPop) = Ind.OptParameter(v).Dn - 'Die eigentlichen Parameterwerte werden übernommen + 'Die eigentlichen Parameterwerte werden übernommen Best.Xb(v, j, PES_iAkt.iAktPop) = Ind.OptParameter(v).Xn Next v End If @@ -1178,7 +1178,7 @@ Public Class PES End Sub 'ES_BESTWERTSPEICHER - 'Führt einen Reset des Bestwertspeicher durch, falls eine Komma-Strategie gewählt ist + 'Führt einen Reset des Bestwertspeicher durch, falls eine Komma-Strategie gewählt ist '************************************************************************************ Public Sub EsResetBWSpeicher() Dim n, i As Integer @@ -1194,7 +1194,7 @@ Public Class PES End Sub 'ES_POP_BESTWERTSPEICHER - 'Führt einen Reset des Bestwertspeicher auf Populationsebene durch, falls eine Komma-Strategie gewählt ist + 'Führt einen Reset des Bestwertspeicher auf Populationsebene durch, falls eine Komma-Strategie gewählt ist '********************************************************************************************************* Public Sub EsResetPopBWSpeicher() Dim n, i As Integer @@ -1227,7 +1227,7 @@ Public Class PES ReDim Realisierungsspeicher(mSettings.PES.Pop.N_Popul - 1, 1) - 'Die NPopEltern besten Individium-Sätze werden ermittelt + 'Die NPopEltern besten Individium-Sätze werden ermittelt For m = 0 To mSettings.PES.Pop.N_Popul - 1 Realisierungsspeicher(m, 0) = Qbpop(m, Z) Realisierungsspeicher(m, 1) = m @@ -1318,7 +1318,7 @@ Public Class PES 'Multi-Objective Pareto 'xxxxxxxxxxxxxxxxxxxxxx '1. Eltern und Nachfolger werden gemeinsam betrachtet - 'Nur Eltern werden NDSorting hinzugefügt, Kinder sind schon oben drin + 'Nur Eltern werden NDSorting hinzugefügt, Kinder sind schon oben drin '-------------------------------------------------------------------- For i = mSettings.PES.N_Nachf To mSettings.PES.N_Nachf + mSettings.PES.N_Eltern - 1 Call Copy_Bestwert_to_Individuum(i, i - mSettings.PES.N_Nachf, INDSorting) @@ -1334,18 +1334,18 @@ Public Class PES Next '--------------------------------- '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 '-------------------------------- Dim Func1 As ES.Functions = New ES.Functions(Me.mProblem, Me.mSettings.PES.N_Nachf, Me.mSettings.PES.N_Eltern, Me.mSettings.PES.SekPop.Is_Begrenzung, Me.mSettings.PES.SekPop.N_MaxMembers, Me.mSettings.PES.SekPop.N_Interact, Me.mSettings.PES.SekPop.Is_Interact, PES_iAkt.iAktGen) - Call Func1.EsEltern_Pareto(NDSorting, SekundärQb, Best_Indi) + Call Func1.EsEltern_Pareto(NDSorting, SekundärQb, Best_Indi) 'Bestimmen der Crowding Distance falls Diversity-Tournament '---------------------------------------------------------- If (mSettings.PES.Is_DiversityTournament) Then Call Func1.Pareto_Crowding_Distance(Best_Indi) End If - 'Am ende die Bestwerte wieder zurück + 'Am ende die Bestwerte wieder zurück For i = 0 To Best.Qb.GetUpperBound(0) Call Copy_Individuum_to_Bestwert(i, Best_Indi) Next @@ -1364,7 +1364,7 @@ Public Class PES End If Next i - '6: Sortierung der Lösungen ist nur für Neighbourhood-Rekombination notwendig + '6: Sortierung der Lösungen ist nur für Neighbourhood-Rekombination notwendig '---------------------------------------------------------------------------- If (mSettings.PES.Reproduktionsop = PES_REPRODOP.Neighborhood) Then Call Neighbourhood_AbstandsArray() @@ -1454,7 +1454,7 @@ Public Class PES ReDim PenaltyDistance(mSettings.PES.N_Eltern - 1, mSettings.PES.N_Eltern - 1) ReDim d(mSettings.PES.N_Eltern - 1) - 'Bestimmen der normierten Raumabstände zwischen allen Elternindividuen + 'Bestimmen der normierten Raumabstände zwischen allen Elternindividuen For i = 0 To mSettings.PES.N_Eltern - 1 PenaltyDistance(i, i) = 0 For j = i + 1 To mSettings.PES.N_Eltern - 1 @@ -1464,7 +1464,7 @@ Public Class PES TempDistance(k) = TempDistance(k) * TempDistance(k) PenaltyDistance(i, j) += TempDistance(k) Next k - PenaltyDistance(i, j) = System.Math.Sqrt(PenaltyDistance(i, j)) + PenaltyDistance(i, j) = Math.Sqrt(PenaltyDistance(i, j)) PenaltyDistance(j, i) = PenaltyDistance(i, j) Next j Next i @@ -1490,7 +1490,7 @@ Public Class PES Next i NDS_Crowding_Distance_Count = NDS_Crowding_Distance_Count / mSettings.PES.N_Eltern - NDS_Crowding_Distance_Count = System.Math.Sqrt(NDS_Crowding_Distance_Count) + NDS_Crowding_Distance_Count = Math.Sqrt(NDS_Crowding_Distance_Count) Spannweite = 0 For i = 0 To mSettings.PES.N_Eltern - 1 @@ -1502,7 +1502,7 @@ Public Class PES End Function - 'Neighbourhood_AbstandsArray - Bestimme Array der Raumabstände für Neighbourhood-Rekombination + 'Neighbourhood_AbstandsArray - Bestimme Array der Raumabstände für Neighbourhood-Rekombination '********************************************************************************************* Private Sub Neighbourhood_AbstandsArray() @@ -1513,7 +1513,7 @@ Public Class PES Dim Min, Max As Double Dim TempDistance() As Double - 'Bestimmen des Normierungsfaktors für jede Dimension des Lösungsraums (MinMax) + 'Bestimmen des Normierungsfaktors für jede Dimension des Lösungsraums (MinMax) ReDim MinMax(Me.mProblem.NumPrimObjective - 1) For k = 0 To Me.mProblem.NumPrimObjective - 1 MinMax(k) = 0 @@ -1526,7 +1526,7 @@ Public Class PES MinMax(k) = Max - Min Next k - 'Bestimmen der normierten Raumabstände zwischen allen Elternindividuen + 'Bestimmen der normierten Raumabstände zwischen allen Elternindividuen ReDim TempDistance(Me.mProblem.NumPrimObjective) For i = 0 To mSettings.PES.N_Eltern - 1 @@ -1539,8 +1539,8 @@ Public Class PES TempDistance(k) = TempDistance(k) * TempDistance(k) PenaltyDistance(i, j) = PenaltyDistance(i, j) + TempDistance(k) Next k - PenaltyDistance(i, j) = System.Math.Sqrt(PenaltyDistance(i, j)) - 'Die obere Diagonale wird eigentlich nicht benötigt - dient nur der Sicherheit, falls Indizes vertauscht werden!!! + PenaltyDistance(i, j) = Math.Sqrt(PenaltyDistance(i, j)) + 'Die obere Diagonale wird eigentlich nicht benötigt - dient nur der Sicherheit, falls Indizes vertauscht werden!!! PenaltyDistance(j, i) = PenaltyDistance(i, j) Next j Next i @@ -1548,7 +1548,7 @@ Public Class PES End Sub 'Neighbourhood_Eltern - 'Bestimme die NAnzahlEltern mit geringsten Raumabständen für Neighbourhood-Rekombination + 'Bestimme die NAnzahlEltern mit geringsten Raumabständen für Neighbourhood-Rekombination '*************************************************************************************** Private Sub Neighbourhood_Eltern(ByVal IndexElter As Integer, ByRef IndexEltern() As Integer) @@ -1586,7 +1586,7 @@ Public Class PES End Sub 'Neighbourhood_Crowding_Distance - 'Bestimme die NAnzahlEltern mit geringsten Raumabständen für Neighbourhood-Rekombination + 'Bestimme die NAnzahlEltern mit geringsten Raumabständen für Neighbourhood-Rekombination '*************************************************************************************** Private Sub Neighbourhood_Crowding_Distance() @@ -1628,12 +1628,12 @@ Public Class PES End Sub - 'Einen Parameterwert auf Einhaltung der Beziehung überprüfen + 'Einen Parameterwert auf Einhaltung der Beziehung überprüfen '*********************************************************** Private Function checkBeziehung(ByVal ipara As Integer, ByVal XnTemp() As Double) As Boolean - 'ipara ist der Index des zu überprüfenden Parameters, - 'XnTemp() die zu prüfenden (skalierten) Werte + 'ipara ist der Index des zu überprüfenden Parameters, + 'XnTemp() die zu prüfenden (skalierten) Werte Dim isOK As Boolean = False If (AktPara(ipara).Beziehung = Relationship.none) Then @@ -1659,11 +1659,11 @@ Public Class PES End Function - 'Einen Parameterwert auf Einhaltung der Beziehung überprüfen (Populationsebene) + 'Einen Parameterwert auf Einhaltung der Beziehung überprüfen (Populationsebene) '****************************************************************************** Private Function checkBeziehungPop(ByVal ipara As Integer, ByVal iElter As Integer, ByVal XeTemp(,,) As Double) As Boolean - 'ipara ist der Index des zu überprüfenden Parameters, + 'ipara ist der Index des zu überprüfenden Parameters, 'iElter der Index des Elters, 'XeTemp die aktuellen Werte diff --git a/BlueM.Opt/Algos/HookeAndJeeves/HJController.vb b/BlueM.Opt/Algos/HookeAndJeeves/HJController.vb index a6f775a0..75a41b94 100644 --- a/BlueM.Opt/Algos/HookeAndJeeves/HJController.vb +++ b/BlueM.Opt/Algos/HookeAndJeeves/HJController.vb @@ -15,13 +15,13 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports BlueM.Opt.Common.Constants +Imports BlueM.Opt.Common ''' ''' Controller für Hooke And Jeeves ''' Public Class HJController - Implements BlueM.Opt.Algos.IController + Implements Algos.IController ''' ''' Multithreading Support @@ -32,14 +32,14 @@ Public Class HJController End Get End Property - Private myProblem As BlueM.Opt.Common.Problem - Private mySettings As BlueM.Opt.Common.Settings - Private myProgress As BlueM.Opt.Common.Progress 'TODO: Verlaufsanzeige für H&J - Private myHauptDiagramm As BlueM.Opt.Diagramm.Hauptdiagramm + Private myProblem As Problem + Private mySettings As Settings + Private myProgress As Progress 'TODO: Verlaufsanzeige für H&J + Private myHauptDiagramm As Diagramm.Hauptdiagramm - Private myAppType As BlueM.Opt.Common.ApplicationTypes - Private WithEvents Sim1 As BlueM.Opt.Apps.Sim - Private Testprobleme1 As BlueM.Opt.Apps.Testprobleme + Private myAppType As ApplicationTypes + Private WithEvents Sim1 As Apps.Sim + Private Testprobleme1 As Apps.Testprobleme Private stopped As Boolean @@ -52,9 +52,9 @@ Public Class HJController ''' ''' ''' - Public Sub Init(ByRef inputProblem As Common.Problem, - ByRef inputSettings As Common.Settings, - ByRef inputProgress As Common.Progress, + Public Sub Init(ByRef inputProblem As Problem, + ByRef inputSettings As Settings, + ByRef inputProgress As Progress, ByRef inputHptDiagramm As Diagramm.Hauptdiagramm) Implements IController.Init Me.myProblem = inputProblem @@ -68,7 +68,7 @@ Public Class HJController ''' Initialisiert den Controller für Sim-Anwendungen ''' ''' die Simulationsanwendung - Public Sub InitApp(ByRef inputSim As BlueM.Opt.Apps.Sim) Implements IController.InitApp + Public Sub InitApp(ByRef inputSim As Apps.Sim) Implements IController.InitApp Me.myAppType = ApplicationTypes.Sim Me.Sim1 = inputSim End Sub @@ -76,7 +76,7 @@ Public Class HJController ''' ''' Initialisiert den Controller für Testprobleme ''' - Public Sub InitApp(ByRef inputTestprobleme As BlueM.Opt.Apps.Testprobleme) Implements IController.InitApp + Public Sub InitApp(ByRef inputTestprobleme As Apps.Testprobleme) Implements IController.InitApp Me.myAppType = ApplicationTypes.Testproblems Me.Testprobleme1 = inputTestprobleme End Sub @@ -91,7 +91,7 @@ Public Class HJController Dim j As Integer Dim k As Integer Dim b As Boolean - Dim ind As Common.Individuum + Dim ind As Individuum Dim QNBest() As Double Dim QBest() As Double Dim aktuellePara(Me.myProblem.NumOptParams - 1) As Double @@ -141,7 +141,7 @@ Public Class HJController 'Bestimmen der Ausgangsgüte '========================== 'Individuum instanzieren - ind = New Common.Individuum_PES("HJ", durchlauf) + ind = New Individuum_PES("HJ", durchlauf) 'OptParameter ins Individuum kopieren For i = 0 To ind.OptParameter.Length - 1 @@ -165,7 +165,7 @@ Public Class HJController Call Me.Testprobleme1.Evaluate(ind, 0, Me.myHauptDiagramm) End If - Call System.Windows.Forms.Application.DoEvents() + Call Windows.Forms.Application.DoEvents() 'Penalties in Bestwert kopieren Call ind.PrimObjectives.CopyTo(QNBest, 0) @@ -183,10 +183,10 @@ Public Class HJController durchlauf += 1 'Monitor - Common.Log.AddMessage(Common.Log.levels.info, "Tastschritte aktuell: " & Tastschritte_aktuell.ToString()) + Log.AddMessage(Log.levels.info, "Tastschritte aktuell: " & Tastschritte_aktuell.ToString()) 'Individuum instanzieren - ind = New Common.Individuum_PES("HJ", durchlauf) + ind = New Individuum_PES("HJ", durchlauf) 'OptParameter ins Individuum kopieren For i = 0 To ind.OptParameter.Length - 1 @@ -210,7 +210,7 @@ Public Class HJController Call Me.Testprobleme1.Evaluate(ind, 0, Me.myHauptDiagramm) End If - Call System.Windows.Forms.Application.DoEvents() + Call Windows.Forms.Application.DoEvents() If (ind.PrimObjectives(0) >= QNBest(0)) Then @@ -220,10 +220,10 @@ Public Class HJController durchlauf += 1 'Monitor - Common.Log.AddMessage(Common.Log.levels.info, "Tastschritte aktuell: " & Tastschritte_aktuell.ToString()) + Log.AddMessage(Log.levels.info, "Tastschritte aktuell: " & Tastschritte_aktuell.ToString()) 'Individuum instanzieren - ind = New Common.Individuum_PES("HJ", durchlauf) + ind = New Individuum_PES("HJ", durchlauf) 'OptParameter ins Individuum kopieren For i = 0 To ind.OptParameter.Length - 1 @@ -248,7 +248,7 @@ Public Class HJController Call Me.Testprobleme1.Evaluate(ind, 0, Me.myHauptDiagramm) End If - Call System.Windows.Forms.Application.DoEvents() + Call Windows.Forms.Application.DoEvents() If (ind.PrimObjectives(0) >= QNBest(0)) Then aktuellePara = HookJeeves.TastschrittResetParameter(j) @@ -264,9 +264,9 @@ Public Class HJController Tastschritte_aktuell = 0 'Monitor - Common.Log.AddMessage(Common.Log.levels.info, "Tastschritte gesamt: " & Tastschritte_gesamt.ToString()) - Common.Log.AddMessage(Common.Log.levels.info, "Tastschritte aktuell: " & Tastschritte_aktuell.ToString()) - Common.Log.AddMessage(Common.Log.levels.info, "Tastschritte mittel: " & Math.Round((Tastschritte_gesamt / Iterationen), 2).ToString()) + Log.AddMessage(Log.levels.info, "Tastschritte gesamt: " & Tastschritte_gesamt.ToString()) + Log.AddMessage(Log.levels.info, "Tastschritte aktuell: " & Tastschritte_aktuell.ToString()) + Log.AddMessage(Log.levels.info, "Tastschritte mittel: " & Math.Round((Tastschritte_gesamt / Iterationen), 2).ToString()) 'Extrapolationsschritt If (QNBest(0) < QBest(0)) Then @@ -276,14 +276,14 @@ Public Class HJController serie = Me.myHauptDiagramm.getSeriesPoint("Hooke and Jeeves Best", "Green") Call serie.Add(durchlauf, ind.PrimObjectives(0), durchlauf.ToString()) - Call System.Windows.Forms.Application.DoEvents() + Call Windows.Forms.Application.DoEvents() Call QNBest.CopyTo(QBest, 0) Call HookJeeves.Extrapolationsschritt() Extrapolationsschritte += 1 'Monitor - Common.Log.AddMessage(Common.Log.levels.info, "Extrapolationsschritte: " & Extrapolationsschritte.ToString()) + Log.AddMessage(Log.levels.info, "Extrapolationsschritte: " & Extrapolationsschritte.ToString()) k += 1 aktuellePara = HookJeeves.getLetzteParameter @@ -293,7 +293,7 @@ Public Class HJController Rueckschritte += 1 'Monitor - Common.Log.AddMessage(Common.Log.levels.info, "Rückschritte: " & Rueckschritte.ToString()) + Log.AddMessage(Log.levels.info, "Rückschritte: " & Rueckschritte.ToString()) k += -1 HookJeeves.Schrittweitenhalbierung() @@ -313,7 +313,7 @@ Public Class HJController HookJeeves.Rueckschritt() 'Monitor - Common.Log.AddMessage(Common.Log.levels.info, "Rückschritte: " & Rueckschritte.ToString()) + Log.AddMessage(Log.levels.info, "Rückschritte: " & Rueckschritte.ToString()) HookJeeves.Schrittweitenhalbierung() aktuellePara = HookJeeves.getLetzteParameter() diff --git a/BlueM.Opt/Algos/HookeAndJeeves/HookeAndJeeves.vb b/BlueM.Opt/Algos/HookeAndJeeves/HookeAndJeeves.vb index b98dddfd..177dbc29 100644 --- a/BlueM.Opt/Algos/HookeAndJeeves/HookeAndJeeves.vb +++ b/BlueM.Opt/Algos/HookeAndJeeves/HookeAndJeeves.vb @@ -15,6 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports BlueM.Opt.Common + Public Class HookeAndJeeves 'Settings Private intAnzahlParameter As Integer @@ -31,8 +33,8 @@ Public Class HookeAndJeeves Public Enum TastschrittRichtung As Integer - Vorwärts = 1 - Rückwärts = -1 + Vorwärts = 1 + Rückwärts = -1 End Enum 'Schnittstellen @@ -93,12 +95,12 @@ Public Class HookeAndJeeves ReDim dblExtrapolationsschritt(Anzahlparameter - 1) End Sub - Public Sub Initialize(ByVal OptParameter() As BlueM.Opt.Common.OptParameter) + Public Sub Initialize(ByVal OptParameter() As OptParameter) Dim i As Integer - 'Prüfung + 'Prüfung If OptParameter.GetUpperBound(0) <> intAnzahlParameter - 1 Then - Throw New Exception("Die Anzahl der übergebenen Parameter ist nicht gleich der definierten Anzahl!") + Throw New Exception("Die Anzahl der übergebenen Parameter ist nicht gleich der definierten Anzahl!") End If 'Dynamisches Array wird mit Werten belegt (Vektor der zu optimierenden Parameter) For i = 0 To intAnzahlParameter - 1 @@ -110,7 +112,7 @@ Public Class HookeAndJeeves dblStartparameter.CopyTo(dblLetzteParameter, 0) dblStartparameter.CopyTo(dblLetzteParameterBackup, 0) dblStartparameter.CopyTo(dblAktuelleParameter, 0) - 'Startschrittweite wird übergeben + 'Startschrittweite wird übergeben dblAktuelleSchrittweite = dblStartSchrittweite End Sub @@ -121,39 +123,39 @@ Public Class HookeAndJeeves Public Function Tastschritt(ByVal parameter As Integer, ByVal Richtung As TastschrittRichtung) As Double() - 'Prüfung + 'Prüfung If parameter < 0 Then - Throw New Exception("Der Index des aufgerufenen Parameters für einen Tastschritt muss >= 0 sein!") + Throw New Exception("Der Index des aufgerufenen Parameters für einen Tastschritt muss >= 0 sein!") ElseIf parameter > intAnzahlParameter - 1 Then - Throw New Exception("Der Index des aufgerufenen Parameters für einen Tastschritt ist größer als die Anzahl der definierten Parameter!") + Throw New Exception("Der Index des aufgerufenen Parameters für einen Tastschritt ist größer als die Anzahl der definierten Parameter!") End If 'Tastschritt dblAktuelleParameter(parameter) = dblLetzteParameter(parameter) + dblAktuelleSchrittweite * Richtung If dblAktuelleParameter(parameter) > 1 Or dblAktuelleParameter(parameter) < 0 Then dblAktuelleParameter(parameter) = dblLetzteParameter(parameter) End If - 'Rückgabe des aktuelle Parametervektors + 'Rückgabe des aktuelle Parametervektors Return dblAktuelleParameter End Function Public Function TastschrittResetParameter(ByVal parameter As Integer) As Double() - 'Reset des Übergebenen Parameters + 'Reset des Übergebenen Parameters dblAktuelleParameter(parameter) = dblLetzteParameter(parameter) - 'Rückgabe des aktuelle Parametervektors + 'Rückgabe des aktuelle Parametervektors Return dblAktuelleParameter End Function Public Sub Extrapolationsschritt() Dim i As Integer - 'Bestimmen und Durchführen des Extrapolationsschrittes + 'Bestimmen und Durchführen des Extrapolationsschrittes For i = 0 To intAnzahlParameter - 1 'Bestimmen des Schrittes dblExtrapolationsschritt(i) = Math.Round((dblAktuelleParameter(i) - dblLetzteParameterBackup(i)), 7) - 'Durchführen des Extrapolationsschrittes + 'Durchführen des Extrapolationsschrittes dblLetzteParameter(i) = dblAktuelleParameter(i) + dblExtrapolationsschritt(i) Next - 'Backup des letzten Schrittes, falls Rückschritt erforderlich + 'Backup des letzten Schrittes, falls Rückschritt erforderlich dblAktuelleParameter.CopyTo(dblLetzteParameterBackup, 0) dblLetzteParameter.CopyTo(dblAktuelleParameter, 0) End Sub diff --git a/BlueM.Opt/Algos/IController/IController.vb b/BlueM.Opt/Algos/IController/IController.vb index 261d6c0c..e7868391 100644 --- a/BlueM.Opt/Algos/IController/IController.vb +++ b/BlueM.Opt/Algos/IController/IController.vb @@ -15,6 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports BlueM.Opt.Common + ''' ''' Interface für Algorithmus-Controller ''' @@ -32,22 +34,22 @@ Public Interface IController ''' die Einstellungen ''' der Verlauf ''' das Hauptdiagramm - Sub Init(ByRef inputProblem As BlueM.Opt.Common.Problem, _ - ByRef inputSettings As BlueM.Opt.Common.Settings, _ - ByRef inputProgress As BlueM.Opt.Common.Progress, _ - ByRef inputHptDiagramm As BlueM.Opt.Diagramm.Hauptdiagramm) + Sub Init(ByRef inputProblem As Problem, + ByRef inputSettings As Settings, + ByRef inputProgress As Progress, + ByRef inputHptDiagramm As Diagramm.Hauptdiagramm) ''' ''' Initialisiert den Controller für Sim-Anwendungen ''' ''' die Simulationsanwendung - Sub InitApp(ByRef inputSim As BlueM.Opt.Apps.Sim) + Sub InitApp(ByRef inputSim As Apps.Sim) ''' ''' Initialisiert den Controller für Testprobleme ''' ''' das Testproblem - Sub InitApp(ByRef inputTestprobleme As BlueM.Opt.Apps.Testprobleme) + Sub InitApp(ByRef inputTestprobleme As Apps.Testprobleme) ''' ''' Optimierung starten diff --git a/BlueM.Opt/Algos/SensiPlot/ParameterSampler.vb b/BlueM.Opt/Algos/SensiPlot/ParameterSampler.vb index a18ada08..92861e2a 100644 --- a/BlueM.Opt/Algos/SensiPlot/ParameterSampler.vb +++ b/BlueM.Opt/Algos/SensiPlot/ParameterSampler.vb @@ -1,4 +1,4 @@ -'BlueM.Opt +'BlueM.Opt 'Copyright (C) BlueM Dev Group 'Website: ' @@ -15,6 +15,7 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports BlueM.Opt.Common ''' ''' Class for sampling the parameter space using different methods @@ -28,14 +29,14 @@ Public Class ParameterSampler ''' number of steps ''' sampling method ''' list of parameter combinations - Public Function Sample(NumParams As Integer, NumSteps As Integer, method As Common.Settings_Sensiplot.SensiType) As List(Of Double()) + Public Function Sample(NumParams As Integer, NumSteps As Integer, method As Settings_Sensiplot.SensiType) As List(Of Double()) Dim random As New Random() Dim parameterCombinations As New List(Of Double()) Select Case method - Case Common.Settings_Sensiplot.SensiType.randomDistribution + Case Settings_Sensiplot.SensiType.randomDistribution ' no. of combinations: NumSteps For n = 0 To NumSteps - 1 @@ -47,7 +48,7 @@ Public Class ParameterSampler parameterCombinations.Add(parameterCombination) Next - Case Common.Settings_Sensiplot.SensiType.evenDistribution + Case Settings_Sensiplot.SensiType.evenDistribution ' no. of combinations: NumSteps ^ NumParams Dim totalCombinations As Integer = NumSteps ^ NumParams @@ -61,7 +62,7 @@ Public Class ParameterSampler parameterCombinations.Add(parameterCombination) Next - Case Common.Settings_Sensiplot.SensiType.latinHypercube + Case Settings_Sensiplot.SensiType.latinHypercube ' no. of combinations: NumSteps Dim lhsMatrix(NumSteps - 1)() As Double diff --git a/BlueM.Opt/Algos/SensiPlot/SensiPlotController.vb b/BlueM.Opt/Algos/SensiPlot/SensiPlotController.vb index b4339ea6..9b4b5fbd 100644 --- a/BlueM.Opt/Algos/SensiPlot/SensiPlotController.vb +++ b/BlueM.Opt/Algos/SensiPlot/SensiPlotController.vb @@ -15,10 +15,10 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports BlueM.Opt.Common.Constants +Imports BlueM.Opt.Common Public Class SensiPlotController - Implements BlueM.Opt.Algos.IController + Implements Algos.IController ''' ''' Multithreading Support @@ -29,17 +29,17 @@ Public Class SensiPlotController End Get End Property - Private myProblem As BlueM.Opt.Common.Problem - Private mySettings As BlueM.Opt.Common.Settings - Private myProgress As BlueM.Opt.Common.Progress - Private myHauptDiagramm As BlueM.Opt.Diagramm.Hauptdiagramm + Private myProblem As Problem + Private mySettings As Settings + Private myProgress As Progress + Private myHauptDiagramm As Diagramm.Hauptdiagramm - Private myAppType As BlueM.Opt.Common.ApplicationTypes - Private WithEvents Sim1 As BlueM.Opt.Apps.Sim + Private myAppType As ApplicationTypes + Private WithEvents Sim1 As Apps.Sim Private stopped As Boolean - Public Sub Init(ByRef inputProblem As Common.Problem, ByRef inputSettings As Common.Settings, ByRef inputProgress As Common.Progress, ByRef inputHptDiagramm As Diagramm.Hauptdiagramm) Implements IController.Init + Public Sub Init(ByRef inputProblem As Problem, ByRef inputSettings As Settings, ByRef inputProgress As Progress, ByRef inputHptDiagramm As Diagramm.Hauptdiagramm) Implements IController.Init Me.myProblem = inputProblem Me.mySettings = inputSettings Me.myProgress = inputProgress @@ -66,7 +66,7 @@ Public Class SensiPlotController Dim i, n, NumParams, NumSteps As Integer Dim x, y, z As Double Dim isOK As Boolean - Dim ind As Common.Individuum + Dim ind As Individuum Dim serie As Steema.TeeChart.Styles.Points Dim serie3D As New Steema.TeeChart.Styles.Points3D Dim surface As New Steema.TeeChart.Styles.Surface @@ -109,7 +109,7 @@ Public Class SensiPlotController surface.Brush.Transparency = 70 surface.Pen.Visible = False surface.Title = "SensiPlot" - surface.Cursor = System.Windows.Forms.Cursors.Hand + surface.Cursor = Windows.Forms.Cursors.Hand End If End If @@ -129,7 +129,7 @@ Public Class SensiPlotController If (Me.stopped) Then Exit Sub n = i + 1 - Common.Log.AddMessage(Common.Log.levels.info, $"Sensiplot simulation {n}:") + Log.AddMessage(Log.levels.info, $"Sensiplot simulation {n}:") Dim parameterCombination As Double() = parameterCombinations(i) @@ -137,7 +137,7 @@ Public Class SensiPlotController For j = 0 To NumParams - 1 With Me.myProblem.List_OptParameter(Me.mySettings.SensiPlot.Selected_OptParameters(j)) .Xn = parameterCombination(j) - Common.Log.AddMessage(Common.Log.levels.info, $"* OptParameter { .Bezeichnung}: {Convert.ToString(.RWert, Common.Provider.FortranProvider)}") + Log.AddMessage(Log.levels.info, $"* OptParameter { .Bezeichnung}: {Convert.ToString(.RWert, Provider.FortranProvider)}") End With Next @@ -166,19 +166,19 @@ Public Class SensiPlotController If Not relationshipSatisfied Then allRelationshipsSatisfied = False - Common.Log.AddMessage(Common.Log.levels.warning, $"Relationship for optimization parameter {Me.myProblem.List_OptParameter(j).Bezeichnung} is not satisfied!") + Log.AddMessage(Log.levels.warning, $"Relationship for optimization parameter {Me.myProblem.List_OptParameter(j).Bezeichnung} is not satisfied!") End If End If Next If Not allRelationshipsSatisfied Then 'Skip evaluation - Common.Log.AddMessage(Common.Log.levels.warning, $"Skipping evaluation of parameter combination {n} because of parameter relationship violations!") + Log.AddMessage(Log.levels.warning, $"Skipping evaluation of parameter combination {n} because of parameter relationship violations!") Else 'Evaluate parameter combination 'Individuum instanzieren - ind = New Common.Individuum_PES("SensiPlot", n) + ind = New Individuum_PES("SensiPlot", n) 'OptParameter ins Individuum kopieren ind.OptParameter = Me.myProblem.List_OptParameter @@ -235,7 +235,7 @@ Public Class SensiPlotController End If - System.Windows.Forms.Application.DoEvents() + Windows.Forms.Application.DoEvents() Next diff --git a/BlueM.Opt/Algos/TSP/TSP.vb b/BlueM.Opt/Algos/TSP/TSP.vb index d3cfd925..b788cde9 100644 --- a/BlueM.Opt/Algos/TSP/TSP.vb +++ b/BlueM.Opt/Algos/TSP/TSP.vb @@ -15,7 +15,7 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.IO +Imports BlueM.Opt.Common ''' ''' Traveling Salesman Problem @@ -31,7 +31,7 @@ Public Class TSP 'PNG Export exportiert alle 100 Generationen png Bilder Public pngExport As Boolean = True - 'Standardmäig unter den bin Verzeichnis + 'Standardmäig unter den bin Verzeichnis Public ExPath As String 'Batch_Mode @@ -46,7 +46,7 @@ Public Class TSP End Enum 'Settings - Private mySettings As Common.Settings_TSP + Private mySettings As Settings_TSP Public ListOfCities(,) As Object @@ -69,7 +69,7 @@ Public Class TSP '******************************** Initialisierung ************************************* - Public Sub TSP_Initialize(ByRef mySettingsInput As Common.Settings_TSP) + Public Sub TSP_Initialize(ByRef mySettingsInput As Settings_TSP) mySettings = mySettingsInput @@ -82,7 +82,7 @@ Public Class TSP Select Case mySettings.Problem - Case Common.EnProblem.circle + Case EnProblem.circle Dim Radius As Integer = 45 Dim factor As Double = (Math.PI * 2) / mySettings.N_Cities For i = 0 To mySettings.N_Cities - 1 @@ -92,7 +92,7 @@ Public Class TSP Next circumference = 2 * Math.PI * Radius - Case Common.EnProblem.random + Case EnProblem.random Dim lowerb As Integer = 2 Dim upperb1 As Integer = 98 Dim upperb2 As Integer = 128 @@ -104,8 +104,8 @@ Public Class TSP End Select If pngExport = True Then - Directory.CreateDirectory(IO.Path.Combine(Directory.GetCurrentDirectory, "TSP_Export")) - ExPath = IO.Path.Combine(Directory.GetCurrentDirectory, "TSP_Export") + IO.Directory.CreateDirectory(IO.Path.Combine(IO.Directory.GetCurrentDirectory, "TSP_Export")) + ExPath = IO.Path.Combine(IO.Directory.GetCurrentDirectory, "TSP_Export") End If End Sub @@ -141,7 +141,7 @@ Public Class TSP End Sub - 'Generiert zufällige Paths für alle Kinder + 'Generiert zufällige Paths für alle Kinder Public Sub Generate_Random_Path_TSP() Dim i, j As Integer Dim tmp As Integer @@ -163,7 +163,7 @@ Public Class TSP '************************ Functionen innerhalb der Generationsschleife **************************** - 'Weist den KinderPfaden die Städte zu + 'Weist den KinderPfaden die Städte zu Public Sub Cities_according_ChildPath() Dim i, j As Integer @@ -178,7 +178,7 @@ Public Class TSP End Sub - 'Ermittelt die Qualität bzw. die Länge des Weges Für TSP + 'Ermittelt die Qualität bzw. die Länge des Weges Für TSP Public Sub Evaluate_child_Quality() Dim i, j As Integer Dim distance As Double @@ -211,14 +211,14 @@ Public Class TSP Public Sub Selection_Process() Dim i, j As Integer - If mySettings.Strategy = Common.EVO_STRATEGY.Comma_Strategy Then + If mySettings.Strategy = Constants.EVO_STRATEGY.Comma_Strategy Then For i = 0 To mySettings.N_Parents - 1 ParentList(i).Penalty = ChildrenList(i).Penalty Array.Copy(ChildrenList(i).Image, ParentList(i).Image, ChildrenList(i).Image.Length) Array.Copy(ChildrenList(i).Path, ParentList(i).Path, ChildrenList(i).Path.Length) Next i - ElseIf mySettings.Strategy = Common.EVO_STRATEGY.Plus_Strategy Then + ElseIf mySettings.Strategy = Constants.EVO_STRATEGY.Plus_Strategy Then j = 0 For i = 0 To mySettings.N_Parents - 1 If ParentList(i).Penalty < ChildrenList(j).Penalty Then @@ -234,7 +234,7 @@ Public Class TSP End Sub - 'Kinder werden zur Sicherheit gelöscht aber nicht zerstört ;-) + 'Kinder werden zur Sicherheit gelöscht aber nicht zerstört ;-) Public Sub Reset_Children() Dim i As Integer @@ -256,8 +256,8 @@ Public Class TSP Dim Einzelkind(mySettings.N_Cities - 1) As Integer Select Case mySettings.ReprodOperator - 'UPGRADE: Eltern werden nicht zufällig gewählt sondern immer in Top Down Reihenfolge - Case Common.EnReprodOperator.Order_Crossover_OX + 'UPGRADE: Eltern werden nicht zufällig gewählt sondern immer in Top Down Reihenfolge + Case Constants.EnReprodOperator.Order_Crossover_OX x = 0 y = 1 For i = 0 To mySettings.N_Children - 2 Step 2 @@ -271,7 +271,7 @@ Public Class TSP Call ReprodOp_OX(ParentList(x).Path, ParentList(y).Path, ChildrenList(mySettings.N_Children - 1).Path, Einzelkind) End If - Case Common.EnReprodOperator.Partially_Mapped_Crossover_PMX + Case Constants.EnReprodOperator.Partially_Mapped_Crossover_PMX x = 0 y = 1 For i = 0 To mySettings.N_Children - 2 Step 2 @@ -289,8 +289,8 @@ Public Class TSP End Sub 'Reproductionsoperator "Order_Crossover (OX)" - 'Kopiert den mittleren Teil des einen Elter und füllt den Rest aus der Reihenfolge des anderen Elter auf - 'UPGRADE: Es wird immer nur der mittlere Teil Kopiert, könnte auch mal ein einderer sein + 'Kopiert den mittleren Teil des einen Elter und füllt den Rest aus der Reihenfolge des anderen Elter auf + 'UPGRADE: Es wird immer nur der mittlere Teil Kopiert, könnte auch mal ein einderer sein Private Sub ReprodOp_OX(ByVal ParPath_A() As Integer, ByVal ParPath_B() As Integer, ByRef ChildPath_A() As Integer, ByRef ChildPath_B() As Integer) Dim i As Integer @@ -304,7 +304,7 @@ Public Class TSP ChildPath_A(i) = ParPath_A(i) ChildPath_B(i) = ParPath_B(i) Next - 'Auffüllen des Paths Teil 3 des Child A mit dem anderen Elter beginnend bei 0 + 'Auffüllen des Paths Teil 3 des Child A mit dem anderen Elter beginnend bei 0 x = 0 For i = CutPoint(1) + 1 To mySettings.N_Cities - 1 If Is_No_OK(ParPath_B(x), ChildPath_A) Then @@ -314,7 +314,7 @@ Public Class TSP End If x += 1 Next - 'Auffüllen des Paths Teil 3 des Child B mit dem anderen Elter beginnend bei 0 + 'Auffüllen des Paths Teil 3 des Child B mit dem anderen Elter beginnend bei 0 y = 0 For i = CutPoint(1) + 1 To mySettings.N_Cities - 1 If Is_No_OK(ParPath_A(y), ChildPath_B) Then @@ -324,7 +324,7 @@ Public Class TSP End If y += 1 Next - 'Auffüllen des Paths Teil 1 des Child A mit dem anderen Elter beginnend bei 0 + 'Auffüllen des Paths Teil 1 des Child A mit dem anderen Elter beginnend bei 0 For i = 0 To CutPoint(0) If Is_No_OK(ParPath_B(x), ChildPath_A) Then ChildPath_A(i) = ParPath_B(x) @@ -333,7 +333,7 @@ Public Class TSP End If x += 1 Next - 'Auffüllen des Paths Teil 1 des Child B mit dem anderen Elter beginnend bei 0 + 'Auffüllen des Paths Teil 1 des Child B mit dem anderen Elter beginnend bei 0 For i = 0 To CutPoint(0) If Is_No_OK(ParPath_A(y), ChildPath_B) Then ChildPath_B(i) = ParPath_A(y) @@ -345,7 +345,7 @@ Public Class TSP End Sub 'Reproductionsoperator: "Partially_Mapped_Crossover_(PMX)" - 'Kopiert den mittleren Teil des anderen Elter und füllt den Rest mit dem eigenen auf. Falls Doppelt wird gemaped. + 'Kopiert den mittleren Teil des anderen Elter und füllt den Rest mit dem eigenen auf. Falls Doppelt wird gemaped. Public Sub ReprodOp_PMX(ByVal ParPath_A() As Integer, ByVal ParPath_B() As Integer, ByRef ChildPath_A() As Integer, ByRef ChildPath_B() As Integer) Dim i As Integer Dim x As Integer @@ -357,7 +357,7 @@ Public Class TSP Call Create_n_Cutpoints(CutPoint) Next - 'Kopieren des mittleren Paths und füllen des Mappers + 'Kopieren des mittleren Paths und füllen des Mappers x = 0 For i = CutPoint(0) + 1 To CutPoint(1) ChildPath_B(i) = ParPath_A(i) @@ -365,9 +365,9 @@ Public Class TSP x += 1 Next - 'Auffüllen des Paths Teil 1 des Child A und B mit dem anderen Elter beginnend bei 0 + 'Auffüllen des Paths Teil 1 des Child A und B mit dem anderen Elter beginnend bei 0 For i = 0 To CutPoint(0) - 'für Child A + 'für Child A If Is_No_OK(ParPath_A(i), ChildPath_A) Then ChildPath_A(i) = ParPath_A(i) Else @@ -379,7 +379,7 @@ Public Class TSP ChildPath_A(i) = mapper End If - 'für Child B + 'für Child B If Is_No_OK(ParPath_B(i), ChildPath_B) Then ChildPath_B(i) = ParPath_B(i) Else @@ -392,9 +392,9 @@ Public Class TSP End If Next i - 'Auffüllen des Paths Teil 3 des Child A und B mit dem anderen Elter beginnend bei 0 + 'Auffüllen des Paths Teil 3 des Child A und B mit dem anderen Elter beginnend bei 0 For i = CutPoint(1) + 1 To mySettings.N_Cities - 1 - 'für Child A + 'für Child A If Is_No_OK(ParPath_A(i), ChildPath_A) Then ChildPath_A(i) = ParPath_A(i) Else @@ -406,7 +406,7 @@ Public Class TSP ChildPath_A(i) = mapper End If - 'für Child B + 'für Child B If Is_No_OK(ParPath_B(i), ChildPath_B) Then ChildPath_B(i) = ParPath_B(i) Else @@ -427,23 +427,23 @@ Public Class TSP Dim i As Integer Select Case mySettings.MutOperator - Case Common.EnMutOperator.Inversion_SIM + Case Constants.EnMutOperator.Inversion_SIM For i = 0 To mySettings.N_Children - 1 Call MutOp_SIM(ChildrenList(i).Path) 'If PathValid(ChildList(i).Path) = False Then Throw New Exception("Fehler im Path") Next i - Case Common.EnMutOperator.Translocation_3_Opt + Case Constants.EnMutOperator.Translocation_3_Opt For i = 0 To mySettings.N_Children - 1 Call MutOp_3_opt(ChildrenList(i).Path) 'If PathValid(ChildList(i).Path) = False Then Throw New Exception("Fehler im Path") Next i - Case Common.EnMutOperator.Translocation_n_Opt + Case Constants.EnMutOperator.Translocation_n_Opt For i = 0 To mySettings.N_Children - 1 Call MutOp_n_opt(ChildrenList(i).Path) 'If PathValid(ChildList(i).Path) = False Then Throw New Exception("Fehler im Path") Next i - Case Common.EnMutOperator.Exchange_Mutation_EM + Case Constants.EnMutOperator.Exchange_Mutation_EM For i = 0 To mySettings.N_Children - 1 Call MutOp_EM(ChildrenList(i).Path) Next @@ -452,7 +452,7 @@ Public Class TSP End Sub 'Mutationsoperator "Inversion (SIM)" - 'Schneidet ein Segment aus dem Path heraus und fügt es invers wieder ein + 'Schneidet ein Segment aus dem Path heraus und fügt es invers wieder ein 'UPGRADE: Wird bis jetzt nur auf den mittleren Teil angewendet Private Sub MutOp_SIM(ByVal Path() As Integer) Dim i As Integer @@ -470,7 +470,7 @@ Public Class TSP x += 1 Next - 'Invertiertes einfügen + 'Invertiertes einfügen For i = CutPoint(0) + 1 To CutPoint(1) x -= 1 Path(i) = SubPath(x) @@ -479,8 +479,8 @@ Public Class TSP End Sub 'Mutationsoperator "Translocation (3-Opt" - 'Vertauscht zufällig 3 Abschnitte aus dem String und verwendet Bernoulli verteilt die Inverse - 'UPGRADE: Jetzt werden immer 3 Translocation durchgeführt könnte man auf n-Ausbauen + 'Vertauscht zufällig 3 Abschnitte aus dem String und verwendet Bernoulli verteilt die Inverse + 'UPGRADE: Jetzt werden immer 3 Translocation durchgeführt könnte man auf n-Ausbauen Private Sub MutOp_3_opt(ByVal Path() As Integer) Dim i, j As Integer Dim x As Integer @@ -529,7 +529,7 @@ Public Class TSP SwapPath(i) -= 1 Next - 'Übertragen der Substrings in den Path + 'Übertragen der Substrings in den Path x = 0 For i = 0 To 2 For j = 0 To SubPath(SwapPath(i)).GetUpperBound(0) @@ -540,7 +540,7 @@ Public Class TSP End Sub 'Mutationsoperator "Translocation (n-Opt)" - 'Vertauscht zufällig n Abschnitte aus dem String und verwendet Bernoulli verteilt die Inverse + 'Vertauscht zufällig n Abschnitte aus dem String und verwendet Bernoulli verteilt die Inverse Private Sub MutOp_n_opt(ByVal Path() As Integer) Dim i, j As Integer Dim x As Integer @@ -593,7 +593,7 @@ Public Class TSP SwapPath(i) -= 1 Next - 'Übertragen der Substrings in den Path + 'Übertragen der Substrings in den Path x = 0 For i = 0 To n_SP - 1 For j = 0 To SubPath(SwapPath(i)).GetUpperBound(0) @@ -634,18 +634,18 @@ Public Class TSP 'Hilfsfunktion: Validierung der Paths 'UPGRADE:Option zum ein und Ausschalten dieser Function - Public Function PathValid(ByVal Path() As Integer) As Boolean + Public Function PathValid(ByVal path() As Integer) As Boolean Dim i As Integer - Array.Sort(Path) - For i = 0 To Path.GetUpperBound(0) - If Path(i) <> i + 1 Then + Array.Sort(path) + For i = 0 To path.GetUpperBound(0) + If path(i) <> i + 1 Then Exit Function End If Next PathValid = True End Function - 'Hilfsfunktion um zu Prüfen ob eine Zahl bereits in einem Array vorhanden ist oder nicht + 'Hilfsfunktion um zu Prüfen ob eine Zahl bereits in einem Array vorhanden ist oder nicht Public Function Is_No_OK(ByRef No As Integer, ByRef Path() As Integer) As Boolean Is_No_OK = True @@ -683,7 +683,7 @@ Public Class TSP End Sub - 'Hilfsfunktion zum generieren von zufälligen Schnittpunkten innerhalb eines Pfades + 'Hilfsfunktion zum generieren von zufälligen Schnittpunkten innerhalb eines Pfades Public Sub Create_n_Cutpoints(ByRef CutPoint() As Integer) Dim i As Integer diff --git a/BlueM.Opt/Algos/TSP/TSPController.vb b/BlueM.Opt/Algos/TSP/TSPController.vb index 211365f4..bb59be06 100644 --- a/BlueM.Opt/Algos/TSP/TSPController.vb +++ b/BlueM.Opt/Algos/TSP/TSPController.vb @@ -15,8 +15,11 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports System.Drawing +Imports BlueM.Opt.Common + Public Class TSPController - Implements BlueM.Opt.Algos.IController + Implements Algos.IController ''' ''' Multithreading Support @@ -27,10 +30,10 @@ Public Class TSPController End Get End Property - Private myHauptDiagramm As BlueM.Opt.Diagramm.Hauptdiagramm - Private myProblem As BlueM.Opt.Common.Problem - Private mySettings As BlueM.Opt.Common.Settings - Private myProgress As BlueM.Opt.Common.Progress + Private myHauptDiagramm As Diagramm.Hauptdiagramm + Private myProblem As Problem + Private mySettings As Settings + Private myProgress As Progress Private TSP1 As TSP Private Stopp As Boolean @@ -43,7 +46,7 @@ Public Class TSPController ''' ''' ''' - Public Sub Init(ByRef inputProblem As Common.Problem, ByRef inputSettings As Common.Settings, ByRef inputProgress As Common.Progress, ByRef inputHptDiagramm As Diagramm.Hauptdiagramm) Implements IController.Init + Public Sub Init(ByRef inputProblem As Problem, ByRef inputSettings As Settings, ByRef inputProgress As Progress, ByRef inputHptDiagramm As Diagramm.Hauptdiagramm) Implements IController.Init Me.myProblem = inputProblem Me.mySettings = inputSettings Me.myProgress = inputProgress @@ -81,14 +84,14 @@ Public Class TSPController Me.myProgress.Initialize(0, 0, Me.mySettings.TSP.N_Gen, Me.mySettings.TSP.N_Children) 'Log - Common.Log.AddMessage(Common.Log.levels.info, "Cities: " & Me.mySettings.TSP.N_Cities) - Common.Log.AddMessage(Common.Log.levels.info, "Combinations: " & TSP1.n_Comb(Me.mySettings.TSP.N_Cities)) - Common.Log.AddMessage(Common.Log.levels.info, "Parents: " & Me.mySettings.TSP.N_Parents) - Common.Log.AddMessage(Common.Log.levels.info, "Children: " & Me.mySettings.TSP.N_Children) - Common.Log.AddMessage(Common.Log.levels.info, "Generations: " & Me.mySettings.TSP.N_Gen) - Common.Log.AddMessage(Common.Log.levels.info, "Evaluations: " & Me.mySettings.TSP.N_Children * Me.mySettings.TSP.N_Gen) - If Me.mySettings.TSP.Problem = Common.EnProblem.circle Then - Common.Log.AddMessage(Common.Log.levels.info, "Quality Aim: " & Conversion.Int(TSP1.circumference)) + Log.AddMessage(Log.levels.info, "Cities: " & Me.mySettings.TSP.N_Cities) + Log.AddMessage(Log.levels.info, "Combinations: " & TSP1.n_Comb(Me.mySettings.TSP.N_Cities)) + Log.AddMessage(Log.levels.info, "Parents: " & Me.mySettings.TSP.N_Parents) + Log.AddMessage(Log.levels.info, "Children: " & Me.mySettings.TSP.N_Children) + Log.AddMessage(Log.levels.info, "Generations: " & Me.mySettings.TSP.N_Gen) + Log.AddMessage(Log.levels.info, "Evaluations: " & Me.mySettings.TSP.N_Children * Me.mySettings.TSP.N_Gen) + If Me.mySettings.TSP.Problem = Constants.EnProblem.circle Then + Log.AddMessage(Log.levels.info, "Quality Aim: " & Conversion.Int(TSP1.circumference)) End If Select Case TSP1.Mode @@ -108,7 +111,7 @@ Public Class TSPController For M = 1 To 4 Me.mySettings.TSP.MutOperator = M - Common.Log.AddMessage(Common.Log.levels.info, $"ReprodOperator: {Me.mySettings.TSP.ReprodOperator}; MutationOperator: {Me.mySettings.TSP.MutOperator}") + Log.AddMessage(Log.levels.info, $"ReprodOperator: {Me.mySettings.TSP.ReprodOperator}; MutationOperator: {Me.mySettings.TSP.MutOperator}") 'n Wiederholungen For i = 1 To TSP1.nTests @@ -134,8 +137,8 @@ Public Class TSPController Next Time.Stop() - Common.Log.AddMessage(Common.Log.levels.info, $"Number of calculations: {j}") - Common.Log.AddMessage(Common.Log.levels.info, $"Time elapsed: {Time.Elapsed.Hours}h {Time.Elapsed.Minutes}m {Time.Elapsed.Seconds}s {Time.Elapsed.Milliseconds}ms") + Log.AddMessage(Log.levels.info, $"Number of calculations: {j}") + Log.AddMessage(Log.levels.info, $"Time elapsed: {Time.Elapsed.Hours}h {Time.Elapsed.Minutes}m {Time.Elapsed.Seconds}s {Time.Elapsed.Milliseconds}ms") End Select End Sub @@ -201,7 +204,7 @@ Public Class TSPController jepp += increm Me.myProgress.iGen() = gen If Batch_Mode = False Then - Common.Log.AddMessage(Common.Log.levels.info, $"Gen.: {gen}; Length: {Conversion.Int(TSP1.ParentList(0).Penalty)}; Factor: {Math.Round(TSP1.ParentList(0).Penalty / TSP1.circumference, 3, MidpointRounding.ToEven)}") + Log.AddMessage(Log.levels.info, $"Gen.: {gen}; Length: {Conversion.Int(TSP1.ParentList(0).Penalty)}; Factor: {Math.Round(TSP1.ParentList(0).Penalty / TSP1.circumference, 3, MidpointRounding.ToEven)}") 'png Export If TSP1.pngExport = True And Conversion.Int(TSP1.ParentList(0).Penalty) < PenaltyTMP Then Me.myHauptDiagramm.Export.Image.PNG.Save(TSP1.ExPath & gen.ToString.PadLeft(7, "0") & " Qualität " & Conversion.Int(TSP1.ParentList(0).Penalty).ToString.PadLeft(5, "0") & ".png") @@ -211,7 +214,7 @@ Public Class TSPController End If 'Fall die Problemstellung ein Kreis ist wird abgebrochen, wenn das Optimum erreicht ist - If Me.mySettings.TSP.Problem = Common.EnProblem.circle And TSP1.ParentList(0).Penalty < TSP1.circumference Then + If Me.mySettings.TSP.Problem = Constants.EnProblem.circle And TSP1.ParentList(0).Penalty < TSP1.circumference Then GoToExit = True Select Case TSP1.ParentList(0).Path(0) < TSP1.ParentList(0).Path(1) Case True @@ -236,7 +239,7 @@ Public Class TSPController If Batch_Mode = False Then Call Zeichnen_TSP(TSP1.ParentList(0).Image) Me.myHauptDiagramm.Update() - Common.Log.AddMessage(Common.Log.levels.info, $"Gen.: {gen}; Length: {Conversion.Int(TSP1.ParentList(0).Penalty)}; Factor: {Math.Round(TSP1.ParentList(0).Penalty / TSP1.circumference, 3, MidpointRounding.ToEven)}") + Log.AddMessage(Log.levels.info, $"Gen.: {gen}; Length: {Conversion.Int(TSP1.ParentList(0).Penalty)}; Factor: {Math.Round(TSP1.ParentList(0).Penalty / TSP1.circumference, 3, MidpointRounding.ToEven)}") 'png Export If TSP1.pngExport = True Then Me.myHauptDiagramm.Export.Image.PNG.Save(TSP1.ExPath & gen.ToString.PadLeft(7, "0") & " Qualität " & Conversion.Int(TSP1.ParentList(0).Penalty).ToString.PadLeft(5, "0") & ".png") @@ -256,7 +259,7 @@ Public Class TSPController Next gen - Common.Log.AddMessage(Common.Log.levels.info, "Final Quality: " & Conversion.Int(TSP1.ParentList(0).Penalty)) + Log.AddMessage(Log.levels.info, "Final Quality: " & Conversion.Int(TSP1.ParentList(0).Penalty)) End Sub @@ -286,9 +289,9 @@ Public Class TSPController 'Printversion .Header.Visible = False - .Panel.Color = Drawing.Color.White - .Chart.Axes.Left.Ticks.Color = Drawing.Color.Black - .Chart.Axes.Right.Ticks.Color = Drawing.Color.Black + .Panel.Color = Color.White + .Chart.Axes.Left.Ticks.Color = Color.Black + .Chart.Axes.Right.Ticks.Color = Color.Black .Chart.Axes.Left.Ticks.Width = 1 .Chart.Axes.Right.Ticks.Width = 1 @@ -306,7 +309,7 @@ Public Class TSPController Dim Point1 As New Steema.TeeChart.Styles.Points(.Chart) Point1.Title = "Städte" Point1.Pointer.Style = Steema.TeeChart.Styles.PointerStyles.Circle - Point1.Color = System.Drawing.Color.Orange + Point1.Color = Color.Orange Point1.Pointer.HorizSize = 2 Point1.Pointer.VertSize = 2 @@ -315,7 +318,7 @@ Public Class TSPController Dim Line1 As New Steema.TeeChart.Styles.Line(.Chart) Line1.Title = "Reisen" Line1.Pointer.Style = Steema.TeeChart.Styles.PointerStyles.Circle - Line1.Color = System.Drawing.Color.Blue + Line1.Color = Color.Blue Line1.Pointer.HorizSize = 3 Line1.Pointer.VertSize = 3 Next @@ -344,8 +347,8 @@ Public Class TSPController .Series(1).Clear() For i = 1 To Me.mySettings.TSP.N_Cities - 1 .Series(i + 1).Clear() - .Series(i + 1).Add(TmpListOfCities(i, 1), TmpListOfCities(i, 2), Drawing.Color.Blue) - .Series(i).Add(TmpListOfCities(i, 1), TmpListOfCities(i, 2), Drawing.Color.Blue) + .Series(i + 1).Add(TmpListOfCities(i, 1), TmpListOfCities(i, 2), Color.Blue) + .Series(i).Add(TmpListOfCities(i, 1), TmpListOfCities(i, 2), Color.Blue) Next 'Zeichnen der Verbindung von der ersten bis zur letzten Stadt diff --git a/BlueM.Opt/Apps/BlueM/BlueM.vb b/BlueM.Opt/Apps/BlueM/BlueM.vb index cc35921c..50a958f6 100644 --- a/BlueM.Opt/Apps/BlueM/BlueM.vb +++ b/BlueM.Opt/Apps/BlueM/BlueM.vb @@ -15,11 +15,9 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.IO Imports System.Threading -Imports BlueM.DllAdapter -Imports BlueM Imports BlueM.Opt.Common +Imports BlueM.DllAdapter ''' ''' Klasse BlueMSim @@ -98,9 +96,9 @@ Public Class BlueMSim 'Pfad zu BlueM.DLL bestimmen '--------------------------- - dll_path = IO.Path.Combine(System.Windows.Forms.Application.StartupPath(), "BlueM\BlueM.Sim.dll") + dll_path = IO.Path.Combine(Windows.Forms.Application.StartupPath(), "BlueM\BlueM.Sim.dll") - If (Not File.Exists(dll_path)) Then + If (Not IO.File.Exists(dll_path)) Then Throw New Exception("BlueM.Sim.dll nicht gefunden!") End If @@ -132,13 +130,13 @@ Public Class BlueMSim End Sub - Public Overrides Sub setProblem(ByRef prob As BlueM.Opt.Common.Problem) + Public Overrides Sub setProblem(ByRef prob As Problem) Call MyBase.setProblem(prob) 'BlueM-spezifische Weiterverarbeitung von ZielReihen: '==================================================== - Dim objective As Common.ObjectiveFunction + Dim objective As ObjectiveFunction 'KWL: Feststellen, ob irgendeine Zielfunktion die KWL-Datei benutzt '------------------------------------------------------------------ @@ -173,8 +171,8 @@ Public Class BlueMSim '---------------- Dim Datei As String = IO.Path.Combine(Me.WorkDir_Original, Me.Datensatz & ".ALL") - Dim FiStr As New FileStream(Datei, FileMode.Open, IO.FileAccess.Read) - Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New IO.FileStream(Datei, IO.FileMode.Open, IO.FileAccess.Read) + Dim StrRead As New IO.StreamReader(FiStr, Text.Encoding.GetEncoding("iso8859-1")) 'Alle Zeilen durchlaufen Dim Zeile As String @@ -290,7 +288,7 @@ Public Class BlueMSim Catch ex As Exception 'Simulationsfehler aufgetreten - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) + Log.AddMessage(Log.levels.error, ex.Message) 'Simulation abschliessen Call bluem_dll(0).Finish() @@ -401,7 +399,7 @@ Public Class BlueMSim 'Qualitätswert aus PRB-Datei 'TODO: PRB geht nicht (#153) '*********************** - Private Function CalculateObjective_PRB(ByVal objective As Common.ObjectiveFunction) As Double + Private Function CalculateObjective_PRB(ByVal objective As ObjectiveFunction) As Double 'Dim i As Integer 'Dim IsOK As Boolean @@ -472,9 +470,9 @@ Public Class BlueMSim Dim Zeile As String Read_PRB = True - Dim FiStr As New FileStream(DateiPfad, FileMode.Open, IO.FileAccess.ReadWrite) - Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) - Dim StrReadSync As TextReader = TextReader.Synchronized(StrRead) + Dim FiStr As New IO.FileStream(DateiPfad, IO.FileMode.Open, IO.FileAccess.ReadWrite) + Dim StrRead As New IO.StreamReader(FiStr, Text.Encoding.GetEncoding("iso8859-1")) + Dim StrReadSync As IO.TextReader = IO.TextReader.Synchronized(StrRead) 'Array redimensionieren ReDim PRB(AnzZeil - 1, 1) diff --git a/BlueM.Opt/Apps/BlueM/BlueMThread.vb b/BlueM.Opt/Apps/BlueM/BlueMThread.vb index 1c6e6620..8809de92 100644 --- a/BlueM.Opt/Apps/BlueM/BlueMThread.vb +++ b/BlueM.Opt/Apps/BlueM/BlueMThread.vb @@ -18,6 +18,7 @@ 'Klasse beinhaltet alle Infomationen für einen Simulationslauf im Thread '*********************************************************************** Imports BlueM.DllAdapter +Imports BlueM.Opt.Common Public Class BlueMSimThread @@ -45,7 +46,7 @@ Public Class BlueMSimThread Me.launchReady = False 'Priority - System.Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal + Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal Try 'Datensatz übergeben und initialisieren @@ -67,7 +68,7 @@ Public Class BlueMSimThread Catch ex As Exception 'Simulationsfehler aufgetreten - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) + Log.AddMessage(Log.levels.error, ex.Message) 'Simulation abschliessen Call bluem_dll.Finish() diff --git a/BlueM.Opt/Apps/Sim.vb b/BlueM.Opt/Apps/Sim.vb index 5f50be5b..933b9ef0 100644 --- a/BlueM.Opt/Apps/Sim.vb +++ b/BlueM.Opt/Apps/Sim.vb @@ -15,12 +15,7 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.IO -Imports System.Windows.Forms -Imports System.Globalization -Imports System.Threading -Imports BlueM.Opt.Common.Constants -Imports BlueM +Imports BlueM.Opt.Common ''' ''' Klasse Sim @@ -62,14 +57,14 @@ Public MustInherit Class Sim ''' ''' The simulation result ''' - Public SimResult As BlueM.Opt.Common.ObjectiveFunction.SimResults + Public SimResult As ObjectiveFunction.SimResults 'Das Problem '----------- - Protected mProblem As BlueM.Opt.Common.Problem + Protected mProblem As Problem 'Die Einstellungen - Protected mSettings As BlueM.Opt.Common.Settings + Protected mSettings As Settings Protected Structure Aktuell Public OptPara() As Double @@ -104,7 +99,7 @@ Public MustInherit Class Sim ''' ''' das evaluierte Individuum ''' 0-basierte Nachfahren-Nummer - Public Event IndividuumEvaluated(ByRef ind As BlueM.Opt.Common.Individuum, ByVal i_Nachf As Integer) + Public Event IndividuumEvaluated(ByRef ind As Individuum, ByVal i_Nachf As Integer) #End Region @@ -189,12 +184,12 @@ Public MustInherit Class Sim ''' Der Pfad Public Sub setDatensatz(ByVal pfad As String) - If (File.Exists(pfad)) Then + If (IO.File.Exists(pfad)) Then 'Datensatzname bestimmen - Me.Datensatz = Path.GetFileNameWithoutExtension(pfad) + Me.Datensatz = IO.Path.GetFileNameWithoutExtension(pfad) 'Arbeitsverzeichnis bestimmen - Me.WorkDir_Current = Path.GetDirectoryName(pfad) - Me.WorkDir_Original = Path.GetDirectoryName(pfad) + Me.WorkDir_Current = IO.Path.GetDirectoryName(pfad) + Me.WorkDir_Original = IO.Path.GetDirectoryName(pfad) Else Throw New Exception($"Dataset '{pfad}' not found!") End If @@ -203,7 +198,7 @@ Public MustInherit Class Sim Try Call Me.Read_SimParameter() Catch ex As Exception - Throw New Exception("Unable to read simulation parameters!" & eol & ex.Message) + Throw New Exception("Unable to read simulation parameters!" & Constants.eol & ex.Message) End Try End Sub @@ -212,7 +207,7 @@ Public MustInherit Class Sim ''' Das Problem übergeben ''' ''' Das Problem - Public Overridable Sub setProblem(ByRef prob As BlueM.Opt.Common.Problem) + Public Overridable Sub setProblem(ByRef prob As Problem) 'Problem speichern Me.mProblem = prob @@ -235,7 +230,7 @@ Public MustInherit Class Sim ''' Einstellungen setzen ''' ''' Die Einstellungen - Public Sub setSettings(ByRef settings As BlueM.Opt.Common.Settings) + Public Sub setSettings(ByRef settings As Settings) 'Settings speichern Me.mSettings = settings @@ -269,7 +264,7 @@ Public MustInherit Class Sim ''' das zu evaluierende Individuum ''' Ob das Individuum in OptResult-DB gespeichert werden soll ''' True wenn erfolgreich, False wenn fehlgeschlagen - Public Overloads Function Evaluate(ByRef ind As BlueM.Opt.Common.Individuum, Optional ByVal storeInDB As Boolean = True) As Boolean + Public Overloads Function Evaluate(ByRef ind As Individuum, Optional ByVal storeInDB As Boolean = True) As Boolean Dim isOK As Boolean @@ -290,7 +285,7 @@ Public MustInherit Class Sim Try Call Me.SIM_Ergebnis_auswerten(ind, storeInDB) Catch e As Exception - Common.Log.AddMessage(Common.Log.levels.error, "Failed to evaluate simulation: " & eol & e.Message) + Log.AddMessage(Log.levels.error, "Failed to evaluate simulation: " & Constants.eol & e.Message) Return False End Try @@ -307,10 +302,10 @@ Public MustInherit Class Sim ''' Ob das Individuum in OptResult-DB gespeichert werden soll ''' True/False für jedes Individuum ''' je nach Einstellung läuft die Evaluierung in multiplen Threads oder single-threaded ab - Public Overloads Function Evaluate(ByRef inds() As BlueM.Opt.Common.Individuum, Optional ByVal storeInDB As Boolean = True) As Boolean() + Public Overloads Function Evaluate(ByRef inds() As Individuum, Optional ByVal storeInDB As Boolean = True) As Boolean() Dim isOK() As Boolean - Dim tmpind As BlueM.Opt.Common.Individuum + Dim tmpind As Individuum Dim n_individuals As Integer Dim ThreadID_Free As Integer = 0 Dim ThreadID_Ready As Integer = 0 @@ -329,7 +324,7 @@ Public MustInherit Class Sim 'Mit Multithreading '================== - System.Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal + Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal OptTimePara.Start() Do @@ -375,7 +370,7 @@ Public MustInherit Class Sim isOK(n_ind_Ready) = True Catch e As Exception - Common.Log.AddMessage(Common.Log.levels.error, "Failed to evaluate simulation: " & eol & e.Message) + Log.AddMessage(Log.levels.error, "Failed to evaluate simulation: " & Constants.eol & e.Message) isOK(n_ind_Ready) = False SIM_Eval_is_OK = False End Try @@ -409,15 +404,15 @@ Public MustInherit Class Sim '------------------------------------------------- Do While (Me.isPause) - System.Threading.Thread.Sleep(20) - Application.DoEvents() + Threading.Thread.Sleep(20) + Windows.Forms.Application.DoEvents() Loop Else 'Falls total im Stress '--------------------- - System.Threading.Thread.Sleep(400) - Application.DoEvents() + Threading.Thread.Sleep(400) + Windows.Forms.Application.DoEvents() End If @@ -438,7 +433,7 @@ Public MustInherit Class Sim End If OptTimePara.Stop() - 'BlueM.Opt.Common.Log.AddMessage($"Die Evaluierung der Generation dauerte: {OptTimePara.Elapsed.Hours}h {OptTimePara.Elapsed.Minutes}m {OptTimePara.Elapsed.Seconds}s {OptTimePara.Elapsed}ms") + 'BlueM.Opt.Log.AddMessage($"Die Evaluierung der Generation dauerte: {OptTimePara.Elapsed.Hours}h {OptTimePara.Elapsed.Minutes}m {OptTimePara.Elapsed.Seconds}s {OptTimePara.Elapsed}ms") Return isOK @@ -446,7 +441,7 @@ Public MustInherit Class Sim 'Evaluierung des SimModells für ParameterOptimierung - Steuerungseinheit '*********************************************************************** - Private Sub PREPARE_Evaluation_PES(ByVal OptParams() As BlueM.Opt.Common.OptParameter) + Private Sub PREPARE_Evaluation_PES(ByVal OptParams() As OptParameter) 'Wenn Fehler: guckst du ob der Elementname richtig angegeben ist!! @@ -468,10 +463,10 @@ Public MustInherit Class Sim ''' das zu evaluierende Individuum ''' Ob das Individuum in OptResult-DB gespeichert werden soll ''' Die Simulation muss bereits erfolgt sein - Private Sub SIM_Ergebnis_auswerten(ByRef ind As Common.Individuum, Optional ByVal storeInDB As Boolean = True) + Private Sub SIM_Ergebnis_auswerten(ByRef ind As Individuum, Optional ByVal storeInDB As Boolean = True) Dim i, j, k As Short - Dim aggroziel As BlueM.Opt.Common.ObjectiveFunction_Aggregate + Dim aggroziel As ObjectiveFunction_Aggregate Dim aggregateIndices As New Collections.Generic.List(Of Integer) 'Simulationsergebnis einlesen @@ -567,11 +562,11 @@ Public MustInherit Class Sim Dim StrRight As String Dim DateiPfad As String Dim WriteCheck As Boolean = False - Dim FiStr As FileStream - Dim StrRead As StreamReader - Dim StrReadSync As TextReader - Dim StrWrite As StreamWriter - Dim StrWriteSync As TextWriter + Dim FiStr As IO.FileStream + Dim StrRead As IO.StreamReader + Dim StrReadSync As IO.TextReader + Dim StrWrite As IO.StreamWriter + Dim StrWriteSync As IO.TextWriter 'ModellParameter aus OptParametern kalkulieren() Call Me.OptParameter_to_ModellParameter() @@ -582,9 +577,9 @@ Public MustInherit Class Sim DateiPfad = IO.Path.Combine(Me.WorkDir_Current, Me.Datensatz & "." & Me.mProblem.List_ModellParameter(i).Datei) 'Datei öffnen - FiStr = New FileStream(DateiPfad, FileMode.Open, IO.FileAccess.Read) - StrRead = New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) - StrReadSync = TextReader.Synchronized(StrRead) + FiStr = New IO.FileStream(DateiPfad, IO.FileMode.Open, IO.FileAccess.Read) + StrRead = New IO.StreamReader(FiStr, Text.Encoding.GetEncoding("iso8859-1")) + StrReadSync = IO.TextReader.Synchronized(StrRead) Zeilen = New Collections.Generic.Dictionary(Of Integer, String) @@ -618,7 +613,7 @@ Public MustInherit Class Sim 'Wert auf verfügbare Stellen kürzen '---------------------------------- 'Auf ganze Zahl runden und zu String konvertieren - WertStr = Convert.ToString(Convert.ToInt32(Me.Akt.ModPara(i), Common.Provider.FortranProvider)) + WertStr = Convert.ToString(Convert.ToInt32(Me.Akt.ModPara(i), Provider.FortranProvider)) If (WertStr.Length > AnzZeichen) Then 'Wert zu lang @@ -633,7 +628,7 @@ Public MustInherit Class Sim End If If AnzNachkomma > 0 Then 'Runden auf verfügbare Stellen: - WertStr = Convert.ToString(Math.Round(Me.Akt.ModPara(i), AnzNachkomma), Common.Provider.FortranProvider) + WertStr = Convert.ToString(Math.Round(Me.Akt.ModPara(i), AnzNachkomma), Provider.FortranProvider) Else 'Ganzzahligen Wert benutzen End If @@ -647,8 +642,8 @@ Public MustInherit Class Sim Zeilen(Me.mProblem.List_ModellParameter(i).ZeileNr) = Zeile 'Alle Zeilen wieder in Datei schreiben - StrWrite = New StreamWriter(DateiPfad, False, System.Text.Encoding.GetEncoding("iso8859-1")) - StrWriteSync = TextWriter.Synchronized(StrWrite) + StrWrite = New IO.StreamWriter(DateiPfad, False, Text.Encoding.GetEncoding("iso8859-1")) + StrWriteSync = IO.TextWriter.Synchronized(StrWrite) For Each Zeile In Zeilen.Values StrWrite.WriteLine(Zeile) @@ -682,7 +677,7 @@ Public MustInherit Class Sim 'Constraint berechnen (Constraint < 0 ist Grenzverletzung) '********************************************************* - Private Function CalculateConstraint(ByVal constr As Common.Constraintfunction) As Double + Private Function CalculateConstraint(ByVal constr As Constraintfunction) As Double Dim i As Integer @@ -807,7 +802,7 @@ Public MustInherit Class Sim Dim i As Integer Dim isOK As Boolean Dim threadDir As String - Dim binPath As String = System.Windows.Forms.Application.StartupPath() + Dim binPath As String = Windows.Forms.Application.StartupPath() 'Alte Thread-Ordner löschen isOK = Me.deleteThreadWorkDirs() @@ -829,7 +824,7 @@ Public MustInherit Class Sim ''' Private Function getDatensatzFiles(ByVal rootdirectory As String) As String() - Dim Files() As IO.FileInfo + Dim files() As IO.FileInfo Dim DirInfo, Dirs() As IO.DirectoryInfo Dim paths(), subpaths(), ext As String @@ -842,16 +837,16 @@ Public MustInherit Class Sim DirInfo = New IO.DirectoryInfo(rootdirectory) 'zu kopierende Dateien anhand der Dateiendung bestimmen - Files = DirInfo.GetFiles("*.*") - For Each File As IO.FileInfo In Files + files = DirInfo.GetFiles("*.*") + For Each file As IO.FileInfo In files 'Dateiendung bestimmen - If (File.Extension.Length > 0) Then - ext = File.Extension.Substring(1).ToUpper() + If (file.Extension.Length > 0) Then + ext = file.Extension.Substring(1).ToUpper() 'Prüfen, ob es sich ume eine zu kopierende Datei handelt If (Me.DatensatzDateiendungen.Contains(ext)) Then 'Relativen Pfad der Datei zu Array hinzufügen ReDim Preserve paths(paths.Length) - paths(paths.Length - 1) = File.Name + paths(paths.Length - 1) = file.Name End If End If Next @@ -888,11 +883,11 @@ Public MustInherit Class Sim For i = 0 To 9 - dir = IO.Path.Combine(System.Windows.Forms.Application.StartupPath(), "Thread_" & i.ToString()) + dir = IO.Path.Combine(Windows.Forms.Application.StartupPath(), "Thread_" & i.ToString()) - If Directory.Exists(dir) Then - Call BlueM.Opt.Common.FileHelper.purgeReadOnly(dir) - Directory.Delete(dir, True) + If IO.Directory.Exists(dir) Then + Call FileHelper.purgeReadOnly(dir) + IO.Directory.Delete(dir, True) End If Next @@ -908,7 +903,7 @@ Public MustInherit Class Sim Dim dir As String - dir = IO.Path.Combine(System.Windows.Forms.Application.StartupPath(), "Thread_" & Thread_ID.ToString()) + dir = IO.Path.Combine(Windows.Forms.Application.StartupPath(), "Thread_" & Thread_ID.ToString()) Return dir diff --git a/BlueM.Opt/Apps/TALSIM/TALSIM.vb b/BlueM.Opt/Apps/TALSIM/TALSIM.vb index 21524a63..58637b16 100644 --- a/BlueM.Opt/Apps/TALSIM/TALSIM.vb +++ b/BlueM.Opt/Apps/TALSIM/TALSIM.vb @@ -15,10 +15,7 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.IO Imports System.Threading -Imports System.Globalization -Imports BlueM Imports BlueM.Opt.Common ''' @@ -46,9 +43,9 @@ Public Class Talsim #Region "Properties" ''' - ''' Alle Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können + ''' Alle Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können ''' - ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) + ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) Public Overrides ReadOnly Property DatensatzDateiendungen() As Collections.Specialized.StringCollection Get Dim exts As New Collections.Specialized.StringCollection() @@ -66,7 +63,7 @@ Public Class Talsim End Property ''' - ''' Ob die Anwendung Multithreading unterstützt + ''' Ob die Anwendung Multithreading unterstützt ''' ''' True Public Overrides ReadOnly Property MultithreadingSupported() As Boolean @@ -97,15 +94,15 @@ Public Class Talsim 'attempt to get exe_path from UserSettings exe_path = My.Settings.TALSIM_path - If (Not File.Exists(exe_path)) Then + If (Not IO.File.Exists(exe_path)) Then 'use default location instead - exe_path = IO.Path.Combine(System.Windows.Forms.Application.StartupPath(), "TALSIM\talsimw64.exe") + exe_path = IO.Path.Combine(Windows.Forms.Application.StartupPath(), "TALSIM\talsimw64.exe") If My.Settings.TALSIM_path.Trim() <> "" Then - MsgBox($"UserSetting for TALSIM_path {My.Settings.TALSIM_path} was not found.{eol}Using default {exe_path} instead.", MsgBoxStyle.Information) + MsgBox($"UserSetting for TALSIM_path {My.Settings.TALSIM_path} was not found.{Constants.eol}Using default {exe_path} instead.", MsgBoxStyle.Information) End If End If - If (Not File.Exists(exe_path)) Then + If (Not IO.File.Exists(exe_path)) Then Throw New Exception(exe_path & " not found!") End If @@ -129,12 +126,12 @@ Public Class Talsim End Sub - Public Overrides Sub setProblem(ByRef prob As BlueM.Opt.Common.Problem) + Public Overrides Sub setProblem(ByRef prob As Problem) Call MyBase.setProblem(prob) 'TALSIM-spezifische Weiterverarbeitung von ZielReihen: - Dim objective As Common.ObjectiveFunction + Dim objective As ObjectiveFunction 'Feststellen, welche WEL/WBL-Dateien in Zielfunktionen genutzt werden For Each objective In Me.mProblem.List_ObjectiveFunctions @@ -172,8 +169,8 @@ Public Class Talsim 'read all settings Try - Using FiStr As New FileStream(Datei, FileMode.Open, IO.FileAccess.Read) - Using StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Using FiStr As New IO.FileStream(Datei, IO.FileMode.Open, IO.FileAccess.Read) + Using StrRead As New IO.StreamReader(FiStr, Text.Encoding.GetEncoding("iso8859-1")) Do line = StrRead.ReadLine.ToString().Trim() @@ -232,7 +229,7 @@ Public Class Talsim #Region "Evaluierung" ''' - ''' Gibt zurück ob ein beliebiger Thread beendet ist und gibt die ID diesen freien Threads zurück + ''' Gibt zurück ob ein beliebiger Thread beendet ist und gibt die ID diesen freien Threads zurück ''' ''' ''' @@ -291,13 +288,13 @@ Public Class Talsim 'write the path to the dataset and the dataset name into a new run file 'this is done for every simulation because the workdir may change Dim runfile As String = IO.Path.Combine(IO.Path.GetDirectoryName(exe_path), "talsim.run") - If (Not File.Exists(runfile)) Then + If (Not IO.File.Exists(runfile)) Then Throw New Exception(runfile & " not found!") End If Dim line As String 'read the template run file - filestr = New FileStream(runfile, FileMode.Open, IO.FileAccess.Read) - strread = New StreamReader(filestr, System.Text.Encoding.GetEncoding("iso8859-1")) + filestr = New IO.FileStream(runfile, IO.FileMode.Open, IO.FileAccess.Read) + strread = New IO.StreamReader(filestr, Text.Encoding.GetEncoding("iso8859-1")) Dim lines As New Collections.Generic.List(Of String) Do line = strread.ReadLine() @@ -309,7 +306,7 @@ Public Class Talsim 'write a new run file Dim runfilename As String = MyBase.Datensatz & ".run" runfile = IO.Path.Combine(IO.Path.GetDirectoryName(Me.exe_path), runfilename) - Dim strwrite As New StreamWriter(runfile, False, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim strwrite As New IO.StreamWriter(runfile, False, Text.Encoding.GetEncoding("iso8859-1")) For Each line In lines If line.StartsWith("Path=") Then 'update the sim path @@ -336,11 +333,11 @@ Public Class Talsim 'start proc = Process.Start(startInfo) 'DEBUG: write to log - 'BlueM.Opt.Common.Log.AddMessage(startInfo.FileName & " " & startInfo.Arguments) + 'BlueM.Opt.Log.AddMessage(startInfo.FileName & " " & startInfo.Arguments) 'wait until finished Do isFinished = proc.WaitForExit(100) - System.Windows.Forms.Application.DoEvents() + Windows.Forms.Application.DoEvents() Loop Until isFinished 'close the process proc.Close() @@ -350,10 +347,10 @@ Public Class Talsim 'read err-file Dim errmsg As String = "TALSIM simulation ended with errors:" filestr = New IO.FileStream(errfile, IO.FileMode.Open, IO.FileAccess.Read) - strread = New IO.StreamReader(filestr, System.Text.Encoding.GetEncoding("iso8859-1")) + strread = New IO.StreamReader(filestr, Text.Encoding.GetEncoding("iso8859-1")) Do line = strread.ReadLine() - errmsg &= BlueM.Opt.Common.eol & line + errmsg &= Constants.eol & line Loop Until strread.Peek = -1 strread.Close() filestr.Close() @@ -372,7 +369,7 @@ Public Class Talsim Catch ex As Exception 'Simulationsfehler aufgetreten - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) + Log.AddMessage(Log.levels.error, ex.Message) 'Simulation nicht erfolgreich simOK = False @@ -388,8 +385,8 @@ Public Class Talsim End Function ''' - ''' Prüft ob das aktuelle Child mit der ID die oben übergeben wurde fertig ist - ''' Gibt die Thread ID zurück um zum auswerten in das Arbeitsverzeichnis zu wechseln + ''' Prüft ob das aktuelle Child mit der ID die oben übergeben wurde fertig ist + ''' Gibt die Thread ID zurück um zum auswerten in das Arbeitsverzeichnis zu wechseln ''' ''' ''' @@ -418,7 +415,7 @@ Public Class Talsim ''' Protected Overrides Sub SIM_Ergebnis_Lesen() - 'Altes Simulationsergebnis löschen + 'Altes Simulationsergebnis löschen Me.SimResult.Clear() 'Collect required result files and series diff --git a/BlueM.Opt/Apps/TALSIM/TALSIM5.vb b/BlueM.Opt/Apps/TALSIM/TALSIM5.vb index 6acbb0fe..4ef9ddc9 100644 --- a/BlueM.Opt/Apps/TALSIM/TALSIM5.vb +++ b/BlueM.Opt/Apps/TALSIM/TALSIM5.vb @@ -16,9 +16,8 @@ 'along with this program. If not, see . ' Imports System.Threading -Imports System.Windows.Forms -Imports BlueM.Opt.Common Imports Microsoft.Data.Sqlite +Imports BlueM.Opt.Common ''' ''' Class TALSIM5 for carrying out simulations using TALSIM5 (same simulation executable but different dataset format than TALSIM4) @@ -64,9 +63,9 @@ Public Class Talsim5 End Class ''' - ''' Alle Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können + ''' Alle Dateiendungen (ohne Punkt), die in einem Datensatz vorkommen können ''' - ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) + ''' Die erste Dateiendung in dieser Collection repräsentiert den Datensatz (wird z.B. als Filter für OpenFile-Dialoge verwendet) Public Overrides ReadOnly Property DatensatzDateiendungen() As Collections.Specialized.StringCollection Get Dim exts As New Collections.Specialized.StringCollection() @@ -79,7 +78,7 @@ Public Class Talsim5 End Property ''' - ''' Ob die Anwendung Multithreading unterstützt + ''' Ob die Anwendung Multithreading unterstützt ''' ''' True Public Overrides ReadOnly Property MultithreadingSupported As Boolean = True @@ -111,9 +110,9 @@ Public Class Talsim5 If (Not IO.File.Exists(exe_path)) Then 'use default location instead - exe_path = IO.Path.Combine(System.Windows.Forms.Application.StartupPath(), "TALSIM\talsimw64.exe") + exe_path = IO.Path.Combine(Windows.Forms.Application.StartupPath(), "TALSIM\talsimw64.exe") If My.Settings.TALSIM_path.Trim() <> "" Then - MsgBox($"UserSetting for TALSIM_path {My.Settings.TALSIM_path} was not found.{eol}Using default {exe_path} instead.", MsgBoxStyle.Information) + MsgBox($"UserSetting for TALSIM_path {My.Settings.TALSIM_path} was not found.{Constants.eol}Using default {exe_path} instead.", MsgBoxStyle.Information) End If End If @@ -141,12 +140,12 @@ Public Class Talsim5 End Sub - Public Overrides Sub setProblem(ByRef prob As BlueM.Opt.Common.Problem) + Public Overrides Sub setProblem(ByRef prob As Problem) Call MyBase.setProblem(prob) 'TALSIM-spezifische Weiterverarbeitung von ZielReihen: - Dim objective As Common.ObjectiveFunction + Dim objective As ObjectiveFunction 'Feststellen, welche WEL/WBL-Dateien in Zielfunktionen genutzt werden For Each objective In Me.mProblem.List_ObjectiveFunctions @@ -175,7 +174,7 @@ Public Class Talsim5 'Show Talsim5 settings dialog Dim dlg As New TALSIM5_Dialog(Me.DBFile) - If dlg.ShowDialog() <> DialogResult.OK Then + If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then Throw New Exception("Talsim5 settings not set!") End If 'save settings from dialog @@ -208,7 +207,7 @@ Public Class Talsim5 End Sub ''' - ''' Gibt zurück ob ein beliebiger Thread beendet ist und gibt die ID diesen freien Threads zurück + ''' Gibt zurück ob ein beliebiger Thread beendet ist und gibt die ID diesen freien Threads zurück ''' ''' ''' @@ -273,7 +272,7 @@ Public Class Talsim5 Dim line As String 'read the template run file filestr = New IO.FileStream(runfile, IO.FileMode.Open, IO.FileAccess.Read) - strread = New IO.StreamReader(filestr, System.Text.Encoding.GetEncoding("iso8859-1")) + strread = New IO.StreamReader(filestr, Text.Encoding.GetEncoding("iso8859-1")) Dim lines As New Collections.Generic.List(Of String) Do line = strread.ReadLine() @@ -285,7 +284,7 @@ Public Class Talsim5 'write a new run file Dim runfilename As String = MyBase.Datensatz & ".run" runfile = IO.Path.Combine(IO.Path.GetDirectoryName(Me.exe_path), runfilename) - Dim strwrite As New IO.StreamWriter(runfile, False, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim strwrite As New IO.StreamWriter(runfile, False, Text.Encoding.GetEncoding("iso8859-1")) For Each line In lines If line.StartsWith("Path=") Then line = "Path=" & MyBase.WorkDir_Current @@ -318,11 +317,11 @@ Public Class Talsim5 'start proc = Process.Start(startInfo) 'DEBUG: write to log - 'BlueM.Opt.Common.Log.AddMessage(startInfo.FileName & " " & startInfo.Arguments) + 'BlueM.Opt.Log.AddMessage(startInfo.FileName & " " & startInfo.Arguments) 'wait until finished Do isFinished = proc.WaitForExit(100) - System.Windows.Forms.Application.DoEvents() + Windows.Forms.Application.DoEvents() Loop Until isFinished 'close the process proc.Close() @@ -332,10 +331,10 @@ Public Class Talsim5 'read err-file Dim errmsg As String = "TALSIM simulation ended with errors:" filestr = New IO.FileStream(errfile, IO.FileMode.Open, IO.FileAccess.Read) - strread = New IO.StreamReader(filestr, System.Text.Encoding.GetEncoding("iso8859-1")) + strread = New IO.StreamReader(filestr, Text.Encoding.GetEncoding("iso8859-1")) Do line = strread.ReadLine() - errmsg &= BlueM.Opt.Common.eol & line + errmsg &= Constants.eol & line Loop Until strread.Peek = -1 strread.Close() filestr.Close() @@ -354,7 +353,7 @@ Public Class Talsim5 Catch ex As Exception 'Simulationsfehler aufgetreten - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) + Log.AddMessage(Log.levels.error, ex.Message) 'Simulation nicht erfolgreich simOK = False @@ -370,8 +369,8 @@ Public Class Talsim5 End Function ''' - ''' Prüft ob das aktuelle Child mit der ID die oben übergeben wurde fertig ist - ''' Gibt die Thread ID zurück um zum auswerten in das Arbeitsverzeichnis zu wechseln + ''' Prüft ob das aktuelle Child mit der ID die oben übergeben wurde fertig ist + ''' Gibt die Thread ID zurück um zum auswerten in das Arbeitsverzeichnis zu wechseln ''' ''' ''' @@ -443,7 +442,7 @@ Public Class Talsim5 ''' Protected Overrides Sub SIM_Ergebnis_Lesen() - 'Altes Simulationsergebnis löschen + 'Altes Simulationsergebnis löschen Me.SimResult.Clear() 'Collect required result files and series diff --git a/BlueM.Opt/Apps/TALSIM/TALSIM5Thread.vb b/BlueM.Opt/Apps/TALSIM/TALSIM5Thread.vb index e93a9f89..851712c3 100644 --- a/BlueM.Opt/Apps/TALSIM/TALSIM5Thread.vb +++ b/BlueM.Opt/Apps/TALSIM/TALSIM5Thread.vb @@ -15,6 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports BlueM.Opt.Common + ''' ''' Klasse beinhaltet alle Infomationen für einen Simulationslauf im Thread ''' @@ -66,7 +68,7 @@ Public Class Talsim5Thread Me.launchReady = False 'Priority - System.Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal + Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal Try 'write the required settings into a new run file @@ -78,7 +80,7 @@ Public Class Talsim5Thread Dim line As String 'read the template run file filestr = New IO.FileStream(runfile, IO.FileMode.Open, IO.FileAccess.Read) - strread = New IO.StreamReader(filestr, System.Text.Encoding.GetEncoding("iso8859-1")) + strread = New IO.StreamReader(filestr, Text.Encoding.GetEncoding("iso8859-1")) Dim lines As New Collections.Generic.List(Of String) Do line = strread.ReadLine() @@ -90,20 +92,20 @@ Public Class Talsim5Thread 'write a new run file Dim runfilename As String = $"{Me.DS_Name}_{Me.Thread_ID}.run" runfile = IO.Path.Combine(IO.Path.GetDirectoryName(Talsim5Thread.exe_path), runfilename) - Dim strwrite As New IO.StreamWriter(runfile, False, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim strwrite As New IO.StreamWriter(runfile, False, Text.Encoding.GetEncoding("iso8859-1")) For Each line In lines If line.StartsWith("Path=") Then line = "Path=" & Me.WorkFolder ElseIf line.StartsWith("System=") Then line = "System=" & Me.DS_Name ElseIf line.StartsWith("DBFile=") Then - line = "DBFile=" & Me.dbfile + line = "DBFile=" & Me.DBFile ElseIf line.StartsWith("ZrePath=") Then line = "ZrePath=" & Me.TimeseriesPath & "\" ElseIf line.StartsWith("ScenarioId=") Then - line = "ScenarioId=" & Me.scenarioId.ToString() + line = "ScenarioId=" & Me.ScenarioId.ToString() ElseIf line.StartsWith("SimulationId=") Then - line = "SimulationId=" & Me.simulationId.ToString() + line = "SimulationId=" & Me.SimulationId.ToString() End If strwrite.WriteLine(line) Next @@ -132,11 +134,11 @@ Public Class Talsim5Thread 'start proc = Process.Start(startInfo) 'DEBUG: write to log - 'BlueM.Opt.Common.Log.AddMessage($"Thread {Me.Thread_ID}: {startInfo.FileName} {startInfo.Arguments}") + 'BlueM.Opt.Log.AddMessage($"Thread {Me.Thread_ID}: {startInfo.FileName} {startInfo.Arguments}") 'wait until finished Do isFinished = proc.WaitForExit(100) - System.Windows.Forms.Application.DoEvents() + Windows.Forms.Application.DoEvents() Loop Until isFinished 'close the process proc.Close() @@ -152,10 +154,10 @@ Public Class Talsim5Thread 'read err-file errmsg = $"Thread {Me.Thread_ID}: TALSIM simulation ended with errors:" filestr = New IO.FileStream(errfile, IO.FileMode.Open, IO.FileAccess.Read) - strread = New IO.StreamReader(filestr, System.Text.Encoding.GetEncoding("iso8859-1")) + strread = New IO.StreamReader(filestr, Text.Encoding.GetEncoding("iso8859-1")) Do line = strread.ReadLine() - errmsg &= BlueM.Opt.Common.eol & line + errmsg &= Constants.eol & line Loop Until strread.Peek = -1 strread.Close() filestr.Close() @@ -167,13 +169,13 @@ Public Class Talsim5Thread End If 'Log error message - Common.Log.AddMessage(Common.Log.levels.error, errmsg) + Log.AddMessage(Log.levels.error, errmsg) If i_attempt < n_attempts Then - Common.Log.AddMessage(Common.Log.levels.error, $"Thread {Me.Thread_ID}: TALSIM simulation attempt {i_attempt} was unsuccessful, trying again...") - System.Threading.Thread.Sleep(100) + Log.AddMessage(Log.levels.error, $"Thread {Me.Thread_ID}: TALSIM simulation attempt {i_attempt} was unsuccessful, trying again...") + Threading.Thread.Sleep(100) Else - Common.Log.AddMessage(Common.Log.levels.error, $"Thread {Me.Thread_ID}: TALSIM simulation attempt {i_attempt} was unsuccessful, parameter set will be discarded!") + Log.AddMessage(Log.levels.error, $"Thread {Me.Thread_ID}: TALSIM simulation attempt {i_attempt} was unsuccessful, parameter set will be discarded!") End If Next @@ -181,7 +183,7 @@ Public Class Talsim5Thread Catch ex As Exception 'Simulationsfehler aufgetreten - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) + Log.AddMessage(Log.levels.error, ex.Message) 'Simulation nicht erfolgreich Me.SimIsOK = False diff --git a/BlueM.Opt/Apps/TALSIM/TALSIM5_Dialog.vb b/BlueM.Opt/Apps/TALSIM/TALSIM5_Dialog.vb index c85a228f..b7c496b6 100644 --- a/BlueM.Opt/Apps/TALSIM/TALSIM5_Dialog.vb +++ b/BlueM.Opt/Apps/TALSIM/TALSIM5_Dialog.vb @@ -1,4 +1,4 @@ -'BlueM.Opt +'BlueM.Opt 'Copyright (C) BlueM Dev Group 'Website: ' @@ -15,8 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports Microsoft.Data.Sqlite Imports System.Windows.Forms +Imports Microsoft.Data.Sqlite Friend Class TALSIM5_Dialog @@ -61,7 +61,7 @@ Friend Class TALSIM5_Dialog End Property ''' - ''' Create a new instance of the dialog with the given database path. + ''' Create a new instance of the dialog with the given database IO.Path. ''' The dialog will read the scenarios and simulations from the database and show them in the corresponding combo boxes. ''' ''' Path to the database @@ -168,12 +168,12 @@ Friend Class TALSIM5_Dialog MessageBox.Show("The selected timeseries path does not exist!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Return End If - Me.DialogResult = System.Windows.Forms.DialogResult.OK + Me.DialogResult = DialogResult.OK Me.Close() End Sub Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click - Me.DialogResult = System.Windows.Forms.DialogResult.Cancel + Me.DialogResult = DialogResult.Cancel Me.Close() End Sub diff --git a/BlueM.Opt/Apps/TALSIM/TALSIMThread.vb b/BlueM.Opt/Apps/TALSIM/TALSIMThread.vb index ea2c1441..fc933963 100644 --- a/BlueM.Opt/Apps/TALSIM/TALSIMThread.vb +++ b/BlueM.Opt/Apps/TALSIM/TALSIMThread.vb @@ -15,6 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports BlueM.Opt.Common + ''' ''' Klasse beinhaltet alle Infomationen für einen Simulationslauf im Thread ''' @@ -50,7 +52,7 @@ Public Class TalsimThread Me.launchReady = False 'Priority - System.Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal + Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal Try 'write the path to the dataset and the dataset name into a new run file @@ -62,7 +64,7 @@ Public Class TalsimThread Dim line As String 'read the template run file filestr = New IO.FileStream(runfile, IO.FileMode.Open, IO.FileAccess.Read) - strread = New IO.StreamReader(filestr, System.Text.Encoding.GetEncoding("iso8859-1")) + strread = New IO.StreamReader(filestr, Text.Encoding.GetEncoding("iso8859-1")) Dim lines As New Collections.Generic.List(Of String) Do line = strread.ReadLine() @@ -74,7 +76,7 @@ Public Class TalsimThread 'write a new run file Dim runfilename As String = $"{Me.DS_Name}_{Me.Thread_ID}.run" runfile = IO.Path.Combine(IO.Path.GetDirectoryName(TalsimThread.exe_path), runfilename) - Dim strwrite As New IO.StreamWriter(runfile, False, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim strwrite As New IO.StreamWriter(runfile, False, Text.Encoding.GetEncoding("iso8859-1")) For Each line In lines If line.StartsWith("Path=") Then 'update the sim path @@ -110,11 +112,11 @@ Public Class TalsimThread 'start proc = Process.Start(startInfo) 'DEBUG: write to log - 'BlueM.Opt.Common.Log.AddMessage($"Thread {Me.Thread_ID}: {startInfo.FileName} {startInfo.Arguments}") + 'BlueM.Opt.Log.AddMessage($"Thread {Me.Thread_ID}: {startInfo.FileName} {startInfo.Arguments}") 'wait until finished Do isFinished = proc.WaitForExit(100) - System.Windows.Forms.Application.DoEvents() + Windows.Forms.Application.DoEvents() Loop Until isFinished 'close the process proc.Close() @@ -130,10 +132,10 @@ Public Class TalsimThread 'read err-file errmsg = $"Thread {Me.Thread_ID}: TALSIM simulation ended with errors:" filestr = New IO.FileStream(errfile, IO.FileMode.Open, IO.FileAccess.Read) - strread = New IO.StreamReader(filestr, System.Text.Encoding.GetEncoding("iso8859-1")) + strread = New IO.StreamReader(filestr, Text.Encoding.GetEncoding("iso8859-1")) Do line = strread.ReadLine() - errmsg &= BlueM.Opt.Common.eol & line + errmsg &= Constants.eol & line Loop Until strread.Peek = -1 strread.Close() filestr.Close() @@ -145,13 +147,13 @@ Public Class TalsimThread End If 'Log error message - Common.Log.AddMessage(Common.Log.levels.error, errmsg) + Log.AddMessage(Log.levels.error, errmsg) If i_attempt < n_attempts Then - Common.Log.AddMessage(Common.Log.levels.error, $"Thread {Me.Thread_ID}: TALSIM simulation attempt {i_attempt} was unsuccessful, trying again...") - System.Threading.Thread.Sleep(100) + Log.AddMessage(Log.levels.error, $"Thread {Me.Thread_ID}: TALSIM simulation attempt {i_attempt} was unsuccessful, trying again...") + Threading.Thread.Sleep(100) Else - Common.Log.AddMessage(Common.Log.levels.error, $"Thread {Me.Thread_ID}: TALSIM simulation attempt {i_attempt} was unsuccessful, parameter set will be discarded!") + Log.AddMessage(Log.levels.error, $"Thread {Me.Thread_ID}: TALSIM simulation attempt {i_attempt} was unsuccessful, parameter set will be discarded!") End If Next @@ -159,7 +161,7 @@ Public Class TalsimThread Catch ex As Exception 'Simulationsfehler aufgetreten - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) + Log.AddMessage(Log.levels.error, ex.Message) 'Simulation nicht erfolgreich Me.SimIsOK = False diff --git a/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb b/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb index c6336b6d..23119cf2 100644 --- a/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb +++ b/BlueM.Opt/Apps/Testprobleme/Testprobleme.vb @@ -15,7 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports BlueM.Opt.Common.Constants +Imports System.Drawing +Imports BlueM.Opt.Common Public Class Testprobleme @@ -40,12 +41,12 @@ Public Class Testprobleme Private mSelectedTestproblem As String Private mTestProblemDescription As String - Private mProblem As BlueM.Opt.Common.Problem + Private mProblem As Problem Private mAnzParameter As Integer Private mAnzZiele As Integer Private mAnzConstraints As Integer - Private mOptPara() As Common.OptParameter + Private mOptPara() As OptParameter 'Properties '########## @@ -99,7 +100,7 @@ Public Class Testprobleme 'Parameterübergabe '***************** - Public Sub getProblem(ByRef prob As BlueM.Opt.Common.Problem) + Public Sub getProblem(ByRef prob As Problem) Dim i As Integer @@ -116,7 +117,7 @@ Public Class Testprobleme Me.mAnzConstraints = 0 ReDim Me.mOptPara(Me.mAnzParameter - 1) For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = 0 } Next @@ -128,7 +129,7 @@ Public Class Testprobleme Me.mAnzConstraints = 0 ReDim Me.mOptPara(Me.mAnzParameter - 1) For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = 0.5 } Next @@ -140,7 +141,7 @@ Public Class Testprobleme Me.mAnzConstraints = 0 ReDim Me.mOptPara(Me.mAnzParameter - 1) For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = 1 } Next @@ -153,7 +154,7 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = Rnd() } Next @@ -166,7 +167,7 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = Rnd() } Next @@ -179,7 +180,7 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = Rnd() } Next @@ -192,7 +193,7 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = Rnd() } Next @@ -205,7 +206,7 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = Rnd() } Next @@ -218,7 +219,7 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = Rnd() } Next @@ -231,7 +232,7 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = Rnd() } Next @@ -243,13 +244,13 @@ Public Class Testprobleme Me.mAnzConstraints = 0 ReDim Me.mOptPara(Me.mAnzParameter - 1) For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = 1 } Next 'Beziehungen - Me.mOptPara(0).Beziehung = Common.Constants.Relationship.none - Me.mOptPara(1).Beziehung = Common.Constants.Relationship.larger_than + Me.mOptPara(0).Beziehung = Constants.Relationship.none + Me.mOptPara(1).Beziehung = Constants.Relationship.larger_than Case TP_FloodMitigation 'Ajay Me.mTestProblemDescription = "Multicriteria Problem Flood Mitigation and Hydropower Generation" @@ -259,7 +260,7 @@ Public Class Testprobleme ReDim Me.mOptPara(Me.mAnzParameter - 1) Randomize() For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter With { + Me.mOptPara(i) = New OptParameter With { .Xn = Rnd() } @@ -280,7 +281,7 @@ Public Class Testprobleme Me.mAnzConstraints = 0 ReDim Me.mOptPara(Me.mAnzParameter - 1) For i = 0 To Me.mAnzParameter - 1 - Me.mOptPara(i) = New BlueM.Opt.Common.OptParameter() + Me.mOptPara(i) = New OptParameter() Next Randomize() With Me.mOptPara(0) @@ -304,14 +305,14 @@ Public Class Testprobleme ReDim Me.mProblem.List_ObjectiveFunctions(Me.mAnzZiele - 1) For i = 0 To Me.mProblem.NumObjectives - 1 'Check_SH: - Me.mProblem.List_ObjectiveFunctions(i) = New Common.ObjectiveFunction_Series With { + Me.mProblem.List_ObjectiveFunctions(i) = New ObjectiveFunction_Series With { .isPrimObjective = True, .Direction = EVO_DIRECTION.Minimization } Next ReDim Me.mProblem.List_Constraintfunctions(Me.mAnzConstraints - 1) For i = 0 To Me.mProblem.NumConstraints - 1 - Me.mProblem.List_Constraintfunctions(i) = New Common.Constraintfunction() + Me.mProblem.List_Constraintfunctions(i) = New Constraintfunction() Next ReDim Me.mProblem.List_OptParameter(Me.mAnzParameter - 1) For i = 0 To Me.mProblem.NumOptParams - 1 @@ -798,11 +799,11 @@ Public Class Testprobleme .UsePalette = False } surface.Brush.Solid = True - surface.Brush.Color = System.Drawing.Color.Green + surface.Brush.Color = Color.Green surface.Brush.Transparency = 70 - surface.Pen.Color = System.Drawing.Color.Green + surface.Pen.Color = Color.Green surface.SideBrush.Visible = True - surface.SideBrush.Color = System.Drawing.Color.Red + surface.SideBrush.Color = Color.Red surface.SideBrush.Transparency = 70 surface.Add(ArrayX, ArrayY, ArrayZ) @@ -831,11 +832,11 @@ Public Class Testprobleme .UsePalette = False } surface.Brush.Solid = True - surface.Brush.Color = System.Drawing.Color.Blue + surface.Brush.Color = Color.Blue surface.Brush.Transparency = 70 - surface.Pen.Color = System.Drawing.Color.Blue + surface.Pen.Color = Color.Blue surface.SideBrush.Visible = True - surface.SideBrush.Color = System.Drawing.Color.Red + surface.SideBrush.Color = Color.Red surface.SideBrush.Transparency = 70 surface.Add(ArrayX, ArrayY, ArrayZ) @@ -846,7 +847,7 @@ Public Class Testprobleme series3D.Pointer.Style = Steema.TeeChart.Styles.PointerStyles.Nothing series3D.LinePen.Visible = True series3D.LinePen.Width = 1 - series3D.LinePen.Color = System.Drawing.Color.Red + series3D.LinePen.Color = Color.Red series3D.Add(0.5, 0, 0.3) series3D.Add(0, 0.5, 0.3) @@ -1010,11 +1011,11 @@ Public Class Testprobleme .UsePalette = False } surface.Brush.Solid = True - surface.Brush.Color = System.Drawing.Color.Green + surface.Brush.Color = Color.Green surface.Brush.Transparency = 70 - surface.Pen.Color = System.Drawing.Color.Green + surface.Pen.Color = Color.Green surface.SideBrush.Visible = True - surface.SideBrush.Color = System.Drawing.Color.Red + surface.SideBrush.Color = Color.Red surface.SideBrush.Transparency = 70 surface.Add(ArrayX, ArrayY, ArrayZ) @@ -1031,7 +1032,7 @@ Public Class Testprobleme ''' Populationsnummer (0-basiert) ''' Referenz auf das Hauptdiagramm ''' - Public Sub Evaluate(ByRef ind As Common.Individuum, ByVal ipop As Short, ByRef Diag As BlueM.Opt.Diagramm.Hauptdiagramm) + Public Sub Evaluate(ByRef ind As Individuum, ByVal ipop As Short, ByRef Diag As BlueM.Opt.Diagramm.Hauptdiagramm) Dim i As Integer Dim Unterteilung_X As Double @@ -1138,7 +1139,7 @@ Public Class Testprobleme f2 = f2 + ind.OptParameter(i).Xn Next i f2 = 1 + 9 / (globalAnzPar - 1) * f2 - f2 = f2 * (1 - System.Math.Sqrt(f1 / f2)) + f2 = f2 * (1 - Math.Sqrt(f1 / f2)) ind.Objectives(0) = f1 ind.Objectives(1) = f2 @@ -1199,7 +1200,7 @@ Public Class Testprobleme f2 = f2 + (x2 * x2 - 10 * Math.Cos(4 * Math.PI * x2)) Next i f2 = 1 + 10 * (globalAnzPar - 1) + f2 - f2 = f2 * (1 - System.Math.Sqrt(f1 / f2)) + f2 = f2 * (1 - Math.Sqrt(f1 / f2)) ind.Objectives(0) = f1 ind.Objectives(1) = f2 diff --git a/BlueM.Opt/Common/FileHelper.vb b/BlueM.Opt/Common/FileHelper.vb index 8bf4a2b0..9ee696a1 100644 --- a/BlueM.Opt/Common/FileHelper.vb +++ b/BlueM.Opt/Common/FileHelper.vb @@ -15,7 +15,6 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.IO Public Module FileHelper @@ -23,25 +22,25 @@ Public Module FileHelper '***************************************************************************************** Public Sub purgeReadOnly(ByVal path As String) - Dim mainDir As New DirectoryInfo(path) + Dim mainDir As New IO.DirectoryInfo(path) Dim fInfo As IO.FileInfo() = mainDir.GetFiles("*.*") 'now loop through all the files and change the file attributes to normal Dim file As IO.FileInfo For Each file In fInfo - If (file.Attributes And FileAttributes.ReadOnly) Then - file.Attributes = FileAttributes.Normal + If (file.Attributes And IO.FileAttributes.ReadOnly) Then + file.Attributes = IO.FileAttributes.Normal End If Next 'do the same for the directories - Dim dInfo As DirectoryInfo() = mainDir.GetDirectories("*.*") - Dim dir As DirectoryInfo + Dim dInfo As IO.DirectoryInfo() = mainDir.GetDirectories("*.*") + Dim dir As IO.DirectoryInfo For Each dir In dInfo - If (dir.Attributes And FileAttributes.ReadOnly) Then - dir.Attributes = FileAttributes.Normal + If (dir.Attributes And IO.FileAttributes.ReadOnly) Then + dir.Attributes = IO.FileAttributes.Normal End If 'Call method recursively diff --git a/BlueM.Opt/Common/Individuum/Individuum.vb b/BlueM.Opt/Common/Individuum/Individuum.vb index ece206b8..0550818c 100644 --- a/BlueM.Opt/Common/Individuum/Individuum.vb +++ b/BlueM.Opt/Common/Individuum/Individuum.vb @@ -16,7 +16,7 @@ 'along with this program. If not, see . ' ''' -''' Basisklasse Individuum für das Speichern eines Evaluierungssatzes +''' Basisklasse Individuum für das Speichern eines Evaluierungssatzes ''' Public MustInherit Class Individuum @@ -40,12 +40,12 @@ Public MustInherit Class Individuum Protected mID As Integer 'ID des Individuums Protected mAllObjectives() As Double 'Array aller Objectivefunktionswerte (inkl. PrimaryObjectives) - Protected mConstraints() As Double 'Werte der Randbedingungen (Wenn negativ dann ungültig) + Protected mConstraints() As Double 'Werte der Randbedingungen (Wenn negativ dann ungültig) - 'Für ND Sorting ------------------------------------------------- + 'Für ND Sorting ------------------------------------------------- Protected mDominated As Boolean 'Kennzeichnung ob Dominiert Protected mFront As Integer 'Nummer der Pareto Front - Protected mDistance As Double 'Für crowding distance + Protected mDistance As Double 'Für crowding distance #End Region 'Eigenschaften @@ -66,7 +66,7 @@ Public MustInherit Class Individuum ''' ''' Die OptParameter als Objekte ''' - Public MustOverride Property OptParameter() As BlueM.Opt.Common.OptParameter() + Public MustOverride Property OptParameter() As OptParameter() ''' ''' Die OptParameter als skalierte Werte @@ -87,12 +87,12 @@ Public MustInherit Class Individuum End Get Set(ByVal values As Double()) - 'Prüfung: Anzahl Parameter + 'Prüfung: Anzahl Parameter If (values.Length <> Individuum.mProblem.NumOptParams) Then - Throw New Exception("Falsche Anzahl Parameter übergeben!") + Throw New Exception("Falsche Anzahl Parameter übergeben!") End If - 'Prüfung: zwischen 0 und 1 + 'Prüfung: zwischen 0 und 1 For Each param As Double In values If (param < 0 Or param > 1) Then Throw New Exception("Skalierter Parameterwert muss zwischen 0 und 1 liegen!") @@ -127,9 +127,9 @@ Public MustInherit Class Individuum End Get Set(ByVal values As Double()) - 'Prüfung: Anzahl Parameter + 'Prüfung: Anzahl Parameter If (values.Length <> Individuum.mProblem.NumOptParams) Then - Throw New Exception("Falsche Anzahl Parameter übergeben!") + Throw New Exception("Falsche Anzahl Parameter übergeben!") End If Dim i As Integer @@ -166,7 +166,7 @@ Public MustInherit Class Individuum j = 0 For i = 0 To Individuum.mProblem.NumObjectives - 1 - 'Nur die Objective-Werte von PrimaryObjective-Funktionen zurückgeben! + 'Nur die Objective-Werte von PrimaryObjective-Funktionen zurückgeben! If (Individuum.mProblem.List_ObjectiveFunctions(i).isPrimObjective) Then Array(j) = Me.Objectives(i) j += 1 @@ -202,7 +202,7 @@ Public MustInherit Class Individuum End Property ''' - ''' Nummer der Pareto-Front, zu dem das Individuum gehört + ''' Nummer der Pareto-Front, zu dem das Individuum gehört ''' Public Property Front() As Integer Get @@ -226,9 +226,9 @@ Public MustInherit Class Individuum End Property ''' - ''' Zeigt an, ob das Individuum gültig ist + ''' Zeigt an, ob das Individuum gültig ist ''' - ''' wenn einer der Werte der Constraint-Funktionen negativ ist, ist das Individuum ungültig (Is_Feasible = False) + ''' wenn einer der Werte der Constraint-Funktionen negativ ist, ist das Individuum ungültig (Is_Feasible = False) Public ReadOnly Property Is_Feasible() As Boolean Get For i As Integer = 0 To Me.Constraints.GetUpperBound(0) @@ -294,7 +294,7 @@ Public MustInherit Class Individuum 'Nummer der Pareto Front Me.Front = 0 - 'Für crowding distance + 'Für crowding distance Me.Distance = 0 End Sub @@ -309,7 +309,7 @@ Public MustInherit Class Individuum ''' Erzeugt ein Array von neuen Individuen ''' ''' Individuumsklasse - ''' Länge des Arrays + ''' Länge des Arrays ''' beliebiger String ''' Array von Individuen ''' diff --git a/BlueM.Opt/Common/Individuum/Individuum_PES.vb b/BlueM.Opt/Common/Individuum/Individuum_PES.vb index c73ed5d0..e0fe67a0 100644 --- a/BlueM.Opt/Common/Individuum/Individuum_PES.vb +++ b/BlueM.Opt/Common/Individuum/Individuum_PES.vb @@ -23,7 +23,7 @@ Public Class Individuum_PES ''' ''' Die OptParameter als Objekte ''' - Public Overrides Property OptParameter() As BlueM.Opt.Common.OptParameter() + Public Overrides Property OptParameter() As OptParameter() Get Return Me.mOptParas End Get diff --git a/BlueM.Opt/Common/Log.vb b/BlueM.Opt/Common/Log.vb index 37eeb220..4c0b3640 100644 --- a/BlueM.Opt/Common/Log.vb +++ b/BlueM.Opt/Common/Log.vb @@ -1,4 +1,4 @@ -'BlueM.Opt +'BlueM.Opt 'Copyright (C) BlueM Dev Group 'Website: ' @@ -15,8 +15,6 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.IO -Imports System.Net.Sockets ''' ''' The log ''' @@ -69,7 +67,7 @@ Public Module Log Public Sub AddMessage(level As levels, msg As String) 'format message - msg = $"{DateTime.Now:dd.MM.yyyy HH:mm:ss} {level.ToString.ToUpper()}: {msg}{eol}" + msg = $"{DateTime.Now:dd.MM.yyyy HH:mm:ss} {level.ToString.ToUpper()}: {msg}{Constants.eol}" 'store _Log &= msg @@ -79,7 +77,7 @@ Public Module Log Try 'use a lock to ensure only one thread writes to the file at a time SyncLock locker - Using writer As New StreamWriter(_File, True) + Using writer As New IO.StreamWriter(_File, True) writer.WriteLine(msg) End Using End SyncLock diff --git a/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb b/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb index 96b22692..273b59cd 100644 --- a/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb +++ b/BlueM.Opt/Common/ObjectiveFunctions/ObjectiveFunction.vb @@ -15,8 +15,6 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.Globalization -Imports BlueM ''' ''' Klasse für die Definition von Objective Funktionen diff --git a/BlueM.Opt/Common/OptParameter.vb b/BlueM.Opt/Common/OptParameter.vb index 2531e4df..6b41e78b 100644 --- a/BlueM.Opt/Common/OptParameter.vb +++ b/BlueM.Opt/Common/OptParameter.vb @@ -49,7 +49,7 @@ Public Class OptParameter Public C As Double 'Beziehung - Public Beziehung As Common.Constants.Relationship + Public Beziehung As Constants.Relationship #End Region 'Eigenschaften @@ -118,7 +118,7 @@ Public Class OptParameter 'Konvertiert eine Liste von OptParametern in ein Array von Doubles (Xn) '********************************************************************** - Public Shared Function Get_OptParas_Xn(ByVal OptParameter() As BlueM.Opt.Common.OptParameter) As Double() + Public Shared Function Get_OptParas_Xn(ByVal OptParameter() As OptParameter) As Double() Dim i As Integer Dim Xn() As Double diff --git a/BlueM.Opt/Common/Problem.vb b/BlueM.Opt/Common/Problem.vb index 9dddd894..bac1b06f 100644 --- a/BlueM.Opt/Common/Problem.vb +++ b/BlueM.Opt/Common/Problem.vb @@ -15,8 +15,6 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.IO -Imports BlueM ''' ''' Klasse Problem @@ -129,13 +127,13 @@ Public Class Problem ''' Optimierungsmodus ''' ''' Single-Objective oder Multi-Objective - Public ReadOnly Property Modus() As BlueM.Opt.Common.Constants.EVO_MODE + Public ReadOnly Property Modus() As Constants.EVO_MODE Get Select Case Me.NumPrimObjective Case 1 - Return EVO_MODE.Single_Objective + Return Constants.EVO_MODE.Single_Objective Case Is > 1 - Return EVO_MODE.Multi_Objective + Return Constants.EVO_MODE.Multi_Objective Case Else Throw New Exception("No primary objective functions are defined!") End Select @@ -215,21 +213,21 @@ Public Class Problem Public ReadOnly Property Description() As String Get Dim msg As String - msg = $"Objective Functions ({Me.NumPrimObjective} primary, {Me.NumSecObjectives} secondary):" & eol + msg = $"Objective Functions ({Me.NumPrimObjective} primary, {Me.NumSecObjectives} secondary):" & Constants.eol For Each obj As ObjectiveFunction In Me.List_ObjectiveFunctions - msg &= "* " & obj.Description & eol + msg &= "* " & obj.Description & Constants.eol Next - msg &= $"Optimization parameters ({Me.NumOptParams}):" & eol + msg &= $"Optimization parameters ({Me.NumOptParams}):" & Constants.eol For Each optparam As OptParameter In Me.List_OptParameter - msg &= "* " & optparam.Bezeichnung & eol + msg &= "* " & optparam.Bezeichnung & Constants.eol Next - msg &= $"Model parameters ({Me.NumModelParams}):" & eol + msg &= $"Model parameters ({Me.NumModelParams}):" & Constants.eol For Each modparam As Struct_ModellParameter In Me.List_ModellParameter - msg &= "* " & modparam.Bezeichnung & eol + msg &= "* " & modparam.Bezeichnung & Constants.eol Next - msg &= $"Constraints ({Me.NumConstraints}):" & eol + msg &= $"Constraints ({Me.NumConstraints}):" & Constants.eol For Each constraint As Constraintfunction In Me.List_Constraintfunctions - msg &= "* " & constraint.Bezeichnung & eol + msg &= "* " & constraint.Bezeichnung & Constants.eol Next Return msg End Get @@ -298,8 +296,8 @@ Public Class Problem Dim Datei As String = IO.Path.Combine(Me.mWorkDir, Me.Datensatz & "." & FILEEXT_OPT) - Dim FiStr As New FileStream(Datei, FileMode.Open, IO.FileAccess.ReadWrite) - Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New IO.FileStream(Datei, IO.FileMode.Open, IO.FileAccess.ReadWrite) + Dim StrRead As New IO.StreamReader(FiStr, Text.Encoding.GetEncoding("iso8859-1")) Dim Zeile As String Dim AnzParam As Integer = 0 @@ -316,7 +314,7 @@ Public Class Problem ReDim List_OptParameter(AnzParam - 1) 'Zurück zum Dateianfang und lesen - FiStr.Seek(0, SeekOrigin.Begin) + FiStr.Seek(0, IO.SeekOrigin.Begin) Dim array() As String Dim Bez_str As String = "" @@ -327,19 +325,19 @@ Public Class Problem Continue Do End If 'OptParameter instanzieren - List_OptParameter(i) = New BlueM.Opt.Common.OptParameter() + List_OptParameter(i) = New OptParameter() array = Zeile.Split("|") 'Werte zuweisen List_OptParameter(i).Bezeichnung = array(1).Trim() List_OptParameter(i).Einheit = array(2).Trim() - List_OptParameter(i).StartWert = Convert.ToDouble(array(3).Trim(), Common.Provider.FortranProvider) - List_OptParameter(i).Min = Convert.ToDouble(array(4).Trim(), Common.Provider.FortranProvider) - List_OptParameter(i).Max = Convert.ToDouble(array(5).Trim(), Common.Provider.FortranProvider) + List_OptParameter(i).StartWert = Convert.ToDouble(array(3).Trim(), Provider.FortranProvider) + List_OptParameter(i).Min = Convert.ToDouble(array(4).Trim(), Provider.FortranProvider) + List_OptParameter(i).Max = Convert.ToDouble(array(5).Trim(), Provider.FortranProvider) 'liegt eine Beziehung vor? If (i > 0 And array.GetUpperBound(0) > 6) Then If Not array(6).Trim() = "" Then - Me.List_OptParameter(i).Beziehung = Common.Constants.getRelationship(array(6).Trim()) + Me.List_OptParameter(i).Beziehung = Constants.getRelationship(array(6).Trim()) End If End If @@ -366,8 +364,8 @@ Public Class Problem Dim Datei As String = IO.Path.Combine(Me.mWorkDir, Me.Datensatz & "." & FILEEXT_MOD) - Dim FiStr As New FileStream(Datei, FileMode.Open, IO.FileAccess.ReadWrite) - Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New IO.FileStream(Datei, IO.FileMode.Open, IO.FileAccess.ReadWrite) + Dim StrRead As New IO.StreamReader(FiStr, Text.Encoding.GetEncoding("iso8859-1")) Dim Zeile As String Dim AnzParam As Integer = 0 @@ -384,7 +382,7 @@ Public Class Problem ReDim Me.List_ModellParameter(AnzParam - 1) 'Zurück zum Dateianfang und lesen - FiStr.Seek(0, SeekOrigin.Begin) + FiStr.Seek(0, IO.SeekOrigin.Begin) Dim array() As String Dim i As Integer = 0 @@ -405,7 +403,7 @@ Public Class Problem .ZeileNr = Convert.ToInt16(array(6).Trim()) .SpVon = If(array(7).Trim() <> "", Convert.ToInt16(array(7).Trim()), 0) .SpBis = If(array(8).Trim() <> "", Convert.ToInt16(array(8).Trim()), 0) - .Faktor = Convert.ToDouble(array(9).Trim(), Common.Provider.FortranProvider) + .Faktor = Convert.ToDouble(array(9).Trim(), Provider.FortranProvider) End With i += 1 Loop Until StrRead.Peek() = -1 @@ -435,11 +433,11 @@ Public Class Problem Dim filepath As String = IO.Path.Combine(Me.mWorkDir, Me.Datensatz & "." & FILEEXT_OBF) 'Open the file - Dim FiStr As New FileStream(filepath, FileMode.Open, IO.FileAccess.Read) - Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New IO.FileStream(filepath, IO.FileMode.Open, IO.FileAccess.Read) + Dim StrRead As New IO.StreamReader(FiStr, Text.Encoding.GetEncoding("iso8859-1")) ReDim Me.List_ObjectiveFunctions(-1) - Dim currentObjectiveType As Common.ObjectiveFunction.ObjectiveType + Dim currentObjectiveType As ObjectiveFunction.ObjectiveType Try @@ -484,7 +482,7 @@ Public Class Problem End If 'ObjectiveFunction instanzieren - Dim Objective_Series As New Common.ObjectiveFunction_Series() + Dim Objective_Series As New ObjectiveFunction_Series() 'Gemeinsame Spalten einlesen Call Me.Read_OBF_CommonColumns(Objective_Series, Zeile) @@ -509,7 +507,7 @@ Public Class Problem .RefSeriesFile = WerteArray(12).Trim() If (WerteArray(13).Trim() <> "") Then .hasCurrentValue = True - .CurrentValue = Convert.ToDouble(WerteArray(13).Trim(), Common.Provider.FortranProvider) + .CurrentValue = Convert.ToDouble(WerteArray(13).Trim(), Provider.FortranProvider) 'Reverse the sign for objective functions that should be maximized (#198) If .Direction = EVO_DIRECTION.Maximization Then .CurrentValue = .CurrentValue * -1 @@ -539,7 +537,7 @@ Public Class Problem End If 'ObjectiveFunction instanzieren - Dim Objective_ValueFromSeries As New Common.ObjectiveFunction_ValueFromSeries() + Dim Objective_ValueFromSeries As New ObjectiveFunction_ValueFromSeries() 'Gemeinsame Spalten einlesen Call Me.Read_OBF_CommonColumns(Objective_ValueFromSeries, Zeile) @@ -562,11 +560,11 @@ Public Class Problem End If .ValueFunction = WerteArray(11).Trim() If (WerteArray(12).Trim() <> "") Then - .RefValue = Convert.ToDouble(WerteArray(12).Trim(), Common.Provider.FortranProvider) + .RefValue = Convert.ToDouble(WerteArray(12).Trim(), Provider.FortranProvider) End If If (WerteArray(13).Trim() <> "") Then .hasCurrentValue = True - .CurrentValue = Convert.ToDouble(WerteArray(13).Trim(), Common.Provider.FortranProvider) + .CurrentValue = Convert.ToDouble(WerteArray(13).Trim(), Provider.FortranProvider) 'Reverse the sign for objective functions that should be maximized (#198) If .Direction = EVO_DIRECTION.Maximization Then .CurrentValue = .CurrentValue * -1 @@ -592,7 +590,7 @@ Public Class Problem End If 'ObjectiveFunction instanzieren - Dim Objective_Aggregate As New Common.ObjectiveFunction_Aggregate() + Dim Objective_Aggregate As New ObjectiveFunction_Aggregate() 'Spalten einlesen With Objective_Aggregate @@ -604,13 +602,13 @@ Public Class Problem .Description = WerteArray(2).Trim() .Group = WerteArray(3).Trim() If (WerteArray(4).Trim() = "+") Then - .Direction = Common.EVO_DIRECTION.Maximization + .Direction = Constants.EVO_DIRECTION.Maximization Else - .Direction = Common.EVO_DIRECTION.Minimization + .Direction = Constants.EVO_DIRECTION.Minimization End If If (WerteArray(5).Trim() <> "") Then .hasCurrentValue = True - .CurrentValue = Convert.ToDouble(WerteArray(5).Trim(), Common.Provider.FortranProvider) + .CurrentValue = Convert.ToDouble(WerteArray(5).Trim(), Provider.FortranProvider) 'Reverse the sign for objective functions that should be maximized (#198) If .Direction = EVO_DIRECTION.Maximization Then .CurrentValue = .CurrentValue * -1 @@ -655,7 +653,7 @@ Public Class Problem ''' objective function in der die Werte abgelegt werden sollen ''' Zeile der OBF-Datei ''' - Private Sub Read_OBF_CommonColumns(ByRef objective As BlueM.Opt.Common.ObjectiveFunction, ByVal zeile As String) + Private Sub Read_OBF_CommonColumns(ByRef objective As ObjectiveFunction, ByVal zeile As String) Dim WerteArray() As String @@ -670,9 +668,9 @@ Public Class Problem .Description = WerteArray(2).Trim() .Group = WerteArray(3).Trim() If (WerteArray(4).Trim() = "+") Then - .Direction = Common.EVO_DIRECTION.Maximization + .Direction = Constants.EVO_DIRECTION.Maximization Else - .Direction = Common.EVO_DIRECTION.Minimization + .Direction = Constants.EVO_DIRECTION.Minimization End If If (WerteArray(5).Trim() = "+") Then @@ -710,7 +708,7 @@ Public Class Problem refSeries = fileInstance.getTimeSeries(refName) End If Catch ex As Exception - Throw New Exception($"Unable to read reference series '{filePath}'!{eol}Error: {ex.Message}", ex) + Throw New Exception($"Unable to read reference series '{filePath}'!{Constants.eol}Error: {ex.Message}", ex) End Try 'Zeitraum der Referenzreihe überprüfen @@ -758,10 +756,10 @@ Public Class Problem Dim Datei As String = IO.Path.Combine(Me.mWorkDir, Me.Datensatz & "." & FILEEXT_CON) - If (File.Exists(Datei)) Then + If (IO.File.Exists(Datei)) Then - Dim FiStr As New FileStream(Datei, FileMode.Open, IO.FileAccess.Read) - Dim StrRead As New StreamReader(FiStr, System.Text.Encoding.GetEncoding("iso8859-1")) + Dim FiStr As New IO.FileStream(Datei, IO.FileMode.Open, IO.FileAccess.Read) + Dim StrRead As New IO.StreamReader(FiStr, Text.Encoding.GetEncoding("iso8859-1")) i = 0 Do @@ -777,7 +775,7 @@ Public Class Problem End If 'Neues Constraint anlegen ReDim Preserve Me.List_Constraintfunctions(i) - Me.List_Constraintfunctions(i) = New Common.Constraintfunction() + Me.List_Constraintfunctions(i) = New Constraintfunction() 'Werte zuweisen With Me.List_Constraintfunctions(i) .Bezeichnung = WerteArray(1).Trim() @@ -787,7 +785,7 @@ Public Class Problem .GrenzPos = WerteArray(5).Trim() .WertFunktion = WerteArray(6).Trim() If (WerteArray(7).Trim() <> "") Then - .GrenzWert = Convert.ToDouble(WerteArray(7).Trim(), Common.Provider.FortranProvider) + .GrenzWert = Convert.ToDouble(WerteArray(7).Trim(), Provider.FortranProvider) End If .GrenzGr = WerteArray(8).Trim() .GrenzReiheDatei = WerteArray(9).Trim() @@ -995,13 +993,13 @@ Public Class Problem ''' ''' ''' Das Individuum erhält die ID 1 - Public Function getIndividuumStart() As BlueM.Opt.Common.Individuum + Public Function getIndividuumStart() As Individuum - Dim startind As BlueM.Opt.Common.Individuum + Dim startind As Individuum Dim i As Integer - startind = New BlueM.Opt.Common.Individuum_PES("start", 1) + startind = New Individuum_PES("start", 1) 'Startwerte der OptParameter setzen For i = 0 To Me.NumOptParams - 1 startind.OptParameter(i).RWert = Me.List_OptParameter(i).StartWert diff --git a/BlueM.Opt/Common/Provider.vb b/BlueM.Opt/Common/Provider.vb index de091e8c..30c6c6bc 100644 --- a/BlueM.Opt/Common/Provider.vb +++ b/BlueM.Opt/Common/Provider.vb @@ -15,15 +15,14 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.Globalization Public Module Provider - Public ReadOnly Property FortranProvider() As NumberFormatInfo + Public ReadOnly Property FortranProvider() As Globalization.NumberFormatInfo Get 'Fortran Provider einrichten '--------------------------- - Dim provider As New NumberFormatInfo With { + Dim provider As New Globalization.NumberFormatInfo With { .NumberDecimalSeparator = ".", .NumberGroupSeparator = "", .NumberGroupSizes = New Integer() {3} diff --git a/BlueM.Opt/Common/Settings/Settings.vb b/BlueM.Opt/Common/Settings/Settings.vb index e308fd8b..4f04cd20 100644 --- a/BlueM.Opt/Common/Settings/Settings.vb +++ b/BlueM.Opt/Common/Settings/Settings.vb @@ -22,7 +22,7 @@ Imports System.Xml.Serialization ''' Public Class Settings - 'Klasse für generelle Settings + 'Klasse für generelle Settings '----------------------------- Public Class Settings_General Private mUseMultithreading As Boolean @@ -115,7 +115,7 @@ Public Class Settings Dim writer As IO.StreamWriter Dim serializer As XmlSerializer - 'Streamwriter öffnen + 'Streamwriter öffnen writer = New IO.StreamWriter(path) serializer = New XmlSerializer(GetType(Settings), New XmlRootAttribute("Settings")) @@ -132,18 +132,18 @@ Public Class Settings ''' Public Shared Function Load(path As String) As Settings - Dim serializer As New XmlSerializer(GetType(Common.Settings)) + Dim serializer As New XmlSerializer(GetType(Settings)) Dim settings As Settings AddHandler serializer.UnknownElement, AddressOf serializerUnknownElement AddHandler serializer.UnknownAttribute, AddressOf serializerUnknownAttribute - 'Filestream öffnen + 'Filestream öffnen Dim fs As New IO.FileStream(path, IO.FileMode.Open) 'Deserialisieren 'TODO: XmlDeserializationEvents ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/fxref_system.xml/html/e0657840-5678-bf57-6e7a-1bd93b2b27d1.htm - settings = CType(serializer.Deserialize(fs), Common.Settings) + settings = CType(serializer.Deserialize(fs), Settings) fs.Close() diff --git a/BlueM.Opt/Diagramm/CustomPlot.vb b/BlueM.Opt/Diagramm/CustomPlot.vb index 844beb6f..814e5ffe 100644 --- a/BlueM.Opt/Diagramm/CustomPlot.vb +++ b/BlueM.Opt/Diagramm/CustomPlot.vb @@ -15,6 +15,7 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports BlueM.Opt.Common ''' ''' Form for displaying a custom plot ''' @@ -22,7 +23,7 @@ Public Class CustomPlot Private _isInitializing As Boolean - Private _problem As Common.Problem + Private _problem As Problem Private _optresult As OptResult.OptResult Private _series_StartValue As Steema.TeeChart.Styles.Points @@ -34,7 +35,7 @@ Public Class CustomPlot ''' Is raised when a solution is selected ''' ''' the selected individual - Public Event pointSelected(ByVal ind As Common.Individuum) + Public Event pointSelected(ByVal ind As Individuum) ''' ''' Index of the currently set optimization parameter @@ -61,7 +62,7 @@ Public Class CustomPlot ''' ''' the optimization problem definition ''' the optresult data to plot - Public Sub New(problem As Common.Problem, optresult As OptResult.OptResult) + Public Sub New(problem As Problem, optresult As OptResult.OptResult) ' This call is required by the designer. InitializeComponent() @@ -75,13 +76,13 @@ Public Class CustomPlot ' populate combo boxes Me.ComboBox_OptParameters.Items.Clear() - For Each param As Common.OptParameter In Me._problem.List_OptParameter + For Each param As OptParameter In Me._problem.List_OptParameter Me.ComboBox_OptParameters.Items.Add(param) Next Me.ComboBox_OptParameters.SelectedIndex = 0 Me.ComboBox_ObjectiveFunctions.Items.Clear() - For Each objective As Common.ObjectiveFunction In Me._problem.List_ObjectiveFunctions + For Each objective As ObjectiveFunction In Me._problem.List_ObjectiveFunctions Me.ComboBox_ObjectiveFunctions.Items.Add(objective) Next Me.ComboBox_ObjectiveFunctions.SelectedIndex = 0 @@ -98,7 +99,7 @@ Public Class CustomPlot 'instantiate series Me._series_Population = Me.Diag.getSeriesPoint("Population", "Orange") - If Me._problem.Method <> Common.METH_SENSIPLOT Then + If Me._problem.Method <> Constants.METH_SENSIPLOT Then Me._series_StartValue = Me.Diag.getSeriesPoint("Start value", "Yellow", Steema.TeeChart.Styles.PointerStyles.Circle, 4) Me._series_SekPop = Me.Diag.getSeriesPoint("Secondary population", "Green") End If @@ -127,8 +128,8 @@ Public Class CustomPlot Private Sub UpdateChart() 'get selection from comboboxes - Dim param As Common.OptParameter = Me.ComboBox_OptParameters.SelectedItem - Dim objective As Common.ObjectiveFunction = Me.ComboBox_ObjectiveFunctions.SelectedItem + Dim param As OptParameter = Me.ComboBox_OptParameters.SelectedItem + Dim objective As ObjectiveFunction = Me.ComboBox_ObjectiveFunctions.SelectedItem 'set chart title Me.Diag.Chart.Header.Text = $"{param.Bezeichnung} vs. {objective.Description}" @@ -164,9 +165,9 @@ Public Class CustomPlot ''' Private Sub UpdatePlot() - Dim ind As Common.Individuum + Dim ind As Individuum - If Me._problem.Method <> Common.METH_SENSIPLOT Then + If Me._problem.Method <> Constants.METH_SENSIPLOT Then 'plot start value _series_StartValue.Clear() ind = _optresult.getSolution(1) @@ -179,7 +180,7 @@ Public Class CustomPlot _series_Population.Add(ind.OptParameter(iParameter).RWert, ind.Objectives(iObjective) * _problem.List_ObjectiveFunctions(iObjective).Direction, ind.ID.ToString) Next - If Me._problem.Method <> Common.METH_SENSIPLOT Then + If Me._problem.Method <> Constants.METH_SENSIPLOT Then 'plot secondary population _series_SekPop.Clear() For Each ind In Me._optresult.getSekPop @@ -206,7 +207,7 @@ Public Class CustomPlot ''' Shows a selected solution in the plot ''' ''' the selected individual - Public Sub showSelectedSolution(ind As Common.Individuum) + Public Sub showSelectedSolution(ind As Individuum) Me._series_Selected.Add(ind.OptParameter(iParameter).RWert, ind.Objectives(iObjective) * _problem.List_ObjectiveFunctions(iObjective).Direction, ind.ID.ToString) End Sub @@ -217,7 +218,7 @@ Public Class CustomPlot Private Sub seriesClick(ByVal sender As Object, ByVal s As Steema.TeeChart.Styles.Series, ByVal valueIndex As Integer, ByVal e As System.Windows.Forms.MouseEventArgs) Dim indID_clicked As Integer - Dim ind As Common.Individuum + Dim ind As Individuum Try 'get solution ID from series label @@ -230,8 +231,8 @@ Public Class CustomPlot RaiseEvent pointSelected(ind) Catch ex As Exception - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) - MsgBox($"Solution is not selectable!{Common.Constants.eol}{ex.Message}", MsgBoxStyle.Information) + Log.AddMessage(Log.levels.error, ex.Message) + MsgBox($"Solution is not selectable!{Constants.eol}{ex.Message}", MsgBoxStyle.Information) End Try End Sub diff --git a/BlueM.Opt/Diagramm/Diagramm.vb b/BlueM.Opt/Diagramm/Diagramm.vb index 4ae457f6..f8b401ec 100644 --- a/BlueM.Opt/Diagramm/Diagramm.vb +++ b/BlueM.Opt/Diagramm/Diagramm.vb @@ -16,6 +16,7 @@ 'along with this program. If not, see . ' Imports System.Drawing +Imports BlueM.Opt.Common ''' ''' Klasse stellt Diagrammfunktionalitäten zur Verfügung @@ -63,7 +64,7 @@ Public Class Diagramm Try Call Steema.TeeChart.Editor.Show(Me) Catch ex As Exception - MsgBox("Fehler in TeeChart!" & BlueM.Opt.Common.eol & ex.Message, MsgBoxStyle.Critical) + MsgBox("Fehler in TeeChart!" & Constants.eol & ex.Message, MsgBoxStyle.Critical) End Try End Sub diff --git a/BlueM.Opt/Diagramm/Hauptdiagramm.vb b/BlueM.Opt/Diagramm/Hauptdiagramm.vb index cbd63a5d..c4b0640d 100644 --- a/BlueM.Opt/Diagramm/Hauptdiagramm.vb +++ b/BlueM.Opt/Diagramm/Hauptdiagramm.vb @@ -15,6 +15,9 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports System.Drawing +Imports BlueM.Opt.Common + ''' ''' Diagramm zeigt Lösungen (Individuen) im Lösungsraum an ''' @@ -22,10 +25,10 @@ Public Class Hauptdiagramm Inherits Diagramm 'lokale Referenz auf Settings - Private mSettings As BlueM.Opt.Common.Settings + Private mSettings As Settings 'Das Problem - Private mProblem As BlueM.Opt.Common.Problem + Private mProblem As Problem 'Zuordnung zwischen Zielfunktionen und Achsen Public ZielIndexX, ZielIndexY, ZielIndexZ As Integer @@ -35,7 +38,7 @@ Public Class Hauptdiagramm 'Diagramm Initialisierung (Titel und Achsen) '******************************************* - Public Sub DiagInitialise(ByVal Titel As String, ByVal Achsen As Collection, ByRef prob As BlueM.Opt.Common.Problem) + Public Sub DiagInitialise(ByVal Titel As String, ByVal Achsen As Collection, ByRef prob As Problem) Dim xachse, yachse, zachse As Diagramm.Achse @@ -108,7 +111,7 @@ Public Class Hauptdiagramm .Chart.Aspect.Orthogonal = False .Chart.Aspect.Perspective = 62 .Chart.Aspect.Rotation = 329 - .Chart.Aspect.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality + .Chart.Aspect.SmoothingMode = Drawing2D.SmoothingMode.HighQuality .Chart.Aspect.VertOffset = -20 .Chart.Aspect.Zoom = 66 @@ -127,7 +130,7 @@ Public Class Hauptdiagramm ''' Settings setzen ''' ''' Settings - Public Sub setSettings(ByRef settings As BlueM.Opt.Common.Settings) + Public Sub setSettings(ByRef settings As Settings) 'Settings übergeben Me.mSettings = settings @@ -139,14 +142,14 @@ Public Class Hauptdiagramm 'Lösung zeichnen '*************** - Public Sub ZeichneIndividuum(ByVal ind As Common.Individuum, ByVal runde As Integer, ByVal pop As Integer, ByVal gen As Integer, ByVal nachf As Integer, _ - ByVal Farbe As System.Drawing.Color, Optional ByVal ColEach As Boolean = False) + Public Sub ZeichneIndividuum(ByVal ind As Individuum, ByVal runde As Integer, ByVal pop As Integer, ByVal gen As Integer, ByVal nachf As Integer, + ByVal Farbe As Color, Optional ByVal ColEach As Boolean = False) Dim serie As Steema.TeeChart.Styles.Series 'Ungültige Individuen immer Grau anzeigen! If (Not ind.Is_Feasible) Then - Farbe = System.Drawing.Color.Gray + Farbe = Color.Gray End If If (Me.mProblem.NumPrimObjective = 1) Then @@ -158,7 +161,7 @@ Public Class Hauptdiagramm serie = Me.getSeriesPoint($"Population {pop + 1}", , , , ColEach) End If Select Case Me.mProblem.Method - Case BlueM.Opt.Common.METH_PES + Case METH_PES Call serie.Add(runde * Me.mSettings.PES.N_Gen * Me.mSettings.PES.N_Nachf + gen * Me.mSettings.PES.N_Nachf + nachf, ind.PrimObjectives(0) * Me.mProblem.List_PrimObjectiveFunctions(0).Direction, ind.ID.ToString(), Farbe) Case Else Throw New Exception("Drawing function not defined for this single objective method!") @@ -194,7 +197,7 @@ Public Class Hauptdiagramm ''' Start-Individuum zeichnen ''' ''' das Individuum, das mit den Startwerten evaluiert wurde - Public Sub ZeichneStartWert(ByVal ind As Common.Individuum) + Public Sub ZeichneStartWert(ByVal ind As Individuum) Dim farbe As String Dim serie As Steema.TeeChart.Styles.Series @@ -233,7 +236,7 @@ Public Class Hauptdiagramm 'Population zeichnen '******************* - Public Sub ZeichneSekPopulation(ByVal pop() As Common.Individuum) + Public Sub ZeichneSekPopulation(ByVal pop() As Individuum) Dim i As Integer Dim serie, serie_inv As Steema.TeeChart.Styles.Series @@ -241,7 +244,7 @@ Public Class Hauptdiagramm Dim values(,) As Double 'Population in Array von Penalties transformieren - values = Common.Individuum.Get_All_Penalty_of_Array(pop) + values = Individuum.Get_All_Penalty_of_Array(pop) If (Me.mProblem.NumPrimObjective = 2) Then '2 Zielfunktionen @@ -328,7 +331,7 @@ Public Class Hauptdiagramm If (Me.ZielIndexX <> -1) Then If (Me.mProblem.List_ObjectiveFunctions(Me.ZielIndexX).hasCurrentValue) Then colorline1 = New Steema.TeeChart.Tools.ColorLine(Me.Chart) - colorline1.Pen.Color = System.Drawing.Color.Red + colorline1.Pen.Color = Color.Red colorline1.AllowDrag = False colorline1.Draw3D = True colorline1.Axis = Me.Axes.Bottom @@ -340,7 +343,7 @@ Public Class Hauptdiagramm If (Me.ZielIndexY <> -1) Then If (Me.mProblem.List_ObjectiveFunctions(Me.ZielIndexY).hasCurrentValue) Then colorline1 = New Steema.TeeChart.Tools.ColorLine(Me.Chart) - colorline1.Pen.Color = System.Drawing.Color.Red + colorline1.Pen.Color = Color.Red colorline1.AllowDrag = False colorline1.Draw3D = True colorline1.Axis = Me.Axes.Left @@ -354,7 +357,7 @@ Public Class Hauptdiagramm 'TODO: ColorLine auf Depth-Axis geht nicht! (#203) MsgBox($"The current value on the Z-axis ({Me.mProblem.List_ObjectiveFunctions(Me.ZielIndexZ).Description}) can not be displayed (see #203)", MsgBoxStyle.Information) 'colorline1 = New Steema.TeeChart.Tools.ColorLine(Me.Chart) - 'colorline1.Pen.Color = System.Drawing.Color.Red + 'colorline1.Pen.Color = Color.Red 'colorline1.AllowDrag = False 'colorline1.Draw3D = True 'colorline1.Axis = Me.Axes.Depth @@ -372,7 +375,7 @@ Public Class Hauptdiagramm ''' Draw a selected solution in the diagram ''' ''' the solution to draw - Public Sub DrawSelectedSolution(ind As Common.Individuum) + Public Sub DrawSelectedSolution(ind As Individuum) Dim x, y, z As Double @@ -384,12 +387,12 @@ Public Class Hauptdiagramm serie.Marks.Style = Steema.TeeChart.Styles.MarksStyles.Label serie.Marks.Transparency = 50 serie.Marks.ArrowLength = 10 - If Me.mProblem.Method = Common.METH_SENSIPLOT Then + If Me.mProblem.Method = Constants.METH_SENSIPLOT Then 'x axis is optparameter, y axis is objective function x = ind.OptParameter(Me.mSettings.SensiPlot.Selected_OptParameters(0)).RWert y = ind.Objectives(Me.mSettings.SensiPlot.Selected_Objective) * Me.mProblem.List_ObjectiveFunctions(Me.mSettings.SensiPlot.Selected_Objective).Direction Else - If Me.mProblem.Modus = Common.Constants.EVO_MODE.Single_Objective Then + If Me.mProblem.Modus = Constants.EVO_MODE.Single_Objective Then 'x axis is simulation ID (single objective) x = ind.ID y = ind.Objectives(Me.ZielIndexY) * Me.mProblem.List_ObjectiveFunctions(Me.ZielIndexY).Direction @@ -408,7 +411,7 @@ Public Class Hauptdiagramm serie3D.Marks.Style = Steema.TeeChart.Styles.MarksStyles.Label serie3D.Marks.Transparency = 50 serie3D.Marks.ArrowLength = 10 - If Me.mProblem.Method = Common.METH_SENSIPLOT Then + If Me.mProblem.Method = Constants.METH_SENSIPLOT Then 'x and z axis are optparameters, y axis is objective function x = ind.OptParameter(Me.mSettings.SensiPlot.Selected_OptParameters(0)).RWert z = ind.OptParameter(Me.mSettings.SensiPlot.Selected_OptParameters(1)).RWert diff --git a/BlueM.Opt/Diagramm/Monitor.vb b/BlueM.Opt/Diagramm/Monitor.vb index 3c25c8bc..1803aee5 100644 --- a/BlueM.Opt/Diagramm/Monitor.vb +++ b/BlueM.Opt/Diagramm/Monitor.vb @@ -15,7 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.IO +Imports System.Drawing +Imports System.Windows.Forms ''' ''' Der Monitor stellt ein Diagramm und ein Textfeld (Log) zur Verfügung @@ -73,7 +74,7 @@ Partial Public Class Monitor ''' der Text Public Sub LogAppend(ByVal text As String) Call Me.LogAppendText(text) - System.Windows.Forms.Application.DoEvents() + Application.DoEvents() End Sub ''' @@ -122,14 +123,14 @@ Partial Public Class Monitor .Chart.Axes.Right.Ticks.Color = Drawing.Color.Black .Chart.Axes.Left.Ticks.Width = 1 .Chart.Axes.Right.Ticks.Width = 1 - .BackColor = System.Drawing.Color.Transparent - .Cursor = System.Windows.Forms.Cursors.Default + .BackColor = Color.Transparent + .Cursor = Cursors.Default .Header.Visible = False '.Legend.Visible = False .Legend.Alignment = Steema.TeeChart.LegendAlignments.Bottom .Legend.LegendStyle = Steema.TeeChart.LegendStyles.Series .Location = New System.Drawing.Point(0, 0) - .Panel.Brush.Color = System.Drawing.Color.Transparent + .Panel.Brush.Color = Color.Transparent .Panel.Color = Drawing.Color.White .Panel.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None .Panel.Bevel.Inner = Steema.TeeChart.Drawing.BevelStyles.None diff --git a/BlueM.Opt/Diagramm/Scatterplot.vb b/BlueM.Opt/Diagramm/Scatterplot.vb index 7cddc604..30ca4aee 100644 --- a/BlueM.Opt/Diagramm/Scatterplot.vb +++ b/BlueM.Opt/Diagramm/Scatterplot.vb @@ -17,6 +17,7 @@ ' Imports System.Windows.Forms Imports System.Drawing +Imports BlueM.Opt.Common ''' ''' Zeigt den Lösungs- oder Entscheidungsraum in Form einer Scatterplot-Matrix an @@ -25,15 +26,15 @@ Partial Public Class Scatterplot Inherits System.Windows.Forms.Form 'Das Problem - Private mProblem As BlueM.Opt.Common.Problem + Private mProblem As Problem - Private Diags(,) As BlueM.Opt.Diagramm.Diagramm + Private Diags(,) As Diagramm Private NearestPointTools(,) As Steema.TeeChart.Tools.NearestPoint Private dimension As Integer - Private OptResult, OptResultRef As BlueM.Opt.OptResult.OptResult + Private OptResult, OptResultRef As OptResult.OptResult Private selectedIndices() As Integer Private ShowSekPopOnly, ShowStartValue, ShowIstWerte, ShowRefResult As Boolean - Private ShownSpace As BlueM.Opt.Common.SPACE + Private ShownSpace As SPACE Private ReadOnly Property HighlightingIsActive As Boolean Get @@ -46,7 +47,7 @@ Partial Public Class Scatterplot ''' ''' Das ausgewählte Individuum ''' wird von Form1.selectSolution() verarbeitet - Public Event pointSelected(ByVal ind As Common.Individuum) + Public Event pointSelected(ByVal ind As Individuum) ''' ''' Konstruktor @@ -54,7 +55,7 @@ Partial Public Class Scatterplot ''' Das Optimierungsproblem ''' Das Optimierungsergebnis ''' Ein Referenz-Optimierungsergebnis (darf Nothing sein) - Public Sub New(ByRef prob As BlueM.Opt.Common.Problem, ByVal optres As BlueM.Opt.OptResult.OptResult, ByVal optresref As BlueM.Opt.OptResult.OptResult) + Public Sub New(ByRef prob As Problem, ByVal optres As OptResult.OptResult, ByVal optresref As OptResult.OptResult) Dim Dialog As ScatterplotDialog Dim diagresult As DialogResult @@ -73,7 +74,7 @@ Partial Public Class Scatterplot 'Scatterplot-Dialog aufrufen Dim refResultExists As Boolean = Not IsNothing(Me.OptResultRef) - Dialog = New BlueM.Opt.Diagramm.ScatterplotDialog(Me.mProblem, refResultExists) + Dialog = New ScatterplotDialog(Me.mProblem, refResultExists) diagresult = Dialog.ShowDialog() If (diagresult = DialogResult.OK) Then @@ -85,7 +86,7 @@ Partial Public Class Scatterplot Me.ShowStartValue = Dialog.ShowStartValue Me.ShowIstWerte = Dialog.ShowIstWerte - If (Me.ShowRefResult And Me.ShownSpace = Common.SPACE.DecisionSpace) Then + If (Me.ShowRefResult And Me.ShownSpace = Constants.SPACE.DecisionSpace) Then If (Not Me.OptResultRef.holdsOptparameters) Then MsgBox("The comparison result was loaded without optimization parameters and can therefore not be displayed in the decision space!", MsgBoxStyle.Information, "Scatterplot matrix") Me.ShowRefResult = False @@ -114,18 +115,18 @@ Partial Public Class Scatterplot 'Diagramme zeichnen Select Case Me.ShownSpace - Case Common.SPACE.SolutionSpace + Case Constants.SPACE.SolutionSpace Me.Text &= " - Solution space" Call Me.draw_solutionspace() - Case Common.SPACE.DecisionSpace + Case Constants.SPACE.DecisionSpace Me.Text &= " - Decision space" Call Me.draw_decisionspace() End Select 'Bereits ausgewählte Lösungen anzeigen - For Each ind As Common.Individuum In Me.OptResult.getSelectedSolutions + For Each ind As Individuum In Me.OptResult.getSelectedSolutions Call Me.showSelectedSolution(ind) Next @@ -142,7 +143,7 @@ Partial Public Class Scatterplot Dim xAchse, yAchse As String Dim min() As Double Dim max() As Double - Dim ind As BlueM.Opt.Common.Individuum + Dim ind As Individuum Dim serie, serie_inv As Steema.TeeChart.Styles.Series Dim shape1 As Steema.TeeChart.Styles.Shape @@ -200,7 +201,7 @@ Partial Public Class Scatterplot For j = 0 To Me.dimension - 1 'Neues Diagramm erstellen - Me.Diags(i, j) = New BlueM.Opt.Diagramm.Diagramm() + Me.Diags(i, j) = New Diagramm() Me.matrix.Controls.Add(Me.Diags(i, j), i, j) With Me.Diags(i, j) @@ -294,7 +295,7 @@ Partial Public Class Scatterplot 'X-Werte If Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).hasCurrentValue Then - If Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction = Common.EVO_DIRECTION.Minimization Then + If Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction = Constants.EVO_DIRECTION.Minimization Then shape1.X0 = min(i) * 0.9 ^ (min(i) / Math.Abs(min(i))) shape1.X1 = Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).CurrentValue * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction Else @@ -307,7 +308,7 @@ Partial Public Class Scatterplot End If 'Y-Werte If Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).hasCurrentValue Then - If Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).Direction = Common.EVO_DIRECTION.Minimization Then + If Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).Direction = Constants.EVO_DIRECTION.Minimization Then shape1.Y0 = min(j) * 0.9 ^ (min(j) / Math.Abs(min(j))) shape1.Y1 = Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).CurrentValue * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).Direction Else @@ -501,7 +502,7 @@ Partial Public Class Scatterplot For j = 0 To Me.dimension - 1 'Neues Diagramm erstellen - Me.Diags(i, j) = New BlueM.Opt.Diagramm.Diagramm() + Me.Diags(i, j) = New Diagramm() Me.matrix.Controls.Add(Me.Diags(i, j), i, j) With Me.Diags(i, j) @@ -593,7 +594,7 @@ Partial Public Class Scatterplot '------------- serie = .getSeriesPoint($"{xAchse}, {yAchse}", "Orange", Steema.TeeChart.Styles.PointerStyles.Circle, 2) serie_inv = .getSeriesPoint($"{xAchse}, {yAchse} (invalid)", "Gray", Steema.TeeChart.Styles.PointerStyles.Circle, 2) - For Each ind As Common.Individuum In Me.OptResult.Solutions + For Each ind As Individuum In Me.OptResult.Solutions 'Constraintverletzung prüfen If (ind.Is_Feasible) Then 'gültige Lösung Zeichnen @@ -610,7 +611,7 @@ Partial Public Class Scatterplot 'Sekundäre Population '-------------------- serie = .getSeriesPoint($"{xAchse}, {yAchse} (sec pop)", "Green", Steema.TeeChart.Styles.PointerStyles.Circle, 2) - For Each ind As Common.Individuum In Me.OptResult.getSekPop() + For Each ind As Individuum In Me.OptResult.getSekPop() serie.Add(ind.OptParameter_RWerte(Me.selectedIndices(i)), ind.OptParameter_RWerte(Me.selectedIndices(j)), ind.ID.ToString()) Next If Me.ShowSekPopOnly Then @@ -622,7 +623,7 @@ Partial Public Class Scatterplot '=========================== If (Me.ShowRefResult) Then serie = .getSeriesPoint($"{xAchse}, {yAchse} (comparison result)", "Blue", Steema.TeeChart.Styles.PointerStyles.Circle, 2) - For Each ind As Common.Individuum In Me.OptResultRef.getSekPop() + For Each ind As Individuum In Me.OptResultRef.getSekPop() serie.Add(ind.OptParameter_RWerte(Me.selectedIndices(i)), ind.OptParameter_RWerte(Me.selectedIndices(j)), ind.ID & " (comparison result)") Next End If @@ -723,7 +724,7 @@ Partial Public Class Scatterplot Private Sub seriesClick(ByVal sender As Object, ByVal s As Steema.TeeChart.Styles.Series, ByVal valueIndex As Integer, ByVal e As System.Windows.Forms.MouseEventArgs) Dim indID_clicked As Integer - Dim ind As Common.Individuum + Dim ind As Individuum 'Punkt-Informationen bestimmen '----------------------------- @@ -743,8 +744,8 @@ Partial Public Class Scatterplot End If Catch ex As Exception - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) - MsgBox($"Solution is not selectable!{Common.Constants.eol}{ex.Message}", MsgBoxStyle.Information) + Log.AddMessage(Log.levels.error, ex.Message) + MsgBox($"Solution is not selectable!{Constants.eol}{ex.Message}", MsgBoxStyle.Information) End Try End Sub @@ -754,7 +755,7 @@ Partial Public Class Scatterplot ''' ''' the solution to highlight ''' - Private Sub showHighlightedSolution(ByVal ind As Common.Individuum) + Private Sub showHighlightedSolution(ByVal ind As Individuum) Dim serie As Steema.TeeChart.Styles.Points Dim i, j As Integer @@ -777,9 +778,9 @@ Partial Public Class Scatterplot 'plot the point Select Case Me.ShownSpace - Case Common.SPACE.SolutionSpace + Case Constants.SPACE.SolutionSpace serie.Add(ind.Objectives(Me.selectedIndices(i)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction, ind.Objectives(Me.selectedIndices(j)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).Direction, ind.ID.ToString()) - Case Common.SPACE.DecisionSpace + Case Constants.SPACE.DecisionSpace serie.Add(ind.OptParameter_RWerte(Me.selectedIndices(i)), ind.OptParameter_RWerte(Me.selectedIndices(j)), ind.ID.ToString()) End Select Next j @@ -792,7 +793,7 @@ Partial Public Class Scatterplot ''' ''' das ausgewählte Individuum ''' wird von Form1.selectSolution() aufgerufen - Public Sub showSelectedSolution(ByVal ind As Common.Individuum) + Public Sub showSelectedSolution(ByVal ind As Individuum) Dim serie As Steema.TeeChart.Styles.Series Dim i, j As Integer @@ -813,9 +814,9 @@ Partial Public Class Scatterplot serie = .getSeriesPoint("Selected solutions", "Red", Steema.TeeChart.Styles.PointerStyles.Circle, 3) Select Case Me.ShownSpace - Case Common.SPACE.SolutionSpace + Case Constants.SPACE.SolutionSpace serie.Add(ind.Objectives(Me.selectedIndices(i)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(i)).Direction, ind.Objectives(Me.selectedIndices(j)) * Me.mProblem.List_ObjectiveFunctions(Me.selectedIndices(j)).Direction, ind.ID.ToString()) - Case Common.SPACE.DecisionSpace + Case Constants.SPACE.DecisionSpace serie.Add(ind.OptParameter_RWerte(Me.selectedIndices(i)), ind.OptParameter_RWerte(Me.selectedIndices(j)), ind.ID.ToString()) End Select diff --git a/BlueM.Opt/Diagramm/ScatterplotDialog.vb b/BlueM.Opt/Diagramm/ScatterplotDialog.vb index 205db6a9..855f8341 100644 --- a/BlueM.Opt/Diagramm/ScatterplotDialog.vb +++ b/BlueM.Opt/Diagramm/ScatterplotDialog.vb @@ -16,19 +16,20 @@ 'along with this program. If not, see . ' Imports System.Windows.Forms +Imports BlueM.Opt.Common Public Class ScatterplotDialog - Private mProblem As BlueM.Opt.Common.Problem + Private mProblem As Problem Private isInitializing As Boolean Private RefResultExists As Boolean - Public ReadOnly Property selectedSpace() As BlueM.Opt.Common.SPACE + Public ReadOnly Property selectedSpace() As Constants.SPACE Get If (Me.RadioButton_SolutionSpace.Checked) Then - Return Common.SPACE.SolutionSpace + Return Constants.SPACE.SolutionSpace Else - Return Common.SPACE.DecisionSpace + Return Constants.SPACE.DecisionSpace End If End Get End Property @@ -72,7 +73,7 @@ Public Class ScatterplotDialog End Get End Property - Public Sub New(ByRef prob As BlueM.Opt.Common.Problem, Optional ByVal _refResultExists As Boolean = False) + Public Sub New(ByRef prob As Problem, Optional ByVal _refResultExists As Boolean = False) ' This call is required by the Windows Form Designer. Me.isInitializing = True @@ -91,13 +92,13 @@ Public Class ScatterplotDialog Private Sub ScatterplotDialog_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load - 'Option für Referenz-Ergebnis ggf. ausblenden + 'Option für Referenz-Ergebnis ggf. ausblenden If (Not Me.RefResultExists) Then Me.CheckBox_showRef.Enabled = False End If 'Deactive SekPop only option for SensiPlot - If Me.mProblem.Method = Common.METH_SENSIPLOT Then + If Me.mProblem.Method = Constants.METH_SENSIPLOT Then Me.CheckBox_SekPopOnly.Checked = False Me.CheckBox_SekPopOnly.Enabled = False End If @@ -111,7 +112,7 @@ Public Class ScatterplotDialog Dim i As Integer - 'Alle Variablen auswählen + 'Alle Variablen auswählen For i = 0 To Me.CheckedListBox_Auswahl.Items.Count - 1 Me.CheckedListBox_Auswahl.SetItemCheckState(i, CheckState.Checked) Next @@ -130,18 +131,18 @@ Public Class ScatterplotDialog Select Case Me.selectedSpace - Case Common.SPACE.SolutionSpace + Case Constants.SPACE.SolutionSpace 'Solution Space - For Each feature As Common.ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions + For Each feature As ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions bezeichnung = feature.Description 'Penalty-Functions mit Sternchen markieren If (feature.isPrimObjective) Then bezeichnung &= " (*)" Me.CheckedListBox_Auswahl.Items.Add(bezeichnung) Next - Case Common.SPACE.DecisionSpace + Case Constants.SPACE.DecisionSpace 'Decision Space - For Each param As Common.OptParameter In Me.mProblem.List_OptParameter + For Each param As OptParameter In Me.mProblem.List_OptParameter bezeichnung = param.Bezeichnung Me.CheckedListBox_Auswahl.Items.Add(bezeichnung) Next @@ -151,9 +152,9 @@ Public Class ScatterplotDialog End Sub Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_OK.Click - 'Mindestens 2 Variablen müssen ausgewählt sein + 'Mindestens 2 Variablen müssen ausgewählt sein If (Me.CheckedListBox_Auswahl.CheckedIndices.Count < 2) Then - MsgBox("Bitte mindestens 2 Variablen auswählen!", MsgBoxStyle.Exclamation) + MsgBox("Bitte mindestens 2 Variablen auswählen!", MsgBoxStyle.Exclamation) Me.DialogResult = Windows.Forms.DialogResult.None Exit Sub End If diff --git a/BlueM.Opt/Main/AboutBox.Designer.vb b/BlueM.Opt/Main/AboutBox.Designer.vb index 6e8d17ec..2a400701 100644 --- a/BlueM.Opt/Main/AboutBox.Designer.vb +++ b/BlueM.Opt/Main/AboutBox.Designer.vb @@ -1,4 +1,4 @@ - _ + _ Partial Class AboutBox Inherits System.Windows.Forms.Form @@ -127,7 +127,7 @@ Partial Class AboutBox 'OKButton ' Me.OKButton.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.OKButton.DialogResult = System.Windows.Forms.DialogResult.Cancel + Me.OKButton.DialogResult = DialogResult.Cancel Me.OKButton.Location = New System.Drawing.Point(287, 254) Me.OKButton.Name = "OKButton" Me.OKButton.Size = New System.Drawing.Size(75, 23) diff --git a/BlueM.Opt/Main/EVO_Einstellungen.vb b/BlueM.Opt/Main/EVO_Einstellungen.vb index 02768c4b..2f67e026 100644 --- a/BlueM.Opt/Main/EVO_Einstellungen.vb +++ b/BlueM.Opt/Main/EVO_Einstellungen.vb @@ -15,15 +15,15 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports BlueM.Opt.Common.Constants +Imports BlueM.Opt.Common Public Class EVO_Einstellungen Inherits Windows.Forms.UserControl #Region "Eigenschaften" - Private mSettings As BlueM.Opt.Common.Settings - Private mProblem As BlueM.Opt.Common.Problem 'Das Problem + Private mSettings As Settings + Private mProblem As Problem 'Das Problem Private isInitializing As Boolean #End Region @@ -36,32 +36,32 @@ Public Class EVO_Einstellungen Me.isInitializing = True - ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. + ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. Call Me.InitializeComponent() 'Comboboxen initialisieren '------------------------- 'PES: - Me.PES_Combo_Strategie.DataSource = System.Enum.GetValues(GetType(EVO_STRATEGY)) - Me.PES_Combo_Startparameter.DataSource = System.Enum.GetValues(GetType(EVO_STARTPARAMETERS)) - Me.PES_Combo_DnMutation.DataSource = System.Enum.GetValues(GetType(PES_MUTATIONSOP)) - Me.PES_Combo_OptEltern.DataSource = System.Enum.GetValues(GetType(PES_REPRODOP)) - Me.PES_Combo_PopEltern.DataSource = System.Enum.GetValues(GetType(EVO_POP_ELTERN)) - Me.PES_Combo_PopStrategie.DataSource = System.Enum.GetValues(GetType(EVO_STRATEGY)) + Me.PES_Combo_Strategie.DataSource = [Enum].GetValues(GetType(EVO_STRATEGY)) + Me.PES_Combo_Startparameter.DataSource = [Enum].GetValues(GetType(EVO_STARTPARAMETERS)) + Me.PES_Combo_DnMutation.DataSource = [Enum].GetValues(GetType(PES_MUTATIONSOP)) + Me.PES_Combo_OptEltern.DataSource = [Enum].GetValues(GetType(PES_REPRODOP)) + Me.PES_Combo_PopEltern.DataSource = [Enum].GetValues(GetType(EVO_POP_ELTERN)) + Me.PES_Combo_PopStrategie.DataSource = [Enum].GetValues(GetType(EVO_STRATEGY)) 'TSP - Me.TSP_ComboBox_prob_instance.DataSource = System.Enum.GetValues(GetType(EnProblem)) - Me.TSP_ComboBox_Reproductionoperator.DataSource = System.Enum.GetValues(GetType(EnReprodOperator)) - Me.TSP_ComboBox_Mutationoperator.DataSource = System.Enum.GetValues(GetType(EnMutOperator)) + Me.TSP_ComboBox_prob_instance.DataSource = [Enum].GetValues(GetType(EnProblem)) + Me.TSP_ComboBox_Reproductionoperator.DataSource = [Enum].GetValues(GetType(EnReprodOperator)) + Me.TSP_ComboBox_Mutationoperator.DataSource = [Enum].GetValues(GetType(EnMutOperator)) - 'Listboxen von SensiPlot werden erst bei setProblem() gefüllt! + 'Listboxen von SensiPlot werden erst bei setProblem() gefüllt! Me.isInitializing = False End Sub ''' - ''' Setzt das Problem zurück + ''' Setzt das Problem zurück ''' Public Sub Reset() Me.mProblem = Nothing @@ -71,7 +71,7 @@ Public Class EVO_Einstellungen ''' Setzt die Settings und aktiviert die entsprechenden TabPages ''' ''' Settings - Public Sub setSettings(ByRef settings As Common.Settings) + Public Sub setSettings(ByRef settings As Settings) Me.mSettings = settings @@ -158,7 +158,7 @@ Public Class EVO_Einstellungen ''' und zeigt die entsprechenden TabPages an ''' ''' Das Problem - Public Sub setProblem(ByRef prob As BlueM.Opt.Common.Problem) + Public Sub setProblem(ByRef prob As Problem) 'Problem speichern Me.mProblem = prob @@ -168,47 +168,47 @@ Public Class EVO_Einstellungen Case METH_PES 'PES-Settings instanzieren - Me.mSettings.PES = New Common.Settings_PES() + Me.mSettings.PES = New Settings_PES() Me.mSettings.PES.setStandard(Me.mProblem.Modus) Case METH_HOOKEJEEVES 'HJ-Settings instanzieren - Me.mSettings.HookeJeeves = New Common.Settings_HookeJeeves() + Me.mSettings.HookeJeeves = New Settings_HookeJeeves() Me.mSettings.HookeJeeves.setStandard() Case METH_DDS 'DDS-Settings initialisieren - Me.mSettings.DDS = New Common.Settings_DDS() + Me.mSettings.DDS = New Settings_DDS() Me.mSettings.DDS.setStandard() Case METH_METAEVO 'MetaEvo-Settings instanzieren - Me.mSettings.MetaEvo = New Common.Settings_MetaEvo() + Me.mSettings.MetaEvo = New Settings_MetaEvo() Me.mSettings.MetaEvo.setStandard() Case METH_SENSIPLOT 'Sensiplot-Settings instanzieren - Me.mSettings.SensiPlot = New Common.Settings_Sensiplot() + Me.mSettings.SensiPlot = New Settings_Sensiplot() Me.mSettings.SensiPlot.setStandard() - 'Listboxen füllen + 'Listboxen füllen Me.isInitializing = True Me.SensiPlot_ListBox_OptParameter.Items.Clear() - For Each optpara As Common.OptParameter In Me.mProblem.List_OptParameter + For Each optpara As OptParameter In Me.mProblem.List_OptParameter Call Me.SensiPlot_ListBox_OptParameter.Items.Add(optpara) Next Me.SensiPlot_ListBox_Objectives.Items.Clear() - For Each objective As Common.ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions + For Each objective As ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions Call Me.SensiPlot_ListBox_Objectives.Items.Add(objective) Next Me.isInitializing = False - 'Standardmäßig ersten OptParameter und erste ObjectiveFunction auswählen + 'Standardmäßig ersten OptParameter und erste ObjectiveFunction auswählen Me.SensiPlot_ListBox_OptParameter.SetSelected(0, True) Me.SensiPlot_ListBox_Objectives.SetSelected(0, True) Case METH_TSP 'TSP-Settings instanzieren - Me.mSettings.TSP = New Common.Settings_TSP() + Me.mSettings.TSP = New Settings_TSP() Me.mSettings.TSP.setStandard() Case Else @@ -372,7 +372,7 @@ Public Class EVO_Einstellungen End If SensiPlot_Label_NumCombinations.Text = $"{NumCombinations} parameter combinations" Catch ex As OverflowException - MsgBox($"The current settings result in too many parameter combinations!{eol}Setting no. of steps to 2.") + MsgBox($"The current settings result in too many parameter combinations!{Constants.eol}Setting no. of steps to 2.") SensiPlot_NumericUpDown_NumSteps.Value = 2 End Try diff --git a/BlueM.Opt/Main/EVO_Opt_Verlauf.vb b/BlueM.Opt/Main/EVO_Opt_Verlauf.vb index 50e8fffa..00887421 100644 --- a/BlueM.Opt/Main/EVO_Opt_Verlauf.vb +++ b/BlueM.Opt/Main/EVO_Opt_Verlauf.vb @@ -15,6 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports BlueM.Opt.Common + ''' ''' Ein Benutzersteuerelement, dass den in einem Progress-Objekt ''' abgebildeten Optimierungsverlauf in GUI-Form wiedergibt @@ -22,19 +24,19 @@ Partial Public Class EVO_Opt_Verlauf Inherits System.Windows.Forms.UserControl - Private WithEvents mProgress As BlueM.Opt.Common.Progress + Private WithEvents mProgress As Progress ''' ''' EVO_Opt_Verlauf initialisieren ''' - ''' Übergabe des Progress-Objekts + ''' Übergabe des Progress-Objekts ''' Braucht nur ein einziges Mal aufgerufen zu werden - Public Sub Initialisieren(ByRef progress As BlueM.Opt.Common.Progress) + Public Sub Initialisieren(ByRef progress As Progress) 'Progress-Objekt speichern Me.mProgress = progress - 'Zurücksetzen + 'Zurücksetzen Call Me.Reset() End Sub @@ -76,7 +78,7 @@ Partial Public Class EVO_Opt_Verlauf ProgressBarRunde.Value = Me.mProgress.iRunde LabelaktRunde.Text = Me.mProgress.iRunde.ToString() - System.Windows.Forms.Application.DoEvents() + Application.DoEvents() End Sub @@ -84,7 +86,7 @@ Partial Public Class EVO_Opt_Verlauf ProgressBarPop.Value = Me.mProgress.iPopul LabelaktPop.Text = Me.mProgress.iPopul.ToString() - System.Windows.Forms.Application.DoEvents() + Application.DoEvents() End Sub @@ -92,7 +94,7 @@ Partial Public Class EVO_Opt_Verlauf ProgressBarGen.Value = Me.mProgress.iGen LabelaktGen.Text = Me.mProgress.iGen.ToString() - System.Windows.Forms.Application.DoEvents() + Application.DoEvents() End Sub @@ -100,7 +102,7 @@ Partial Public Class EVO_Opt_Verlauf ProgressBarNach.Value = Me.mProgress.iNachf LabelaktNachf.Text = Me.mProgress.iNachf.ToString() - System.Windows.Forms.Application.DoEvents() + Application.DoEvents() End Sub diff --git a/BlueM.Opt/Main/Form1.Designer.vb b/BlueM.Opt/Main/Form1.Designer.vb index d658b0d5..a44635cc 100644 --- a/BlueM.Opt/Main/Form1.Designer.vb +++ b/BlueM.Opt/Main/Form1.Designer.vb @@ -294,7 +294,7 @@ Partial Class Form1 ' Me.ToolStripButton_New.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image Me.ToolStripButton_New.Image = Global.BlueM.Opt.My.Resources.Resources.page_white - Me.ToolStripButton_New.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripButton_New.ImageTransparentColor = Color.Magenta Me.ToolStripButton_New.Name = "ToolStripButton_New" Me.ToolStripButton_New.Size = New System.Drawing.Size(23, 22) Me.ToolStripButton_New.Text = "New" @@ -304,7 +304,7 @@ Partial Class Form1 ' Me.ToolStripSplitButton_Settings.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripMenuItem_SettingsLoad}) Me.ToolStripSplitButton_Settings.Image = Global.BlueM.Opt.My.Resources.Resources.wrench - Me.ToolStripSplitButton_Settings.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripSplitButton_Settings.ImageTransparentColor = Color.Magenta Me.ToolStripSplitButton_Settings.Name = "ToolStripSplitButton_Settings" Me.ToolStripSplitButton_Settings.Size = New System.Drawing.Size(81, 22) Me.ToolStripSplitButton_Settings.Text = "Settings" @@ -320,7 +320,7 @@ Partial Class Form1 ' Me.ToolStripSplitButton_ErgebnisDB.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripMenuItem_ErgebnisDBLoad, Me.ToolStripMenuItem_ErgebnisDBCompare}) Me.ToolStripSplitButton_ErgebnisDB.Image = Global.BlueM.Opt.My.Resources.Resources.database - Me.ToolStripSplitButton_ErgebnisDB.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripSplitButton_ErgebnisDB.ImageTransparentColor = Color.Magenta Me.ToolStripSplitButton_ErgebnisDB.Name = "ToolStripSplitButton_ErgebnisDB" Me.ToolStripSplitButton_ErgebnisDB.Size = New System.Drawing.Size(71, 22) Me.ToolStripSplitButton_ErgebnisDB.Text = "Result" @@ -346,7 +346,7 @@ Partial Class Form1 ' Me.ToolStripSplitButton_Diagramm.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripMenuItem_TChartEdit, Me.ToolStripMenuItem_TChartSave, Me.ToolStripMenuItem_TChart2PNG, Me.ToolStripMenuItem_Tchart2CSV}) Me.ToolStripSplitButton_Diagramm.Image = Global.BlueM.Opt.My.Resources.Resources.chart_curve - Me.ToolStripSplitButton_Diagramm.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripSplitButton_Diagramm.ImageTransparentColor = Color.Magenta Me.ToolStripSplitButton_Diagramm.Name = "ToolStripSplitButton_Diagramm" Me.ToolStripSplitButton_Diagramm.Size = New System.Drawing.Size(68, 22) Me.ToolStripSplitButton_Diagramm.Text = "Chart" @@ -388,7 +388,7 @@ Partial Class Form1 Me.ToolStripButton_Monitor.CheckOnClick = True Me.ToolStripButton_Monitor.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image Me.ToolStripButton_Monitor.Image = Global.BlueM.Opt.My.Resources.Resources.monitor - Me.ToolStripButton_Monitor.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripButton_Monitor.ImageTransparentColor = Color.Magenta Me.ToolStripButton_Monitor.Name = "ToolStripButton_Monitor" Me.ToolStripButton_Monitor.Size = New System.Drawing.Size(23, 22) Me.ToolStripButton_Monitor.Text = "Show/hide Monitor" @@ -397,7 +397,7 @@ Partial Class Form1 ' Me.ToolStripButton_Scatterplot.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image Me.ToolStripButton_Scatterplot.Image = Global.BlueM.Opt.My.Resources.Resources.scatterplot - Me.ToolStripButton_Scatterplot.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripButton_Scatterplot.ImageTransparentColor = Color.Magenta Me.ToolStripButton_Scatterplot.Name = "ToolStripButton_Scatterplot" Me.ToolStripButton_Scatterplot.Size = New System.Drawing.Size(23, 22) Me.ToolStripButton_Scatterplot.Text = "Scatterplot" @@ -407,7 +407,7 @@ Partial Class Form1 ' Me.ToolStripButton_CustomPlot.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image Me.ToolStripButton_CustomPlot.Image = CType(resources.GetObject("ToolStripButton_CustomPlot.Image"), System.Drawing.Image) - Me.ToolStripButton_CustomPlot.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripButton_CustomPlot.ImageTransparentColor = Color.Magenta Me.ToolStripButton_CustomPlot.Name = "ToolStripButton_CustomPlot" Me.ToolStripButton_CustomPlot.Size = New System.Drawing.Size(23, 22) Me.ToolStripButton_CustomPlot.Text = "Display/update custom plot" @@ -417,7 +417,7 @@ Partial Class Form1 ' Me.ToolStripButton_SelectedSolutions.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image Me.ToolStripButton_SelectedSolutions.Image = Global.BlueM.Opt.My.Resources.Resources.table - Me.ToolStripButton_SelectedSolutions.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripButton_SelectedSolutions.ImageTransparentColor = Color.Magenta Me.ToolStripButton_SelectedSolutions.Name = "ToolStripButton_SelectedSolutions" Me.ToolStripButton_SelectedSolutions.Size = New System.Drawing.Size(23, 22) Me.ToolStripButton_SelectedSolutions.Text = "Show selected solutions window" @@ -452,13 +452,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Labels.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Bottom.Labels.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Bottom.Labels.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Bottom.Labels.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Bottom.Labels.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Labels.Brush.Color = System.Drawing.Color.White + Me.Hauptdiagramm1.Axes.Bottom.Labels.Brush.Color = Color.White Me.Hauptdiagramm1.Axes.Bottom.Labels.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Labels.Brush.Visible = True ' @@ -468,7 +468,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Labels.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Bottom.Labels.Font.Brush.Color = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Bottom.Labels.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Labels.Font.Brush.Visible = True ' @@ -477,7 +477,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Labels.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Bottom.Labels.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Bottom.Labels.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Labels.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Bottom.Labels.Font.Size = 9 @@ -488,7 +488,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Labels.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Bottom.Labels.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Bottom.Labels.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Labels.ImageBevel.Brush.Visible = True ' @@ -497,7 +497,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Labels.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Bottom.Labels.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Bottom.Labels.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Labels.Shadow.Brush.Visible = True ' @@ -507,13 +507,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Title.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Bottom.Title.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Bottom.Title.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Bottom.Title.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Bottom.Title.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Title.Brush.Color = System.Drawing.Color.Silver + Me.Hauptdiagramm1.Axes.Bottom.Title.Brush.Color = Color.Silver Me.Hauptdiagramm1.Axes.Bottom.Title.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Title.Brush.Visible = True ' @@ -523,7 +523,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Title.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Bottom.Title.Font.Brush.Color = Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) Me.Hauptdiagramm1.Axes.Bottom.Title.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Title.Font.Brush.Visible = True ' @@ -532,7 +532,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Title.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Bottom.Title.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Bottom.Title.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Title.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Bottom.Title.Font.Size = 11 @@ -543,7 +543,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Title.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Bottom.Title.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Bottom.Title.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Title.ImageBevel.Brush.Visible = True ' @@ -552,7 +552,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Bottom.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Bottom.Title.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Bottom.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Bottom.Title.Shadow.Brush.Visible = True ' @@ -564,13 +564,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Labels.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Depth.Labels.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Depth.Labels.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Depth.Labels.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Depth.Labels.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Labels.Brush.Color = System.Drawing.Color.White + Me.Hauptdiagramm1.Axes.Depth.Labels.Brush.Color = Color.White Me.Hauptdiagramm1.Axes.Depth.Labels.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Labels.Brush.Visible = True ' @@ -580,7 +580,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Labels.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Depth.Labels.Font.Brush.Color = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Depth.Labels.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Labels.Font.Brush.Visible = True ' @@ -589,7 +589,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Labels.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Depth.Labels.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Depth.Labels.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Labels.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Depth.Labels.Font.Size = 9 @@ -600,7 +600,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Labels.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Depth.Labels.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Depth.Labels.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Labels.ImageBevel.Brush.Visible = True ' @@ -609,7 +609,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Labels.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Depth.Labels.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Depth.Labels.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Labels.Shadow.Brush.Visible = True ' @@ -619,13 +619,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Title.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Depth.Title.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Depth.Title.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Depth.Title.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Depth.Title.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Title.Brush.Color = System.Drawing.Color.Silver + Me.Hauptdiagramm1.Axes.Depth.Title.Brush.Color = Color.Silver Me.Hauptdiagramm1.Axes.Depth.Title.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Title.Brush.Visible = True ' @@ -635,7 +635,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Title.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Depth.Title.Font.Brush.Color = Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) Me.Hauptdiagramm1.Axes.Depth.Title.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Title.Font.Brush.Visible = True ' @@ -644,7 +644,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Title.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Depth.Title.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Depth.Title.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Title.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Depth.Title.Font.Size = 11 @@ -655,7 +655,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Title.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Depth.Title.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Depth.Title.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Title.ImageBevel.Brush.Visible = True ' @@ -664,7 +664,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Depth.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Depth.Title.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Depth.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Depth.Title.Shadow.Brush.Visible = True ' @@ -676,13 +676,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Labels.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.DepthTop.Labels.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.DepthTop.Labels.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.DepthTop.Labels.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.DepthTop.Labels.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Labels.Brush.Color = System.Drawing.Color.White + Me.Hauptdiagramm1.Axes.DepthTop.Labels.Brush.Color = Color.White Me.Hauptdiagramm1.Axes.DepthTop.Labels.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Labels.Brush.Visible = True ' @@ -692,7 +692,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Labels.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.DepthTop.Labels.Font.Brush.Color = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.DepthTop.Labels.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Labels.Font.Brush.Visible = True ' @@ -701,7 +701,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Labels.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.DepthTop.Labels.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.DepthTop.Labels.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Labels.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.DepthTop.Labels.Font.Size = 9 @@ -712,7 +712,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Labels.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.DepthTop.Labels.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.DepthTop.Labels.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Labels.ImageBevel.Brush.Visible = True ' @@ -721,7 +721,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Labels.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.DepthTop.Labels.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.DepthTop.Labels.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Labels.Shadow.Brush.Visible = True ' @@ -731,13 +731,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Title.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.DepthTop.Title.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.DepthTop.Title.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.DepthTop.Title.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.DepthTop.Title.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Title.Brush.Color = System.Drawing.Color.Silver + Me.Hauptdiagramm1.Axes.DepthTop.Title.Brush.Color = Color.Silver Me.Hauptdiagramm1.Axes.DepthTop.Title.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Title.Brush.Visible = True ' @@ -747,7 +747,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Title.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Hauptdiagramm1.Axes.DepthTop.Title.Font.Brush.Color = Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) Me.Hauptdiagramm1.Axes.DepthTop.Title.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Title.Font.Brush.Visible = True ' @@ -756,7 +756,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Title.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.DepthTop.Title.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.DepthTop.Title.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Title.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.DepthTop.Title.Font.Size = 11 @@ -767,7 +767,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Title.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.DepthTop.Title.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.DepthTop.Title.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Title.ImageBevel.Brush.Visible = True ' @@ -776,7 +776,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.DepthTop.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.DepthTop.Title.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.DepthTop.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.DepthTop.Title.Shadow.Brush.Visible = True ' @@ -788,13 +788,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Labels.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Left.Labels.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Left.Labels.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Left.Labels.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Left.Labels.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Left.Labels.Brush.Color = System.Drawing.Color.White + Me.Hauptdiagramm1.Axes.Left.Labels.Brush.Color = Color.White Me.Hauptdiagramm1.Axes.Left.Labels.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Labels.Brush.Visible = True ' @@ -804,7 +804,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Labels.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Left.Labels.Font.Brush.Color = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Left.Labels.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Labels.Font.Brush.Visible = True ' @@ -813,7 +813,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Labels.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Left.Labels.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Left.Labels.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Labels.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Left.Labels.Font.Size = 9 @@ -824,7 +824,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Labels.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Left.Labels.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Left.Labels.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Labels.ImageBevel.Brush.Visible = True ' @@ -833,7 +833,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Labels.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Left.Labels.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Left.Labels.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Labels.Shadow.Brush.Visible = True ' @@ -843,13 +843,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Title.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Left.Title.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Left.Title.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Left.Title.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Left.Title.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Left.Title.Brush.Color = System.Drawing.Color.Silver + Me.Hauptdiagramm1.Axes.Left.Title.Brush.Color = Color.Silver Me.Hauptdiagramm1.Axes.Left.Title.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Title.Brush.Visible = True ' @@ -859,7 +859,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Title.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Left.Title.Font.Brush.Color = Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) Me.Hauptdiagramm1.Axes.Left.Title.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Title.Font.Brush.Visible = True ' @@ -868,7 +868,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Title.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Left.Title.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Left.Title.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Title.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Left.Title.Font.Size = 11 @@ -879,7 +879,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Title.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Left.Title.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Left.Title.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Title.ImageBevel.Brush.Visible = True ' @@ -888,7 +888,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Left.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Left.Title.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Left.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Left.Title.Shadow.Brush.Visible = True ' @@ -900,13 +900,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Labels.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Right.Labels.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Right.Labels.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Right.Labels.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Right.Labels.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Right.Labels.Brush.Color = System.Drawing.Color.White + Me.Hauptdiagramm1.Axes.Right.Labels.Brush.Color = Color.White Me.Hauptdiagramm1.Axes.Right.Labels.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Labels.Brush.Visible = True ' @@ -916,7 +916,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Labels.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Right.Labels.Font.Brush.Color = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Right.Labels.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Labels.Font.Brush.Visible = True ' @@ -925,7 +925,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Labels.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Right.Labels.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Right.Labels.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Labels.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Right.Labels.Font.Size = 9 @@ -936,7 +936,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Labels.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Right.Labels.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Right.Labels.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Labels.ImageBevel.Brush.Visible = True ' @@ -945,7 +945,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Labels.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Right.Labels.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Right.Labels.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Labels.Shadow.Brush.Visible = True ' @@ -955,13 +955,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Title.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Right.Title.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Right.Title.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Right.Title.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Right.Title.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Right.Title.Brush.Color = System.Drawing.Color.Silver + Me.Hauptdiagramm1.Axes.Right.Title.Brush.Color = Color.Silver Me.Hauptdiagramm1.Axes.Right.Title.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Title.Brush.Visible = True ' @@ -971,7 +971,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Title.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Right.Title.Font.Brush.Color = Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) Me.Hauptdiagramm1.Axes.Right.Title.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Title.Font.Brush.Visible = True ' @@ -980,7 +980,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Title.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Right.Title.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Right.Title.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Title.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Right.Title.Font.Size = 11 @@ -991,7 +991,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Title.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Right.Title.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Right.Title.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Title.ImageBevel.Brush.Visible = True ' @@ -1000,7 +1000,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Right.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Right.Title.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Right.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Right.Title.Shadow.Brush.Visible = True ' @@ -1012,13 +1012,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Labels.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Top.Labels.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Top.Labels.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Top.Labels.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Top.Labels.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Top.Labels.Brush.Color = System.Drawing.Color.White + Me.Hauptdiagramm1.Axes.Top.Labels.Brush.Color = Color.White Me.Hauptdiagramm1.Axes.Top.Labels.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Labels.Brush.Visible = True ' @@ -1028,7 +1028,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Labels.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Top.Labels.Font.Brush.Color = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Top.Labels.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Labels.Font.Brush.Visible = True ' @@ -1037,7 +1037,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Labels.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Top.Labels.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Top.Labels.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Labels.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Top.Labels.Font.Size = 9 @@ -1048,7 +1048,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Labels.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Top.Labels.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Top.Labels.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Labels.ImageBevel.Brush.Visible = True ' @@ -1057,7 +1057,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Labels.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Top.Labels.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Top.Labels.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Labels.Shadow.Brush.Visible = True ' @@ -1067,13 +1067,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Title.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Axes.Top.Title.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Top.Title.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Top.Title.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Axes.Top.Title.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Axes.Top.Title.Brush.Color = System.Drawing.Color.Silver + Me.Hauptdiagramm1.Axes.Top.Title.Brush.Color = Color.Silver Me.Hauptdiagramm1.Axes.Top.Title.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Title.Brush.Visible = True ' @@ -1083,7 +1083,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Title.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Hauptdiagramm1.Axes.Top.Title.Font.Brush.Color = Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) Me.Hauptdiagramm1.Axes.Top.Title.Font.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Title.Font.Brush.Visible = True ' @@ -1092,7 +1092,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Title.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Top.Title.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Top.Title.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Title.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Axes.Top.Title.Font.Size = 11 @@ -1103,7 +1103,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Title.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Axes.Top.Title.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Axes.Top.Title.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Title.ImageBevel.Brush.Visible = True ' @@ -1112,7 +1112,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Axes.Top.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Axes.Top.Title.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Axes.Top.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Axes.Top.Title.Shadow.Brush.Visible = True ' @@ -1121,13 +1121,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Footer.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Footer.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Footer.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Footer.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Footer.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Footer.Brush.Color = System.Drawing.Color.Silver + Me.Hauptdiagramm1.Footer.Brush.Color = Color.Silver Me.Hauptdiagramm1.Footer.Brush.Solid = True Me.Hauptdiagramm1.Footer.Brush.Visible = True ' @@ -1137,7 +1137,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Footer.Font.Brush.Color = System.Drawing.Color.Red + Me.Hauptdiagramm1.Footer.Font.Brush.Color = Color.Red Me.Hauptdiagramm1.Footer.Font.Brush.Solid = True Me.Hauptdiagramm1.Footer.Font.Brush.Visible = True ' @@ -1146,7 +1146,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Footer.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Footer.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Footer.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Footer.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Footer.Font.Size = 8 @@ -1157,7 +1157,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Footer.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Footer.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Footer.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Footer.ImageBevel.Brush.Visible = True ' @@ -1166,7 +1166,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Footer.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Footer.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Footer.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Footer.Shadow.Brush.Visible = True ' @@ -1175,13 +1175,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Header.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Header.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Header.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Header.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Header.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Header.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer)) + Me.Hauptdiagramm1.Header.Brush.Color = Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer)) Me.Hauptdiagramm1.Header.Brush.Solid = True Me.Hauptdiagramm1.Header.Brush.Visible = True ' @@ -1191,7 +1191,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Header.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Header.Font.Brush.Color = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Header.Font.Brush.Solid = True Me.Hauptdiagramm1.Header.Font.Brush.Visible = True ' @@ -1200,7 +1200,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Header.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Header.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Header.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Header.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Header.Font.Size = 12 @@ -1211,7 +1211,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Header.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Header.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Header.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Header.ImageBevel.Brush.Visible = True Me.Hauptdiagramm1.Header.Lines = New String() {"BlueM.Opt"} @@ -1221,7 +1221,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Header.Shadow.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(169, Byte), Integer), CType(CType(169, Byte), Integer), CType(CType(169, Byte), Integer)) + Me.Hauptdiagramm1.Header.Shadow.Brush.Color = Color.FromArgb(CType(CType(169, Byte), Integer), CType(CType(169, Byte), Integer), CType(CType(169, Byte), Integer)) Me.Hauptdiagramm1.Header.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Header.Shadow.Brush.Visible = True ' @@ -1230,13 +1230,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Legend.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Legend.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Legend.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Legend.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Legend.Brush.Color = System.Drawing.Color.White + Me.Hauptdiagramm1.Legend.Brush.Color = Color.White Me.Hauptdiagramm1.Legend.Brush.Solid = True Me.Hauptdiagramm1.Legend.Brush.Visible = True ' @@ -1246,7 +1246,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) + Me.Hauptdiagramm1.Legend.Font.Brush.Color = Color.FromArgb(CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer)) Me.Hauptdiagramm1.Legend.Font.Brush.Solid = True Me.Hauptdiagramm1.Legend.Font.Brush.Visible = True ' @@ -1255,7 +1255,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Legend.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Legend.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Legend.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Legend.Font.Size = 9 @@ -1266,7 +1266,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Legend.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Legend.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Legend.ImageBevel.Brush.Visible = True ' @@ -1275,7 +1275,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Shadow.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer)) + Me.Hauptdiagramm1.Legend.Shadow.Brush.Color = Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer)) Me.Hauptdiagramm1.Legend.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Legend.Shadow.Brush.Visible = True ' @@ -1287,7 +1287,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Symbol.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Legend.Symbol.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Legend.Symbol.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Legend.Symbol.Shadow.Brush.Visible = True ' @@ -1296,13 +1296,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Title.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Legend.Title.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Legend.Title.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Legend.Title.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Legend.Title.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Legend.Title.Brush.Color = System.Drawing.Color.White + Me.Hauptdiagramm1.Legend.Title.Brush.Color = Color.White Me.Hauptdiagramm1.Legend.Title.Brush.Solid = True Me.Hauptdiagramm1.Legend.Title.Brush.Visible = True ' @@ -1312,7 +1312,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Title.Font.Brush.Color = System.Drawing.Color.Black + Me.Hauptdiagramm1.Legend.Title.Font.Brush.Color = Color.Black Me.Hauptdiagramm1.Legend.Title.Font.Brush.Solid = True Me.Hauptdiagramm1.Legend.Title.Font.Brush.Visible = True ' @@ -1321,7 +1321,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Title.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Legend.Title.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Legend.Title.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Legend.Title.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Legend.Title.Font.Size = 8 @@ -1332,7 +1332,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Title.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Legend.Title.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Legend.Title.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Legend.Title.ImageBevel.Brush.Visible = True ' @@ -1341,7 +1341,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Legend.Title.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Legend.Title.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Legend.Title.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Legend.Title.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Location = New System.Drawing.Point(241, 106) @@ -1353,13 +1353,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Panel.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Panel.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Panel.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Panel.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Panel.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Panel.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Panel.Brush.Color = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) Me.Hauptdiagramm1.Panel.Brush.Solid = True Me.Hauptdiagramm1.Panel.Brush.Visible = True ' @@ -1368,7 +1368,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Panel.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Panel.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Panel.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Panel.ImageBevel.Brush.Visible = True ' @@ -1377,7 +1377,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Panel.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Panel.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Panel.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Panel.Shadow.Brush.Visible = True ' @@ -1395,13 +1395,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubFooter.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.SubFooter.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.SubFooter.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.SubFooter.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.SubFooter.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.SubFooter.Brush.Color = System.Drawing.Color.Silver + Me.Hauptdiagramm1.SubFooter.Brush.Color = Color.Silver Me.Hauptdiagramm1.SubFooter.Brush.Solid = True Me.Hauptdiagramm1.SubFooter.Brush.Visible = True ' @@ -1411,7 +1411,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubFooter.Font.Brush.Color = System.Drawing.Color.Red + Me.Hauptdiagramm1.SubFooter.Font.Brush.Color = Color.Red Me.Hauptdiagramm1.SubFooter.Font.Brush.Solid = True Me.Hauptdiagramm1.SubFooter.Font.Brush.Visible = True ' @@ -1420,7 +1420,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubFooter.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.SubFooter.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.SubFooter.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.SubFooter.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.SubFooter.Font.Size = 8 @@ -1431,7 +1431,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubFooter.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.SubFooter.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.SubFooter.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.SubFooter.ImageBevel.Brush.Visible = True ' @@ -1440,7 +1440,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubFooter.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.SubFooter.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.SubFooter.Shadow.Brush.Solid = True Me.Hauptdiagramm1.SubFooter.Shadow.Brush.Visible = True ' @@ -1449,13 +1449,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubHeader.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.SubHeader.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.SubHeader.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.SubHeader.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.SubHeader.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.SubHeader.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer)) + Me.Hauptdiagramm1.SubHeader.Brush.Color = Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer)) Me.Hauptdiagramm1.SubHeader.Brush.Solid = True Me.Hauptdiagramm1.SubHeader.Brush.Visible = True ' @@ -1465,7 +1465,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubHeader.Font.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.SubHeader.Font.Brush.Color = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.SubHeader.Font.Brush.Solid = True Me.Hauptdiagramm1.SubHeader.Font.Brush.Visible = True ' @@ -1474,7 +1474,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubHeader.Font.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.SubHeader.Font.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.SubHeader.Font.Shadow.Brush.Solid = True Me.Hauptdiagramm1.SubHeader.Font.Shadow.Brush.Visible = True Me.Hauptdiagramm1.SubHeader.Font.Size = 12 @@ -1485,7 +1485,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubHeader.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.SubHeader.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.SubHeader.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.SubHeader.ImageBevel.Brush.Visible = True ' @@ -1494,7 +1494,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.SubHeader.Shadow.Brush.Color = System.Drawing.Color.FromArgb(CType(CType(169, Byte), Integer), CType(CType(169, Byte), Integer), CType(CType(169, Byte), Integer)) + Me.Hauptdiagramm1.SubHeader.Shadow.Brush.Color = Color.FromArgb(CType(CType(169, Byte), Integer), CType(CType(169, Byte), Integer), CType(CType(169, Byte), Integer)) Me.Hauptdiagramm1.SubHeader.Shadow.Brush.Solid = True Me.Hauptdiagramm1.SubHeader.Shadow.Brush.Visible = True Me.Hauptdiagramm1.TabIndex = 17 @@ -1507,13 +1507,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Back.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Walls.Back.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Walls.Back.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Walls.Back.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Walls.Back.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Walls.Back.Brush.Color = System.Drawing.Color.Silver + Me.Hauptdiagramm1.Walls.Back.Brush.Color = Color.Silver Me.Hauptdiagramm1.Walls.Back.Brush.Solid = True Me.Hauptdiagramm1.Walls.Back.Brush.Visible = False ' @@ -1522,7 +1522,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Back.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Walls.Back.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Walls.Back.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Walls.Back.ImageBevel.Brush.Visible = True ' @@ -1531,7 +1531,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Back.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Walls.Back.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Walls.Back.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Walls.Back.Shadow.Brush.Visible = True ' @@ -1540,13 +1540,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Bottom.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Walls.Bottom.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Walls.Bottom.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Walls.Bottom.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Walls.Bottom.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Walls.Bottom.Brush.Color = System.Drawing.Color.White + Me.Hauptdiagramm1.Walls.Bottom.Brush.Color = Color.White Me.Hauptdiagramm1.Walls.Bottom.Brush.Solid = True Me.Hauptdiagramm1.Walls.Bottom.Brush.Visible = True ' @@ -1555,7 +1555,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Bottom.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Walls.Bottom.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Walls.Bottom.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Walls.Bottom.ImageBevel.Brush.Visible = True ' @@ -1564,7 +1564,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Bottom.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Walls.Bottom.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Walls.Bottom.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Walls.Bottom.Shadow.Brush.Visible = True ' @@ -1573,13 +1573,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Left.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Walls.Left.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Walls.Left.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Walls.Left.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Walls.Left.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Walls.Left.Brush.Color = System.Drawing.Color.LightYellow + Me.Hauptdiagramm1.Walls.Left.Brush.Color = Color.LightYellow Me.Hauptdiagramm1.Walls.Left.Brush.Solid = True Me.Hauptdiagramm1.Walls.Left.Brush.Visible = True ' @@ -1588,7 +1588,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Left.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Walls.Left.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Walls.Left.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Walls.Left.ImageBevel.Brush.Visible = True ' @@ -1597,7 +1597,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Left.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Walls.Left.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Walls.Left.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Walls.Left.Shadow.Brush.Visible = True ' @@ -1606,13 +1606,13 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Right.Bevel.ColorOne = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) - Me.Hauptdiagramm1.Walls.Right.Bevel.ColorTwo = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) + Me.Hauptdiagramm1.Walls.Right.Bevel.ColorOne = Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) + Me.Hauptdiagramm1.Walls.Right.Bevel.ColorTwo = Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer), CType(CType(128, Byte), Integer)) Me.Hauptdiagramm1.Walls.Right.Bevel.Outer = Steema.TeeChart.Drawing.BevelStyles.None ' ' ' - Me.Hauptdiagramm1.Walls.Right.Brush.Color = System.Drawing.Color.LightYellow + Me.Hauptdiagramm1.Walls.Right.Brush.Color = Color.LightYellow Me.Hauptdiagramm1.Walls.Right.Brush.Solid = True Me.Hauptdiagramm1.Walls.Right.Brush.Visible = True ' @@ -1621,7 +1621,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Right.ImageBevel.Brush.Color = System.Drawing.Color.LightGray + Me.Hauptdiagramm1.Walls.Right.ImageBevel.Brush.Color = Color.LightGray Me.Hauptdiagramm1.Walls.Right.ImageBevel.Brush.Solid = True Me.Hauptdiagramm1.Walls.Right.ImageBevel.Brush.Visible = True ' @@ -1630,7 +1630,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Walls.Right.Shadow.Brush.Color = System.Drawing.Color.DarkGray + Me.Hauptdiagramm1.Walls.Right.Shadow.Brush.Color = Color.DarkGray Me.Hauptdiagramm1.Walls.Right.Shadow.Brush.Solid = True Me.Hauptdiagramm1.Walls.Right.Shadow.Brush.Visible = True Me.Hauptdiagramm1.Walls.View3D = False @@ -1640,7 +1640,7 @@ Partial Class Form1 ' ' ' - Me.Hauptdiagramm1.Zoom.Brush.Color = System.Drawing.Color.LightBlue + Me.Hauptdiagramm1.Zoom.Brush.Color = Color.LightBlue Me.Hauptdiagramm1.Zoom.Brush.Solid = True Me.Hauptdiagramm1.Zoom.Brush.Visible = True ' diff --git a/BlueM.Opt/Main/Form1.vb b/BlueM.Opt/Main/Form1.vb index ce5af913..0b8059c6 100644 --- a/BlueM.Opt/Main/Form1.vb +++ b/BlueM.Opt/Main/Form1.vb @@ -15,10 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' -Imports System.Xml -Imports System.Xml.Serialization -Imports BlueM.Opt.Common.Constants - +Imports System.Windows.Forms +Imports BlueM.Opt.Common ''' ''' Main Window ''' @@ -33,13 +31,13 @@ Partial Public Class Form1 Private Anwendung As String 'Problem - Public mProblem As BlueM.Opt.Common.Problem + Public mProblem As Problem 'Settings - Private mSettings As BlueM.Opt.Common.Settings + Private mSettings As Settings 'Progress - Private mProgress As BlueM.Opt.Common.Progress + Private mProgress As Progress 'Apps Private Testprobleme1 As BlueM.Opt.Apps.Testprobleme @@ -108,14 +106,14 @@ Partial Public Class Form1 '*********** Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load 'XP-look - System.Windows.Forms.Application.EnableVisualStyles() + Application.EnableVisualStyles() 'Monitor zuweisen Me.Monitor1 = BlueM.Opt.Diagramm.Monitor.getInstance() 'Monitor zentrieren Me.Monitor1.Location = New Drawing.Point(Me.Location.X + Me.Width / 2 - Me.Monitor1.Width / 2, Me.Location.Y + Me.Height / 2 - Me.Monitor1.Height / 2) 'Add handler for log messages - AddHandler BlueM.Opt.Common.Log.LogMessageAdded, AddressOf Monitor1.LogAppend + AddHandler Log.LogMessageAdded, AddressOf Monitor1.LogAppend 'Formular initialisieren Call Me.INI() @@ -136,7 +134,7 @@ Partial Public Class Form1 Me.IsInitializing = True 'clear the log - BlueM.Opt.Common.Log.Reset() + Log.Reset() 'Anwendungs-Groupbox aktivieren Me.GroupBox_Anwendung.Enabled = True @@ -165,7 +163,7 @@ Partial Public Class Form1 Me.ComboBox_Methode.SelectedIndex = 0 'Einstellungen - Me.mSettings = New Common.Settings() + Me.mSettings = New Settings() Me.EVO_Einstellungen1.Reset() 'für Neustart wichtig Me.EVO_Einstellungen1.setSettings(Me.mSettings) @@ -173,7 +171,7 @@ Partial Public Class Form1 Me.Monitor1.Reset() 'Progress instanzieren und an EVO_Opt_Verlauf übergeben - Me.mProgress = New BlueM.Opt.Common.Progress() + Me.mProgress = New Progress() Me.EVO_Opt_Verlauf1.Initialisieren(Me.mProgress) 'Toolbar-Buttons deaktivieren @@ -324,7 +322,7 @@ Partial Public Class Form1 Public Sub loadSettings(ByVal filename As String) 'read settings from file - Dim settings As Common.Settings = Common.Settings.Load(filename) + Dim settings As Settings = Settings.Load(filename) 'Checks: PES OptMode has to be identical If settings.PES.OptModus <> Me.mSettings.PES.OptModus Then @@ -478,11 +476,11 @@ Partial Public Class Form1 Call Me.mProgress.Initialize() 'log - Common.Log.AddMessage(Common.Log.levels.info, $"Set application to {Me.Anwendung}") + Log.AddMessage(Log.levels.info, $"Set application to {Me.Anwendung}") Catch ex As Exception - MsgBox("Error while initializing the application:" & eol & ex.Message, MsgBoxStyle.Critical) + MsgBox("Error while initializing the application:" & Constants.eol & ex.Message, MsgBoxStyle.Critical) Me.IsInitializing = True Me.ComboBox_Anwendung.SelectedIndex = 0 Me.IsInitializing = False @@ -715,7 +713,7 @@ Partial Public Class Form1 Call Me.mProgress.Initialize() 'log - Common.Log.AddMessage(Common.Log.levels.info, $"Set dataset to {selectedDatensatz}") + Log.AddMessage(Log.levels.info, $"Set dataset to {selectedDatensatz}") Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical) @@ -871,7 +869,7 @@ Partial Public Class Form1 Catch ex As Exception - MsgBox("Error while setting the method:" & eol & ex.Message, MsgBoxStyle.Critical) + MsgBox("Error while setting the method:" & Constants.eol & ex.Message, MsgBoxStyle.Critical) 'Combobox zurücksetzen Me.IsInitializing = True Me.ComboBox_Methode.SelectedIndex = 0 @@ -891,7 +889,7 @@ Partial Public Class Form1 Private Sub INI_Problem(ByVal Method As String) 'Neues Problem mit ausgewählter Methode instanzieren - Me.mProblem = New BlueM.Opt.Common.Problem(Method) + Me.mProblem = New Problem(Method) 'Problemdefinition '================= @@ -932,15 +930,15 @@ Partial Public Class Form1 'Individuumsklasse mit Problem initialisieren '-------------------------------------------- - Call BlueM.Opt.Common.Individuum.Initialise(Me.mProblem) + Call Individuum.Initialise(Me.mProblem) 'Problembeschreibung in Log schreiben '------------------------------------ - Common.Log.AddMessage(Common.Log.levels.info, $"Set method to {Me.mProblem.Method}") + Log.AddMessage(Log.levels.info, $"Set method to {Me.mProblem.Method}") Dim msg As String - msg = "Optimization problem loaded:" & eol + msg = "Optimization problem loaded:" & Constants.eol msg &= Me.mProblem.Description() - Common.Log.AddMessage(Common.Log.levels.info, msg) + Log.AddMessage(Log.levels.info, msg) Me.Monitor1.SelectTabLog() Me.Monitor1.Show() @@ -976,13 +974,13 @@ Partial Public Class Form1 'Stoppuhr Dim AllOptTime As New Stopwatch - Common.Log.AddMessage(Common.Log.levels.info, "Starting optimization...") + Log.AddMessage(Log.levels.info, "Starting optimization...") Call StarteDurchlauf(AllOptTime) MsgBox("Optimization ended!", MsgBoxStyle.Information, "BlueM.Opt") - Common.Log.AddMessage(Common.Log.levels.info, $"The optimization took {AllOptTime.Elapsed.Days}d {AllOptTime.Elapsed.Hours}h {AllOptTime.Elapsed.Minutes}m {AllOptTime.Elapsed.Seconds}s {AllOptTime.Elapsed.Milliseconds}ms") + Log.AddMessage(Log.levels.info, $"The optimization took {AllOptTime.Elapsed.Days}d {AllOptTime.Elapsed.Hours}h {AllOptTime.Elapsed.Minutes}m {AllOptTime.Elapsed.Seconds}s {AllOptTime.Elapsed.Milliseconds}ms") End Sub @@ -1039,7 +1037,7 @@ Partial Public Class Form1 'Set log file Dim logfilename As String = IO.Path.Combine(Me.mProblem.WorkDir, $"{Me.mProblem.Datensatz}.BlueM.Opt.{starttime:yyyyMMddHHmm}.log") - BlueM.Opt.Common.Log.SetLogFile(logfilename) + Log.SetLogFile(logfilename) 'Prepare OptResult (database) Call Me.Sim1.PrepareOptResult(starttime) @@ -1082,7 +1080,7 @@ Partial Public Class Form1 Catch ex As Exception 'Globale Fehlerbehandlung für Optimierungslauf: - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) + Log.AddMessage(Log.levels.error, ex.Message) MsgBox(ex.Message, MsgBoxStyle.Critical, "Error") Finally @@ -1121,7 +1119,7 @@ Partial Public Class Form1 'Pausen Magic :-) Do While (Me.isPause) - System.Threading.Thread.Sleep(20) + Threading.Thread.Sleep(20) Application.DoEvents() Loop @@ -1208,7 +1206,7 @@ Partial Public Class Form1 SaveFileDialog1.DefaultExt = Me.Hauptdiagramm1.Export.Data.Excel.FileExtension SaveFileDialog1.FileName = Me.Hauptdiagramm1.Name + "." + SaveFileDialog1.DefaultExt SaveFileDialog1.Filter = "Excel files (*.xls)|*.xls" - If (Me.SaveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK) Then + If (Me.SaveFileDialog1.ShowDialog() = DialogResult.OK) Then Me.Hauptdiagramm1.Export.Data.Excel.Series = Nothing 'export all series Me.Hauptdiagramm1.Export.Data.Excel.IncludeLabels = True Me.Hauptdiagramm1.Export.Data.Excel.IncludeIndex = True @@ -1224,7 +1222,7 @@ Partial Public Class Form1 SaveFileDialog1.DefaultExt = Me.Hauptdiagramm1.Export.Image.PNG.FileExtension SaveFileDialog1.FileName = Me.Hauptdiagramm1.Name + "." + SaveFileDialog1.DefaultExt SaveFileDialog1.Filter = "PNG files (*.png)|*.png" - If (Me.SaveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK) Then + If (Me.SaveFileDialog1.ShowDialog() = DialogResult.OK) Then Me.Hauptdiagramm1.Export.Image.PNG.GrayScale = False Me.Hauptdiagramm1.Export.Image.PNG.Save(Me.SaveFileDialog1.FileName) End If @@ -1236,7 +1234,7 @@ Partial Public Class Form1 SaveFileDialog1.DefaultExt = Me.Hauptdiagramm1.Export.Template.FileExtension SaveFileDialog1.FileName = Me.Hauptdiagramm1.Name + "." + SaveFileDialog1.DefaultExt SaveFileDialog1.Filter = "TeeChart files (*.ten)|*.ten" - If (Me.SaveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK) Then + If (Me.SaveFileDialog1.ShowDialog() = DialogResult.OK) Then Me.Hauptdiagramm1.Export.Template.IncludeData = True Me.Hauptdiagramm1.Export.Template.Save(Me.SaveFileDialog1.FileName) End If @@ -1413,7 +1411,7 @@ Partial Public Class Form1 'Warnung bei mehr als 3 OptZielen If (Me.mProblem.NumPrimObjective > 3) Then - MsgBox("The number of primary objectives is more than 3!" & eol _ + MsgBox("The number of primary objectives is more than 3!" & Constants.eol _ & "Only the first three primary objectives will be displayed in the main chart!", MsgBoxStyle.Information) End If @@ -1447,7 +1445,7 @@ Partial Public Class Form1 Me.scatterplot2 = New BlueM.Opt.Diagramm.Scatterplot(Me.mProblem, Sim1.OptResult, Sim1.OptResultRef) Else Cursor = Cursors.Default - MsgBox($"There are already two scatterplot matrices open!{eol}Please close at least one of them first!", MsgBoxStyle.Information) + MsgBox($"There are already two scatterplot matrices open!{Constants.eol}Please close at least one of them first!", MsgBoxStyle.Information) End If Cursor = Cursors.Default @@ -1508,7 +1506,7 @@ Partial Public Class Form1 Else Dim indID_clicked As Integer - Dim ind As Common.Individuum + Dim ind As Individuum Try 'Solution-ID @@ -1521,8 +1519,8 @@ Partial Public Class Form1 Call Me.selectSolution(ind) Catch ex As Exception - Common.Log.AddMessage(Common.Log.levels.error, ex.Message) - MsgBox($"Solution is not selectable!{Common.Constants.eol}{ex.Message}", MsgBoxStyle.Information) + Log.AddMessage(Log.levels.error, ex.Message) + MsgBox($"Solution is not selectable!{Constants.eol}{ex.Message}", MsgBoxStyle.Information) End Try End If @@ -1534,7 +1532,7 @@ Partial Public Class Form1 ''' ''' the solution ID to select Private Overloads Sub selectSolution(id As Integer) Handles solutionDialog.SelectedSolutionsIDRequested - Dim ind As Common.Individuum + Dim ind As Individuum Try ind = Sim1.OptResult.getSolution(id) Call Me.selectSolution(ind) @@ -1547,7 +1545,7 @@ Partial Public Class Form1 ''' Selects a solution ''' ''' the individual to select - Private Overloads Sub selectSolution(ByVal ind As Common.Individuum) Handles scatterplot1.pointSelected, scatterplot2.pointSelected, customPlot.pointSelected + Private Overloads Sub selectSolution(ByVal ind As Individuum) Handles scatterplot1.pointSelected, scatterplot2.pointSelected, customPlot.pointSelected Dim isOK As Boolean @@ -1636,21 +1634,21 @@ Partial Public Class Form1 'Im Hauptdiagramm neu zeichnen Call Me.Hauptdiagramm1.LöscheAusgewählteLösungen() - For Each ind As Common.Individuum In Me.Sim1.OptResult.getSelectedSolutions + For Each ind As Individuum In Me.Sim1.OptResult.getSelectedSolutions Call Me.Hauptdiagramm1.DrawSelectedSolution(ind) Next 'In den Scatterplot-Matrizen neu zeichnen If (Not IsNothing(Me.scatterplot1)) Then Call scatterplot1.clearSelection() - For Each ind As Common.Individuum In Me.Sim1.OptResult.getSelectedSolutions + For Each ind As Individuum In Me.Sim1.OptResult.getSelectedSolutions Call Me.scatterplot1.showSelectedSolution(ind) Next End If If (Not IsNothing(Me.scatterplot2)) Then Call scatterplot2.clearSelection() - For Each ind As Common.Individuum In Me.Sim1.OptResult.getSelectedSolutions + For Each ind As Individuum In Me.Sim1.OptResult.getSelectedSolutions Call Me.scatterplot2.showSelectedSolution(ind) Next End If @@ -1658,7 +1656,7 @@ Partial Public Class Form1 'Im CustomPlot neu zeichnen If (Not IsNothing(Me.customPlot)) Then Call Me.customPlot.clearSelection() - For Each ind As Common.Individuum In Me.Sim1.OptResult.getSelectedSolutions + For Each ind As Individuum In Me.Sim1.OptResult.getSelectedSolutions Call Me.customPlot.showSelectedSolution(ind) Next End If @@ -1694,7 +1692,7 @@ Partial Public Class Form1 'Alle ausgewählten Lösungen durchlaufen '====================================== - For Each ind As Common.Individuum In Sim1.OptResult.getSelectedSolutions() + For Each ind As Individuum In Sim1.OptResult.getSelectedSolutions() 'Lösung per Checkbox ausgewählt? '------------------------------- @@ -1724,17 +1722,17 @@ Partial Public Class Form1 'zu zeichnenden Reihen aus Liste der Ziele raussuchen '---------------------------------------------------- - For Each objective As Common.ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions + For Each objective As ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions - If (objective.GetObjType = Common.ObjectiveFunction.ObjectiveType.Series _ - Or objective.GetObjType = Common.ObjectiveFunction.ObjectiveType.ValueFromSeries) Then + If (objective.GetObjType = ObjectiveFunction.ObjectiveType.Series _ + Or objective.GetObjType = ObjectiveFunction.ObjectiveType.ValueFromSeries) Then With objective 'Referenzreihe in Wave laden '--------------------------- - If (objective.GetObjType = Common.ObjectiveFunction.ObjectiveType.Series) Then - With CType(objective, Common.ObjectiveFunction_Series) + If (objective.GetObjType = ObjectiveFunction.ObjectiveType.Series) Then + With CType(objective, ObjectiveFunction_Series) 'Referenzreihen nur jeweils ein Mal zeichnen 'TODO: Dieselbe Referenzreihe könnte aber mehrfach mit jeweils ' unterschiedlichen Evaluierungszeiträumen definiert sein. @@ -1883,7 +1881,7 @@ Partial Public Class Form1 '======== If (importDialog.ComboBox_SekPop.SelectedItem <> "exclusively") Then - For Each ind As Common.Individuum In Sim1.OptResult.Solutions + For Each ind As Individuum In Sim1.OptResult.Solutions If (Me.Hauptdiagramm1.ZielIndexZ = -1 And Me.Hauptdiagramm1.ZielIndexY = -1) Then '1D @@ -1930,7 +1928,7 @@ Partial Public Class Form1 '================== If (importDialog.ComboBox_SekPop.SelectedItem <> "none") Then - For Each sekpopind As Common.Individuum In Sim1.OptResult.getSekPop() + For Each sekpopind As Individuum In Sim1.OptResult.getSekPop() If (Me.Hauptdiagramm1.ZielIndexZ = -1) Then '2D '-- @@ -2010,7 +2008,7 @@ Partial Public Class Form1 End If Catch ex As Exception - MsgBox("Error while loading result database:" & eol & ex.Message, MsgBoxStyle.Critical) + MsgBox("Error while loading result database:" & Constants.eol & ex.Message, MsgBoxStyle.Critical) Finally @@ -2043,7 +2041,7 @@ Partial Public Class Form1 sourceFile = Me.OpenFileDialog1.FileName 'Abfrage - diagresult = MsgBox("Should the optimization parameters of the comparison result be loaded as well?" & eol _ + diagresult = MsgBox("Should the optimization parameters of the comparison result be loaded as well?" & Constants.eol _ & "(This requires that the optimization parameter definition of both results are identical!)", MsgBoxStyle.YesNo) If (diagresult = Windows.Forms.DialogResult.Yes) Then @@ -2065,7 +2063,7 @@ Partial Public Class Form1 Dim serie As Steema.TeeChart.Styles.Points Dim serie3D As Steema.TeeChart.Styles.Points3D - For Each sekpopind As Common.Individuum In Sim1.OptResultRef.getSekPop() + For Each sekpopind As Individuum In Sim1.OptResultRef.getSekPop() If (Me.Hauptdiagramm1.ZielIndexZ = -1) Then '2D '-- @@ -2115,8 +2113,8 @@ Partial Public Class Form1 Call Clipboard.SetDataObject(indicatorDiff, True) 'Anzeige in Messagebox - MsgBox("Hypervolume difference to comparison result:" & eol _ - & indicatorDiff.ToString() & eol _ + MsgBox("Hypervolume difference to comparison result:" & Constants.eol _ + & indicatorDiff.ToString() & Constants.eol _ & "(Value was copied to the clipboard)", MsgBoxStyle.Information, "Hypervolume") End If @@ -2129,7 +2127,7 @@ Partial Public Class Form1 'Im Monitor anzeigen Dim colorline1 As New Steema.TeeChart.Tools.ColorLine(Me.Monitor1.Diag.Chart) - colorline1.Pen.Color = System.Drawing.Color.Red + colorline1.Pen.Color = Color.Red colorline1.Pen.Width = 2 colorline1.AllowDrag = False colorline1.Axis = Me.Monitor1.Diag.Axes.Right @@ -2138,7 +2136,7 @@ Partial Public Class Form1 End If Catch ex As Exception - MsgBox("Error while loading reference result database:" & eol & ex.Message, MsgBoxStyle.Critical) + MsgBox("Error while loading reference result database:" & Constants.eol & ex.Message, MsgBoxStyle.Critical) Finally @@ -2158,7 +2156,7 @@ Partial Public Class Form1 Private Function evaluateStartwerte() As Boolean Dim isOK As Boolean - Dim startind As BlueM.Opt.Common.Individuum + Dim startind As Individuum startind = Me.mProblem.getIndividuumStart() diff --git a/BlueM.Opt/Main/My Project/AssemblyInfo.vb b/BlueM.Opt/Main/My Project/AssemblyInfo.vb index 1e29c719..f7bc4249 100644 --- a/BlueM.Opt/Main/My Project/AssemblyInfo.vb +++ b/BlueM.Opt/Main/My Project/AssemblyInfo.vb @@ -1,7 +1,7 @@ Imports System.Reflection Imports System.Runtime.CompilerServices Imports System.Runtime.InteropServices -Imports BlueM.Opt.Common.Constants +Imports BlueM.Opt.Common ' Allgemeine Informationen über eine Assembly werden über die folgende ' Attributgruppe gesteuert. Ändern Sie diese Attributwerte, um die @@ -9,10 +9,10 @@ Imports BlueM.Opt.Common.Constants - diff --git a/BlueM.Opt/Main/SolutionDialog.vb b/BlueM.Opt/Main/SolutionDialog.vb index b30ef2f1..1bcea771 100644 --- a/BlueM.Opt/Main/SolutionDialog.vb +++ b/BlueM.Opt/Main/SolutionDialog.vb @@ -15,6 +15,8 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports BlueM.Opt.Common + ''' ''' Zeigt die ausgewählten Lösungen an ''' @@ -22,7 +24,7 @@ Partial Public Class SolutionDialog Inherits System.Windows.Forms.Form 'Das Problem - Private mProblem As BlueM.Opt.Common.Problem + Private mProblem As Problem 'Properties '********** @@ -52,7 +54,7 @@ Partial Public Class SolutionDialog ''' Konstruktor ''' ''' Das Problem - Public Sub New(ByRef prob As BlueM.Opt.Common.Problem) + Public Sub New(ByRef prob As Problem) ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. InitializeComponent() @@ -75,7 +77,7 @@ Partial Public Class SolutionDialog 'Ziele '-------- - For Each feature As Common.ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions + For Each feature As ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions column = New DataGridViewTextBoxColumn With { .Name = feature.Description, .ReadOnly = True, @@ -97,7 +99,7 @@ Partial Public Class SolutionDialog '----------- cellstyle.BackColor = Color.LightCoral - For Each Constraint As Common.Constraintfunction In Me.mProblem.List_Constraintfunctions + For Each Constraint As Constraintfunction In Me.mProblem.List_Constraintfunctions column = New DataGridViewTextBoxColumn With { .Name = Constraint.Bezeichnung, .DefaultCellStyle = cellstyle.Clone(), @@ -112,7 +114,7 @@ Partial Public Class SolutionDialog '------------ cellstyle.BackColor = Color.LightGray - For Each OptPara As BlueM.Opt.Common.OptParameter In Me.mProblem.List_OptParameter + For Each OptPara As OptParameter In Me.mProblem.List_OptParameter column = New DataGridViewTextBoxColumn With { .Name = OptPara.Bezeichnung, .DefaultCellStyle = cellstyle.Clone(), @@ -135,7 +137,7 @@ Partial Public Class SolutionDialog ''' Ein Individuum zur Lösungsauswahl hinzufügen ''' ''' das ausgewählte Individuum - Public Sub addSolution(ByVal ind As Common.Individuum) + Public Sub addSolution(ByVal ind As Individuum) Dim i As Integer Dim cellvalues() As Object diff --git a/BlueM.Opt/OptResult/MDBImportDialog.vb b/BlueM.Opt/OptResult/MDBImportDialog.vb index 4f963aa4..828958a3 100644 --- a/BlueM.Opt/OptResult/MDBImportDialog.vb +++ b/BlueM.Opt/OptResult/MDBImportDialog.vb @@ -15,11 +15,13 @@ 'You should have received a copy of the GNU General Public License 'along with this program. If not, see . ' +Imports BlueM.Opt.Common + Public Class MDBImportDialog - Private mProblem As BlueM.Opt.Common.Problem + Private mProblem As Problem - Public Sub New(ByRef prob As BlueM.Opt.Common.Problem) + Public Sub New(ByRef prob As Problem) ' This call is required by the Windows Form Designer. InitializeComponent() @@ -33,9 +35,9 @@ Public Class MDBImportDialog '********* Private Sub MDBImportDialog_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load - 'Listboxen füllen + 'Listboxen füllen Dim bezeichnung As String - For Each feature As Common.ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions + For Each feature As ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions bezeichnung = feature.Description 'Penalty-Funktionen mit Sternchen markieren If (feature.isPrimObjective) Then bezeichnung &= " (*)" @@ -62,11 +64,11 @@ Public Class MDBImportDialog End If End Sub - 'Überprüfung der Benutzereingabe + 'Überprüfung der Benutzereingabe '******************************* Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click If (Me.ListBox_ZieleY.Enabled) Then - 'Mindestens eine X- und Y-Achse ausgewählt? + 'Mindestens eine X- und Y-Achse ausgewählt? If (Me.ListBox_ZieleX.SelectedIndex = -1 Or Me.ListBox_ZieleY.SelectedIndex = -1) Then MsgBox("Please select at least one X and Y axis!", MsgBoxStyle.Exclamation) Me.DialogResult = Windows.Forms.DialogResult.None @@ -74,11 +76,11 @@ Public Class MDBImportDialog End If End If - 'Unterschiedliche Achsen ausgewählt? + 'Unterschiedliche Achsen ausgewählt? If (Me.ListBox_ZieleY.Enabled) Then - If (Me.ListBox_ZieleX.SelectedIndex = Me.ListBox_ZieleY.SelectedIndex Or _ - (Not Me.ListBox_ZieleZ.SelectedIndex = -1 And _ - (Me.ListBox_ZieleX.SelectedIndex = Me.ListBox_ZieleZ.SelectedIndex Or _ + If (Me.ListBox_ZieleX.SelectedIndex = Me.ListBox_ZieleY.SelectedIndex Or + (Not Me.ListBox_ZieleZ.SelectedIndex = -1 And + (Me.ListBox_ZieleX.SelectedIndex = Me.ListBox_ZieleZ.SelectedIndex Or Me.ListBox_ZieleY.SelectedIndex = Me.ListBox_ZieleZ.SelectedIndex))) Then MsgBox("Please select different axes for each objective function!", MsgBoxStyle.Exclamation) Me.DialogResult = Windows.Forms.DialogResult.None diff --git a/BlueM.Opt/OptResult/OptResult.vb b/BlueM.Opt/OptResult/OptResult.vb index 66aa319c..e0292f51 100644 --- a/BlueM.Opt/OptResult/OptResult.vb +++ b/BlueM.Opt/OptResult/OptResult.vb @@ -16,6 +16,7 @@ 'along with this program. If not, see . ' Imports System.Data.OleDb +Imports BlueM.Opt.Common ''' ''' Speichert und verwaltet die Ergebnisse eines Optimierungslaufs, @@ -27,7 +28,7 @@ Public Class OptResult Private Datensatz As String 'Das Problem - Private mProblem As Common.Problem + Private mProblem As Problem 'Ergebnisdatenbank Public Ergebnisdb As Boolean = True 'Gibt an, ob die Ergebnisdatenbank geschrieben werden soll @@ -35,7 +36,7 @@ Public Class OptResult Private db As OleDb.OleDbConnection 'Array von Lösungen - Public Solutions() As Common.Individuum + Public Solutions() As Individuum 'Structure für Sekundäre Population Public Structure Struct_SekPop @@ -61,7 +62,7 @@ Public Class OptResult ''' ''' ''' optional start time to use for the database filename - Public Sub New(ByVal Datensatzname As String, ByRef prob As Common.Problem, Optional ByVal createNewMdb As Boolean = True, Optional starttime As DateTime = Nothing) + Public Sub New(ByVal Datensatzname As String, ByRef prob As Problem, Optional ByVal createNewMdb As Boolean = True, Optional starttime As DateTime = Nothing) 'Standardmäßig mit Optparametern Me.holdsOptparameters = True @@ -109,9 +110,9 @@ Public Class OptResult 'Ausgewählte Lösungen holen '************************** - Public ReadOnly Property getSelectedSolutions() As Common.Individuum() + Public ReadOnly Property getSelectedSolutions() As Individuum() Get - Dim solutions() As Common.Individuum + Dim solutions() As Individuum solutions = getSolutions(Me.selSolutionIDs) @@ -129,7 +130,7 @@ Public Class OptResult 'Eine Lösung zum Optimierungsergebnis hinzufügen '*********************************************** - Public Sub addSolution(ByVal Ind As Common.Individuum) + Public Sub addSolution(ByVal Ind As Individuum) 'Lösung zu OptResult hinzufügen ReDim Preserve Me.Solutions(Me.Solutions.GetUpperBound(0) + 1) @@ -142,7 +143,7 @@ Public Class OptResult 'Eine Lösung identifizieren '************************** - Public Function getSolution(ByVal ID As Integer) As Common.Individuum + Public Function getSolution(ByVal ID As Integer) As Individuum Dim i As Integer @@ -158,13 +159,13 @@ Public Class OptResult 'Sekundäre Population hinzufügen '******************************* - Public Sub setSekPop(ByVal pop() As Common.Individuum, ByVal _igen As Integer) + Public Sub setSekPop(ByVal pop() As Individuum, ByVal _igen As Integer) Dim SekPop As Struct_SekPop Dim sekpopvalues(,) As Double 'Population in Array von Penalty-Werten transformieren - sekpopvalues = Common.Individuum.Get_All_Penalty_of_Array(pop) + sekpopvalues = Individuum.Get_All_Penalty_of_Array(pop) 'SekPop in DB speichern Call Me.db_setSekPop(sekpopvalues, _igen) @@ -190,9 +191,9 @@ Public Class OptResult 'Sekundäre Population holen '************************** - Public Function getSekPop(Optional ByVal _igen As Integer = -1) As Common.Individuum() + Public Function getSekPop(Optional ByVal _igen As Integer = -1) As Individuum() - Dim sekpopsolutions() As Common.Individuum + Dim sekpopsolutions() As Individuum 'Wenn keine Generation angegeben, dann letzte SekPop ausgeben If (_igen = -1) Then @@ -219,7 +220,7 @@ Public Class OptResult '********************************************************* Public Function getSekPopValues(Optional ByVal igen As Integer = -1) As Double(,) - Dim inds() As Common.Individuum + Dim inds() As Individuum Dim values(,) As Double Dim i, j As Integer @@ -250,10 +251,10 @@ Public Class OptResult 'Lösungen anhand von IDs holen '***************************** - Private Function getSolutions(ByVal IDs() As Integer) As Common.Individuum() + Private Function getSolutions(ByVal IDs() As Integer) As Individuum() Dim i As Integer - Dim solutions() As Common.Individuum + Dim solutions() As Individuum ReDim solutions(IDs.GetUpperBound(0)) @@ -267,10 +268,10 @@ Public Class OptResult 'Beste Lösung zurückgeben '************************ - Public Function getBestSolution() As Common.Individuum + Public Function getBestSolution() As Individuum Dim i As Integer - Dim bestInd As Common.Individuum + Dim bestInd As Individuum bestInd = Solutions(0) @@ -307,7 +308,7 @@ Public Class OptResult Me.db_path = IO.Path.Combine(workdir, filename) 'Pfad zur Vorlage - Dim db_source_path As String = IO.Path.Combine(System.Windows.Forms.Application.StartupPath(), "EVO.mdb") + Dim db_source_path As String = IO.Path.Combine(Windows.Forms.Application.StartupPath(), "EVO.mdb") 'Datei kopieren My.Computer.FileSystem.CopyFile(db_source_path, Me.db_path, True) @@ -320,13 +321,13 @@ Public Class OptResult 'Methodenspezifische Anpassungen Select Case Me.mProblem.Method - Case Common.METH_PES, Common.METH_METAEVO, Common.METH_SENSIPLOT, Common.METH_HOOKEJEEVES, Common.METH_DDS + Case Constants.METH_PES, Constants.METH_METAEVO, Constants.METH_SENSIPLOT, Constants.METH_HOOKEJEEVES, Constants.METH_DDS Call Me.db_prepare_PES() Case Else Throw New NotImplementedException($"Method '{Me.mProblem.Method}' not implemented in OptResult.db_init()!") End Select - Common.Log.AddMessage(Common.Log.levels.info, $"Initialized result database {filename}") + Log.AddMessage(Log.levels.info, $"Initialized result database {filename}") End Sub @@ -345,7 +346,7 @@ Public Class OptResult '---------------- 'Spalten festlegen: fieldnames = New List(Of String) - For Each objfun As Common.ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions + For Each objfun As ObjectiveFunction In Me.mProblem.List_ObjectiveFunctions fieldnames.Add($"[{objfun.Description}] DOUBLE") Next 'Tabelle anpassen @@ -357,7 +358,7 @@ Public Class OptResult If (Me.mProblem.NumConstraints > 0) Then 'Spalten festlegen: fieldnames = New List(Of String) - For Each constraint As Common.Constraintfunction In Me.mProblem.List_Constraintfunctions + For Each constraint As Constraintfunction In Me.mProblem.List_Constraintfunctions fieldnames.Add($"[{constraint.Bezeichnung}] DOUBLE") Next 'Tabelle anpassen @@ -380,7 +381,7 @@ Public Class OptResult '---------------------- 'Spalten festlegen: Dim fieldnames As New List(Of String) - For Each optpara As Common.OptParameter In Me.mProblem.List_OptParameter + For Each optpara As OptParameter In Me.mProblem.List_OptParameter fieldnames.Add($"[{optpara.Bezeichnung}] DOUBLE") Next 'Tabelle anpassen @@ -421,7 +422,7 @@ Public Class OptResult 'Eine PES-Lösung in die ErgebnisDB schreiben '******************************************* - Private Overloads Function db_insert(ByVal ind As Common.Individuum) As Boolean + Private Overloads Function db_insert(ByVal ind As Individuum) As Boolean Call db_connect() @@ -442,7 +443,7 @@ Public Class OptResult fieldvalues = New List(Of String) For i = 0 To Me.mProblem.NumObjectives - 1 fieldnames.Add($"[{Me.mProblem.List_ObjectiveFunctions(i).Description}]") - fieldvalues.Add(ind.Objectives(i).ToString(Common.Provider.FortranProvider)) + fieldvalues.Add(ind.Objectives(i).ToString(Provider.FortranProvider)) Next command.CommandText = "INSERT INTO QWerte (Sim_ID, " & String.Join(", ", fieldnames) & $") VALUES ({ind.ID}, " & String.Join(", ", fieldvalues) & ");" command.ExecuteNonQuery() @@ -454,7 +455,7 @@ Public Class OptResult fieldvalues = New List(Of String) For i = 0 To Me.mProblem.NumConstraints - 1 fieldnames.Add($"[{Me.mProblem.List_Constraintfunctions(i).Bezeichnung}]") - fieldvalues.Add(ind.Constraints(i).ToString(Common.Provider.FortranProvider)) + fieldvalues.Add(ind.Constraints(i).ToString(Provider.FortranProvider)) Next command.CommandText = "INSERT INTO [Constraints] (Sim_ID, " & String.Join(", ", fieldnames) & $") VALUES ({ind.ID}, " & String.Join(", ", fieldvalues) & ");" command.ExecuteNonQuery() @@ -466,7 +467,7 @@ Public Class OptResult fieldvalues = New List(Of String) For i = 0 To Me.mProblem.List_OptParameter.GetUpperBound(0) fieldnames.Add($"[{Me.mProblem.List_OptParameter(i).Bezeichnung}]") - fieldvalues.Add(ind.OptParameter(i).RWert.ToString(Common.Provider.FortranProvider)) + fieldvalues.Add(ind.OptParameter(i).RWert.ToString(Provider.FortranProvider)) Next command.CommandText = "INSERT INTO OptParameter (Sim_ID, " & String.Join(", ", fieldnames) & $") VALUES ({ind.ID}, " & String.Join(", ", fieldvalues) & ");" command.ExecuteNonQuery() @@ -496,7 +497,7 @@ Public Class OptResult 'zugehörige Sim_ID bestimmen bedingung = "" For j = 0 To Me.mProblem.NumPrimObjective - 1 - bedingung &= $" AND QWerte.[{Me.mProblem.List_PrimObjectiveFunctions(j).Description}] = " & SekPop(i, j).ToString(Common.Provider.FortranProvider) + bedingung &= $" AND QWerte.[{Me.mProblem.List_PrimObjectiveFunctions(j).Description}] = " & SekPop(i, j).ToString(Provider.FortranProvider) Next command.CommandText = $"SELECT Sim.ID FROM Sim INNER JOIN QWerte ON Sim.ID = QWerte.Sim_ID WHERE (1=1{bedingung});" Sim_ID = command.ExecuteScalar() @@ -598,12 +599,12 @@ Public Class OptResult Me.db_path = sourceFile Select Case Me.mProblem.Method - Case Common.METH_PES, Common.METH_HOOKEJEEVES, Common.METH_METAEVO + Case Constants.METH_PES, Constants.METH_HOOKEJEEVES, Constants.METH_METAEVO 'Individuen laden Call Me.db_getIndividuen_PES() 'Sekundärpopulationen laden Call Me.db_loadSekPops() - Case Common.METH_SENSIPLOT + Case Constants.METH_SENSIPLOT 'Nur Individuen laden Call Me.db_getIndividuen_PES() Case Else @@ -611,7 +612,7 @@ Public Class OptResult End Select Catch ex As Exception - Throw New Exception("Failed to load optimization result!" & Common.eol & ex.Message) + Throw New Exception("Failed to load optimization result!" & Constants.eol & ex.Message) End Try End Sub @@ -653,9 +654,9 @@ Public Class OptResult For i = 0 To numSolutions - 1 - Me.Solutions(i) = New Common.Individuum_PES("Solution", i) + Me.Solutions(i) = New Individuum_PES("Solution", i) - With CType(Me.Solutions(i), Common.Individuum_PES) + With CType(Me.Solutions(i), Individuum_PES) 'ID '-- .ID = ds.Tables(0).Rows(i).Item("Sim.ID") diff --git a/BlueM.Opt/Tests/SensiPlot_ParameterSampling/ParameterSampling.vb b/BlueM.Opt/Tests/SensiPlot_ParameterSampling/ParameterSampling.vb index 76796f38..97d898c0 100644 --- a/BlueM.Opt/Tests/SensiPlot_ParameterSampling/ParameterSampling.vb +++ b/BlueM.Opt/Tests/SensiPlot_ParameterSampling/ParameterSampling.vb @@ -1,4 +1,4 @@ -'BlueM.Opt +'BlueM.Opt 'Copyright (C) BlueM Dev Group 'Website: ' @@ -16,6 +16,7 @@ 'along with this program. If not, see . ' Imports System.Windows.Forms +Imports BlueM.Opt.Common ''' ''' Form with diagram for testing SensiPlot ParameterSampling @@ -45,15 +46,15 @@ Public Class ParameterSampling 'sample optparameters Dim parameterCombinations As List(Of Double()) - Dim sampler As New BlueM.Opt.Algos.SensiPlot.ParameterSampler() + Dim sampler As New Algos.SensiPlot.ParameterSampler() - parameterCombinations = sampler.Sample(NumParams, NumSteps, BlueM.Opt.Common.Settings_Sensiplot.SensiType.evenDistribution) + parameterCombinations = sampler.Sample(NumParams, NumSteps, Settings_Sensiplot.SensiType.evenDistribution) plotParameterCombinations(parameterCombinations, "even distribution") - parameterCombinations = sampler.Sample(NumParams, NumSteps, BlueM.Opt.Common.Settings_Sensiplot.SensiType.randomDistribution) + parameterCombinations = sampler.Sample(NumParams, NumSteps, Settings_Sensiplot.SensiType.randomDistribution) plotParameterCombinations(parameterCombinations, "random distribution") - parameterCombinations = sampler.Sample(NumParams, NumSteps, BlueM.Opt.Common.Settings_Sensiplot.SensiType.latinHypercube) + parameterCombinations = sampler.Sample(NumParams, NumSteps, Settings_Sensiplot.SensiType.latinHypercube) plotParameterCombinations(parameterCombinations, "latin hypercube sampling") End Sub