dual_annealing#
- scipy.optimize.dual_annealing(func, bounds, args=(), maxiter=1000, minimizer_kwargs=None, initial_temp=5230.0, restart_temp_ratio=2e-05, visit=2.62, accept=-5.0, maxfun=10000000.0, rng=None, no_local_search=False, callback=None, x0=None)[Quelle]#
Finden Sie das globale Minimum einer Funktion mit Dual Annealing.
- Parameter:
- funccallable
Die zu minimierende Zielfunktion. Muss im Format
f(x, *args)sein, wobeixdas Argument in Form eines 1D-Arrays undargsein Tupel zusätzlicher fester Parameter ist, die zur vollständigen Spezifikation der Funktion erforderlich sind.- boundssequenz oder
Bounds Grenzen für Variablen. Es gibt zwei Möglichkeiten, die Grenzen festzulegen:
Instanz der Klasse
Bounds.Sequenz von
(min, max)Paaren für jedes Element in x.
- argstuple, optional
Alle zusätzlichen festen Parameter, die zur vollständigen Spezifikation der Zielfunktion erforderlich sind.
- maxiterint, optional
Die maximale Anzahl von globalen Suchiterationen. Standardwert ist 1000.
- minimizer_kwargsdict, optional
Schlüsselwortargumente, die an den lokalen Minimierer (
minimize) übergeben werden sollen. Eine wichtige Option könntemethodfür die zu verwendende Methode des lokalen Minimierers sein. Wenn keine Schlüsselwortargumente bereitgestellt werden, ist der lokale Minimierer standardmäßig 'L-BFGS-B' und verwendet die bereits bereitgestellten Grenzen. Wenn minimizer_kwargs angegeben ist, muss das Dict alle Parameter enthalten, die zur Steuerung der lokalen Minimierung erforderlich sind. args wird in diesem Dict ignoriert, da es automatisch übergeben wird. bounds wird nicht automatisch an den lokalen Minimierer übergeben, da die Methode sie möglicherweise nicht unterstützt.- initial_tempfloat, optional
Die Anfangstemperatur. Verwenden Sie höhere Werte, um eine breitere Suche in der Energielandschaft zu ermöglichen und Dual Annealing zu helfen, lokale Minima zu verlassen, in denen es gefangen ist. Standardwert ist 5230. Bereich ist (0.01, 5.e4].
- restart_temp_ratiofloat, optional
Während des Annealing-Prozesses sinkt die Temperatur. Wenn sie
initial_temp * restart_temp_ratioerreicht, wird der Re-Annealing-Prozess ausgelöst. Der Standardwert des Verhältnisses ist 2e-5. Bereich ist (0, 1).- visitfloat, optional
Parameter für die Besuchsdarstellung. Standardwert ist 2.62. Höhere Werte geben der Besuchsdarstellung einen schwereren Schwanz, was den Algorithmus dazu veranlasst, zu einer weiter entfernten Region zu springen. Der Wertebereich ist (1, 3].
- acceptfloat, optional
Parameter für die Akzeptanzdarstellung. Er wird zur Steuerung der Akzeptanzwahrscheinlichkeit verwendet. Je niedriger der Akzeptanzparameter, desto kleiner ist die Akzeptanzwahrscheinlichkeit. Standardwert ist -5.0 mit einem Bereich (-1e4, -5].
- maxfunint, optional
Weiche Grenze für die Anzahl der Aufrufe der Zielfunktion. Wenn der Algorithmus sich mitten in einer lokalen Suche befindet, wird diese Zahl überschritten, und der Algorithmus stoppt kurz nach Abschluss der lokalen Suche. Standardwert ist 1e7.
- rng{None, int,
numpy.random.Generator}, optional Wenn rng als Schlüsselwort übergeben wird, werden andere Typen als
numpy.random.Generatorannumpy.random.default_rngübergeben, um einenGeneratorzu instanziieren. Wenn rng bereits eineGenerator-Instanz ist, dann wird die bereitgestellte Instanz verwendet. Geben Sie rng für reproduzierbares Funktionsverhalten an.Wenn dieses Argument positionsabhängig übergeben wird oder seed als Schlüsselwort übergeben wird, gilt das Legacy-Verhalten für das Argument seed.
Wenn seed None ist (oder
numpy.random), wird die Singleton-Instanz vonnumpy.random.RandomStateverwendet.Wenn seed eine Ganzzahl ist, wird eine neue
RandomState-Instanz mit seed verwendet.Wenn seed bereits eine
Generator- oderRandomState-Instanz ist, dann wird diese Instanz verwendet.
Geändert in Version 1.15.0: Im Rahmen des SPEC-007-Übergangs von der Verwendung von
numpy.random.RandomStatezunumpy.random.Generatorwurde dieses Schlüsselwort von seed zu rng geändert. Für einen Übergangszeitraum funktionieren beide Schlüsselwörter weiterhin, wobei jedoch nur eines gleichzeitig angegeben werden darf. Nach dem Übergangszeitraum geben Funktionsaufrufe mit dem Schlüsselwort seed Warnungen aus. Das Verhalten von seed und rng wird oben beschrieben, aber nur das rng-Schlüsselwort sollte in neuem Code verwendet werden.Geben Sie rng für wiederholbare Minimierungen an. Die generierten Zufallszahlen beeinflussen nur die Besuchsdarstellungsfunktion und die Generierung neuer Koordinaten.
- no_local_searchbool, optional
Wenn no_local_search auf True gesetzt ist, wird eine traditionelle verallgemeinerte simulierte Abkühlung ohne lokale Suchstrategie durchgeführt.
- callbackcallable, optional
Eine Callback-Funktion mit der Signatur
callback(x, f, context), die für alle gefundenen Minima aufgerufen wird.xundfsind die Koordinaten und der Funktionswert des zuletzt gefundenen Minimums, undcontexthat einen der folgenden Werte0: Minimum im Annealing-Prozess erkannt.1: Erkennung im lokalen Suchprozess.2: Erkennung im Dual-Annealing-Prozess.
Wenn die Callback-Implementierung True zurückgibt, wird der Algorithmus gestoppt.
- x0ndarray, shape(n,), optional
Koordinaten eines einzelnen N-dimensionalen Startpunkts.
- Rückgabe:
- resOptimizeResult
Das Optimierungsergebnis, dargestellt als
OptimizeResult-Objekt. Wichtige Attribute sind:xdas Lösungsarray,funder Wert der Funktion an der Lösung undmessage, das den Grund für die Beendigung beschreibt. SieheOptimizeResultfür eine Beschreibung anderer Attribute.
Hinweise
Diese Funktion implementiert die Dual-Annealing-Optimierung. Dieser stochastische Ansatz, abgeleitet von [3], kombiniert die Verallgemeinerung von CSA (Classical Simulated Annealing) und FSA (Fast Simulated Annealing) [1] [2] mit einer Strategie zur Anwendung lokaler Suche an akzeptierten Orten [4]. Eine alternative Implementierung desselben Algorithmus wird in [5] beschrieben, und Benchmarks werden in [6] präsentiert. Dieser Ansatz führt eine fortschrittliche Methode ein, um die durch den verallgemeinerten Annealing-Prozess gefundene Lösung zu verfeinern. Dieser Algorithmus verwendet eine verzerrte Cauchy-Lorentz-Besuchsdarstellung, deren Form durch den Parameter \(q_{v}\) gesteuert wird.
\[g_{q_{v}}(\Delta x(t)) \propto \frac{ \ \left[T_{q_{v}}(t) \right]^{-\frac{D}{3-q_{v}}}}{ \ \left[{1+(q_{v}-1)\frac{(\Delta x(t))^{2}} { \ \left[T_{q_{v}}(t)\right]^{\frac{2}{3-q_{v}}}}}\right]^{ \ \frac{1}{q_{v}-1}+\frac{D-1}{2}}}\]Dabei ist \(t\) die künstliche Zeit. Diese Besuchsdarstellung wird verwendet, um einen Versuchssprungabstand \(\Delta x(t)\) der Variable \(x(t)\) unter künstlicher Temperatur \(T_{q_{v}}(t)\) zu generieren.
Vom Startpunkt aus wird nach dem Aufruf der Besuchsdarstellungsfunktion die Akzeptanzwahrscheinlichkeit wie folgt berechnet:
\[p_{q_{a}} = \min{\{1,\left[1-(1-q_{a}) \beta \Delta E \right]^{ \ \frac{1}{1-q_{a}}}\}}\]Dabei ist \(q_{a}\) ein Akzeptanzparameter. Für \(q_{a}<1\) wird eine Akzeptanzwahrscheinlichkeit von Null für Fälle zugewiesen, in denen
\[[1-(1-q_{a}) \beta \Delta E] < 0\]Die künstliche Temperatur \(T_{q_{v}}(t)\) wird wie folgt verringert:
\[T_{q_{v}}(t) = T_{q_{v}}(1) \frac{2^{q_{v}-1}-1}{\left( \ 1 + t\right)^{q_{v}-1}-1}\]Dabei ist \(q_{v}\) der Besuchsparameter.
Hinzugefügt in Version 1.2.0.
Referenzen
[1]Tsallis C. Possible generalization of Boltzmann-Gibbs statistics. Journal of Statistical Physics, 52, 479-487 (1988).
[2]Tsallis C, Stariolo DA. Generalized Simulated Annealing. Physica A, 233, 395-406 (1996).
[3]Xiang Y, Sun DY, Fan W, Gong XG. Generalized Simulated Annealing Algorithm and Its Application to the Thomson Model. Physics Letters A, 233, 216-220 (1997).
[4]Xiang Y, Gong XG. Efficiency of Generalized Simulated Annealing. Physical Review E, 62, 4473 (2000).
[5]Xiang Y, Gubian S, Suomela B, Hoeng J. Generalized Simulated Annealing for Efficient Global Optimization: the GenSA Package for R. The R Journal, Volume 5/1 (2013).
[6]Mullen, K. Continuous Global Optimization in R. Journal of Statistical Software, 60(6), 1 - 45, (2014). DOI:10.18637/jss.v060.i06
Beispiele
Das folgende Beispiel ist ein 10-dimensionales Problem mit vielen lokalen Minima. Die beteiligte Funktion wird Rastrigin genannt (https://en.wikipedia.org/wiki/Rastrigin_function)
>>> import numpy as np >>> from scipy.optimize import dual_annealing >>> func = lambda x: np.sum(x*x - 10*np.cos(2*np.pi*x)) + 10*np.size(x) >>> lw = [-5.12] * 10 >>> up = [5.12] * 10 >>> ret = dual_annealing(func, bounds=list(zip(lw, up))) >>> ret.x array([-4.26437714e-09, -3.91699361e-09, -1.86149218e-09, -3.97165720e-09, -6.29151648e-09, -6.53145322e-09, -3.93616815e-09, -6.55623025e-09, -6.05775280e-09, -5.00668935e-09]) # random >>> ret.fun 0.000000