bluemodel / BlueM.Opt

BlueM.Opt is an optimization framework that can be coupled with an arbitrary simulation software.
https://wiki.bluemodel.org/index.php/BlueM.Opt
GNU General Public License v3.0
2 stars 1 forks source link

237: BUG beim NDS Crowding Distance Sort #168

Closed bluemodel-bot closed 2 years ago

bluemodel-bot commented 2 years ago
Original bug ID 237
Reported by huebner on 2007-09-14
Affects version 0.9
Component Algo_PES
Severity critical
Priority P1
Milestone 1.0
Assigned to huebner
Status CLOSED FIXED

Comments:

huebner on 2007-09-14:

Beim NDS Crowding Distance Sort wird das Struct schlicht mit = kopiert. Durch das late Binding wird quasi die Refernz kopiert. Führt wahrscheinlich zu dem Fehler den Felix beobachtet hat. Punkte die hinter den Constrains liegen werden dann mit in die SecPop genommen.

huebner on 2007-09-24:

Fehler tritt auf wenn Array mit dem = Operator kopiert werden. Dann wird per Ref. kopiert:

    Dim Array_A(1) As Double
    Dim Array_B(1) As Double

    Array_A(0) = 5
    Array_A(1) = 6

    Array_B = Array_A                  ByRef
    Array.Copy(Array_A, Array_B, 2)   ByVal

    Array_B(0) = 8
    Array_A(1) = 9

liefert für Array_A: 8 und 9 und für Array_B: 8 und 9

froehlich on 2007-09-24:

und wenn ein Struct kopiert wird, dass Arrays enthält? was geschieht dann mit den Arrays?

huebner on 2007-09-24:

Beim kopieren von Structs tritt das gleiche Verhalten auf. Wird ein Struct mit:

Struct_B(0) = Struct_B(0) kopiert

Dann werden die einzelnen Variablen zwar ByVal kopiert, aber die Arrays des gleichen Structs ByRef.

huebner on 2007-09-24:

Das ganze läst sich mit Array.copy oder .clone lösen.

huebner on 2007-09-24:

Siehe auch:

http://visualbasic.about.com/b/a/214548.htm

huebner on 2007-09-24:

Die .clone Method geht nur direct by Arrays. Nicht Arrays die Structs enthalten.

huebner on 2007-09-24:

Auch mit: Array.Copy(List_Childs, Memory, 1) ist der Sache nicht beizukommen, wenn das Array aus einem Struct besteht und Arrays enthält.

huebner on 2007-09-24:

Bei dem Fall dier im NDSorting stimmt die Sache noch weil hier über das Dritte Element Struct kopiert wird. Aber wahrscheinlich nur im ersten Durchgang. Die Referenzen verwurschteln sich sehr wahrscheinlich erst in den nächsten Runden.

Es müssen also für alle Structs des PES, welche Arrays enthalten eigene copy Funktionen geschrieben uns statt dem istgleich operator verwendet werden!

froehlich on 2007-10-04:

Added attachment: PES.vb.patch: Patch um Schleifen bei 1 beginnen zu lassen

Die jetzigen Copy-Funktionen arbeiten mit Schleifen, die bei 0 anfangen. Im PES fangen alle Arrays aber bei 1 an (siehe Bug 135). Deswegen schlage ich folgenden Patch vor. Christoph, dein Feedback hierzu bitte!

huebner on 2007-10-11:

Klar kann mann machen, aber sollte es nicht das Ziel sein Stück für Stück auf Null basiert umzustellen? Das würde bedeuten wir Dimensionieren die Arrays mit:

  • ReDim TMP.penalty(NPenalty)
  • ReDim TMP.penalty(NPenalty - 1)

froehlich on 2007-10-12:

nicht kann... sondern muss! Im jetzigen Zustand treten bei mir Fehler auf!

Alternativ kann man natürlich auch die Redimensionierungen anpassen, so dass die Arrays bei 0 anfangen, aber das wäre ein weit größeres Stück Arbeit...

huebner on 2007-10-15:

Die Schleifen für das Dimit von NDSorting fangen jetzt erst bei 1 statt bei 0 an. Revision 237.

froehlich on 2007-10-15:

Du meinst Rev 506 ;-)