2016-04-21 8 views
4

Beim Ausführen des folgenden Codes springt der Parameter beim siebten Ausdruck des ausgewerteten Parameters (x) von etwa 100 auf 0,01, obwohl die anfängliche Schrittweite auf 0,1 und das Intervall auf 50 gesetzt ist fähig, einen Sprung zu machen, der die Schrittweite um eine so große Größe überschreitet?Scipy Bassinhopping nicht respektieren Schrittgröße?

import multiprocessing as mp 
from scipy.optimize import basinhopping 

def runEnvironment(x): 
    return x**2 

def func(x): 
    print "x:",x 
    pool = mp.Pool(processes=1) 

    results=pool.apply(runEnvironment,(x,)) 
    pool.close() 
    return results 


if __name__ == '__main__': 
    x0=100  
    ret=basinhopping(func, x0, niter=100, T=1.0, stepsize=.1, minimizer_kwargs=None, take_step=None, accept_test=None, callback=None, interval=50, disp=False, niter_success=None) 

Antwort

3

basinhopping ist ein iteratives Verfahren, wo es lokale Minimierung verwendet, nimmt dann ein Schritt im Raum (Schrittgrße) koordiniert dann lokale Minimierungs macht wieder, hoffentlich zu einem anderen Minimum.

Der Parameter stepsize gilt nur für den Schritt im Koordinatenraum.

In Ihrem Beispiel findet der lokale Minimizer (BFGS, denke ich) das globale Minimum bei der ersten Iteration. Der lokale Minimizer verwendet 7 Funktionsauswertungen, um dies zu tun, aber er befindet sich immer noch innerhalb einer Einkanal-Iteration. Beckhopping weiß nicht, dass es auf dem globalen Minimum ist, also versucht es weiter, ein besseres zu finden.

Verwandte Themen