std::vector Performance
-
...oder einfach nochmal meinen ersten Beitrag lesen, in dem ein Vektor "vernünftig" sortiert wird.
-
Nur rein der Interesse halber: Was für einen evolutionären Algorithmus implementierst du denn da?
CMA-ES?
NEAT?
CoSyne?//edit ich gehe einfach mal davon aus, dass du sowas implementierst :). Habe mich da durch "Fitness" inspirieren lassen
-
Das geht in Richtung genetische Programmierung...
Aber aktuell bin ich noch damit beschäftigt, die Fitness der Objekte/Genome/whatever performant zu berechnen
Mir ist nur noch nicht ganz klar, wie die Menge merkt, dass sich die Fitness ( der Vergleichswert ) meines Objekts verändert...
Etwa dadurch, dass ich über den Iterator auf das Objekt zugreife ( was ich zwangsläufig muss ) ??Die Sortierung haut noch nicht ganz hin. Jedenfalls ist das "beste" Element nicht auf Menge.begin().
Ich muss mir wohl noch etwas Wissen anlesen
Edit:
Die zehn Elemente und ihre Fitness ( und ihre Adresse ):
0xefed90 -18045.6
0xefe810 -7203.81
0xefd510 -144.109
0xefd230 -8069.77
0xefc1b0 -15442.9
0xedeea0 -22978.7
0xede960 -26723
0xede420 -16040.8
0xeddef0 -13854
0xedf6b0 0und das erste element .begin()
0xefed90Kurz gesagt: die Sortierung funzt nich
Warum das so ist, muss ich jetzt erstmal herausfinden
-
Die Sortierung haut noch nicht ganz hin. Jedenfalls ist das "beste" Element nicht auf Menge.begin().
brauchst du nur das beste? oder die besten n? oder wirklich alle?
struct ltstr { bool operator()( Csystem *ts1, Csystem *ts2 ) const { return ( ts1->GetFitness() < ts2->GetFitness() ); } };
verändert GetFitness das Objekt? Oo
wenn du das zeugs wirklich nur geordnet haben möchtest, wäre Sebastian Pizers Lösung vermutlich die beste...bb
-
ich will es nur sortiert haben. Nein, GetFitness ist wirklich nur ein Getter
Das wichtigste ist mir die Performance.Ich guck mir mal Sebastians Lösung an.
-
It0101 schrieb:
ich will es nur sortiert haben. Nein, GetFitness ist wirklich nur ein Getter
Wozu also Zeiger auf Non-Const?
It0101 schrieb:
Das wichtigste ist mir die Performance.
Dann probier am besten viele Möglichkeiten aus. Bedenke, dass
std::multiset
eine Baumstruktur besitzt und dementsprechend für viele Operationen O(log(n)) impliziert. Dagegen kann ein einzelnesstd::sort()
beimstd::vector
schneller sein. Kommt immer drauf an, welche Operationen du wie oft brauchst.
-
It0101 schrieb:
Ich guck mir mal Sebastians Lösung an.
das for_each sollte bei dir vrmtl entfallen - falls dich das irritiert
bb
-
std::for_each( DatenVector.begin(), DatenVector.end(), std::mem_fun( &(Csystem::CalculateFitness )) );
../src/Cpopulation.cpp:174: error: invalid use of non-static member function 'double Csystem::CalculateFitness(bool)'
Die Funktion muss doch static sein, oder etwa nicht?
-
It0101 schrieb:
std::for_each( DatenVector.begin(), DatenVector.end(), std::mem_fun( &(Csystem::CalculateFitness )) );
../src/Cpopulation.cpp:174: error: invalid use of non-static member function 'double Csystem::CalculateFitness(bool)'
Die Funktion muss doch static sein, oder etwa nicht?
Nein - mem_fun -> member_function...
hättest du dir aber auch selbst beantworten können:
http://www.cplusplus.com/reference/std/functional/mem_fun/Und wie ich schon gesagt hab: brauchst du vermutlich nicht, weil die Fitness schon berechnet ist?!
bb
-
funzt jetzt. Performance is top
Danke euch