Wie implementieren Sie das Gauß-mutation-operator für einen genetischen Algorithmus in Java
Ich versuche zu lernen und zu implementieren eine einfache genetische Algorithmus-Bibliothek für mein Projekt. Zu dieser Zeit, evolution, Selektion der Bevölkerung ist bereit, und ich bin versucht zu implementieren, die eine einfache gut-mutation-operator wie der Gauß-mutation-operator (GVO) für meine genetische evolution engine in Java und Scala.
Ich einige Informationen, die auf Gauß-mutation-operator (GVO) in die Papier Eine mutation-operator, basierend auf ein Pareto-ranking für multi-objective evolutionäre algorithmen (P. M. Mateo, D. Alberto), Seite 6 und 7.
Aber ich habe einige problem zu finden, weitere Informationen zur Implementierung diese GAUSS-mutation-operator und andere nützliche Varianten dieses operators in Java. Was soll ich tun?
Ich bin mit der random.nextGaussian()
Funktion random Java util, aber diese Methode gibt nur eine Zufallszahl zwischen 0 und 1.
So,
a) Wie kann ich ändern, die Präzision der Zahl zurück, die in diesem Fall? (Zum Beispiel, ich möchte eine zufällige double-Zahl zwischen 0 und 1 mit Schritt gleich 0.00001.)
b) und wie kann ich angeben mu
und sigma
für diese Funktion, denn ich möchte Suche lokal über den Wert meines Genoms, nicht zwischen -1 und 1. Wie kann ich gerecht, die lokale Forschung rund um mein Genom Wert?
Nach Forschung, ich fand die Antwort für b) in Frage. Es scheint, ich kann verdrängen die Gaußsche Zufallszahl wie diese:
newGenomeValue = oldGenomeValue + (( gaussiandRndNumber * sigma ) + mean )
wo mean
= mein-Genom-Wert.
(Vgl. Methode der unteren Seite in Wie kann ich das generieren von Zufallszahlen, die mit einer normal-oder Gauß-Verteilung?.)
- Was genau meinst du mit "die Präzision der Zahl zurück"?
- Die zahlen, die der Zahl nach dem Komma : en.wikipedia.org/wiki/Double_precision_floating-point_format
- In welcher Weise wollen Sie "ändern" "die zahlen der Reihe nach durch Komma"?
nextGaussian
gibt Ihnen einedouble
. Sie sagen, das ist nicht genug für Ihre Bedürfnisse? - Ich bin mit dieser Zahl zu Kalibrieren Wahrscheinlichkeit Recht in meiner simulation. Ich brauche eine Zahl zwischen 0,01 und 0.00000001, also, wenn ich ein Doppel mit nur einer Zahl Präzision nach Koma (zum Beispiel 0.11111 0.255525 0.114182 etc. ), ist es problematisch, weil ich muss hinzufügen von zufälligen Zahl wie diese : 0.001, 0.001252, 0,000352, etc.
- Ihr Kommentar enthält eigentlich alles, was Sie brauchen. Die z, z_k, z_k' aus, dass das Papier sind alle 0-mean, stddev 1 Zufallsvariablen (wie man aus nextGaussian()) und Sie einfach skalieren müssen Sie in der gleichen Weise, wie Sie in dem Papier (d.h., meine x_k, stddev von sigma_k für den x_k und exp(tau ' Z+tauz_k) für die multiplikative update zu sigma.
- Ich weiß nicht, ob OP Hinzugefügt tag von AI für ein GA Frage (oder ein Redakteur), aber GAs sind nicht Künstliche Intelligenz, es sei denn, als in den meisten banalen Sinn.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Beantwortung von Fragen ein, alles, was Sie tun müssen ist, Runden auf den nächsten 0.00001 um Ihre Antwort in den Einheiten. Zum Beispiel:
Nun für den b-Teil, Sie haben die richtige Idee und der code sollte funktionieren. Alles, was Sie tun müssen, ist, skalieren Sie Ihre variable auf den gewünschten Bereich. Das einzige, was ich hinzufügen kann ist, dass die zugrunde liegende Grund, warum dies funktioniert, ist die änderung der Variablen theorem aus der Analysis: http://en.wikipedia.org/wiki/Integration_by_substitution
Wenn Sie aus der Arbeit dieser Formel im Fall einer Gauß-Verteilung mit 0 Mittelwert und die Standardabweichung 1 transformiert durch eine lineare Verschiebung und Reskalierung, dann werden Sie sehen, dass das, was Sie aufgeschrieben haben, war ja richtig.
Setzen Sie alle zusammen, hier ist etwas code, der sollte den trick tun:
Empfehle ich dringend zum NICHT verwenden Sie den Java-Zufallszahlengenerator. Es verwendet die linear congruential generator, die bekannte Einschränkungen:
Dementsprechend schlage ich vor, Sie betrachten eine Mersenne-twister-implementation. Insbesondere bin ich mit dem EuGH eine Umsetzung, die auch die Fähigkeit hat, zu erzeugen Gaußschen zahlen.
Wenn Sie müssen die Kompatibilität mit der Java-Random-Schnittstelle verwenden http://code.google.com/p/ecj/source/browse/trunk/ecj/ec/util/MersenneTwister.java.
http://code.google.com/p/ecj/source/browse/trunk/ecj/ec/util/MersenneTwisterFast.java ist schneller, aber es implementiert nicht die Random-Schnittstelle.
Hier ist, wie können Sie generieren eine zufällige Zahl zwischen 0 und n:
Wenn Sie müssen eine Ganzzahl, werfe es
int
aber hinzufügen, n, ie(int)random(n + 1)
Ändern Sie die "Präzision" der Reihe, etwas zu tun:
Dieser Runde wird die variable
rand
2 Dezimalstellen. Natürlich, Sie müssen vorsichtig sein, über den kleinen floating-point-Rundungsfehler, also es wird nicht unbedingt exakt sein.Als für die Umsetzung des GVO, das Papier beschreibt, wie es zu tun, ziemlich genau. Ich bin mir nicht sicher, wie es werden könnte, erklärt klarer. Ich nehme an, Sie haben eine
x
und einsigma
irgendwo im code und Sie nur verwandeln Sie es mithilfe der mathematischen operation beschrieben.