scipy.optimize.

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, wobei x das Argument in Form eines 1D-Arrays und args ein 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:

  1. Instanz der Klasse Bounds.

  2. 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önnte method fü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_ratio erreicht, 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.Generator an numpy.random.default_rng übergeben, um einen Generator zu instanziieren. Wenn rng bereits eine Generator-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 von numpy.random.RandomState verwendet.

  • Wenn seed eine Ganzzahl ist, wird eine neue RandomState-Instanz mit seed verwendet.

  • Wenn seed bereits eine Generator- oder RandomState-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.RandomState zu numpy.random.Generator wurde 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. x und f sind die Koordinaten und der Funktionswert des zuletzt gefundenen Minimums, und context hat einen der folgenden Werte

  • 0: 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: x das Lösungsarray, fun der Wert der Funktion an der Lösung und message, das den Grund für die Beendigung beschreibt. Siehe OptimizeResult fü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