Vielen Dank an Ihre ausführliche Antwort, aber wie im ziemlich neu in Python, ich habe nicht so recht, wie Sie den Code mein Programm zu implementieren, aber hier war mein Versuch der Optimierung:
x0=np.array((10, 13, f*2.5, 0.08, 10, f*1.5, 0.06, 20,
10, 14, f*2.5, 0.08, 10, f*1.75, 0.07, 20,
10, 15, f*2.5, 0.08, 10, f*2, 0.08, 20,
10, 16, f*2.5, 0.08, 10, f*2.25, 0.09, 20,
10, 17, f*2.5, -0.08, 10, f*2.5, -0.06, 20,
10, 18, f*2.5, -0.08, 10, f*2.75,-0.07, 20,
10, 19, f*2.5, -0.08, 10, f*3, -0.08, 20,
10, 20, f*2.5, -0.08, 10, f*3.25,-0.09, 20))
# boundary for each variable, each element in this restricts the corresponding element above
bnds=((1,12), (1,35), (0,f*6.75), (-0.1, 0.1),(1,35), (0,f*6.75), (-0.1, 0.1),(13, 35),
(1,12), (1,35), (0,f*6.75), (-0.1, 0.1),(1,35), (0,f*6.75), (-0.1, 0.1),(13, 35),
(1,12), (1,35), (0,f*6.75), (-0.1, 0.1),(1,35), (0,f*6.75), (-0.1, 0.1),(13, 35),
(1,12), (1,35), (0,f*6.75), (-0.1, 0.1),(1,35), (0,f*6.75), (-0.1, 0.1),(13, 35),
(1,12), (1,35), (0,f*6.75), (-0.1, 0.1),(1,35), (0,f*6.75), (-0.1, 0.1),(13, 35),
(1,12), (1,35), (0,f*6.75), (-0.1, 0.1),(1,35), (0,f*6.75), (-0.1, 0.1),(13, 35),
(1,12), (1,35), (0,f*6.75), (-0.1, 0.1),(1,35), (0,f*6.75), (-0.1, 0.1),(13, 35),
(1,12), (1,35), (0,f*6.75), (-0.1, 0.1),(1,35), (0,f*6.75), (-0.1, 0.1),(13, 35),)
from scipy.optimize import basinhopping
from scipy.optimize import minimize
merit=a*meritoflength + b*meritofROC + c*meritofproximity +d*(distancetoceiling+distancetofloor)+e*heightorder
minimizer_kwargs = {"method": "L-BFGS-B", "bounds": bnds, "tol":1e0}
ret = basinhopping(merit_function, x0, minimizer_kwargs=minimizer_kwargs, niter=10, T=0.01)
zoom = ret['x']
res = minimize(merit_function, zoom, method = 'L-BFGS-B', bounds=bnds, tol=1e-5)
print res
das Verdienst Funktion kombiniert x0 mit einigen anderen Werten, um 6 Kontrollpunkte für 8 Kurven zu bilden, berechnet dann deren Längen, Krümmungsradien usw. Sie gibt den endgültigen Vorteil als lineare Kombinationen dieser Parameter mit einigen Gewichten zurück.
ich benutzte basinhopping
mit niedrigen Genauigkeiten, um die einige Minima zu finden, dann minimize
verwendet, um die Präzision des niedrigsten munimum zu erhöhen.
p.s. die Plattform, auf der ich laufe, ist Enthoght canopy 1.3.0, numpy 1.8.0 scipy 0.13.2 mac 10.8.3
Ich vermute, dass http://math.stackexchange.com/ ist ein geeigneterer Ort, um Fragen wie diese zu stellen. – 9000
Könntest du bitte deine Funktion etwas beschreiben - glatt/gradient/hessisch? Wenn Sie es als eine Summe von Quadraten formulieren können, siehe [scipy-optimize-leasesq-with-bound-constraints] (http://stackoverflow.com/questions/9878558/scipy-optimize-leastsq-wit-bound-constraints) . Siehe auch [scicomp.stackexchange.com/search?q=bfgs](http://scicomp.stackexchange.com/search?q=bfgs). – denis
Ich entwerfe 8 Bezier-Kurven im 3D-Raum mit jeweils 6 Kontrollpunkten, die zu minimierende Funktion ist die Merit-Funktion für diese Kurven, die eine lineare Kombination von 4 verschiedenen Parametern (Längen, Krümmungsradius, Nähe, Höhenordnung) ist aus den Kurven abgeleitet. Bisher habe ich versucht scipy.minimize(), bassishopping, aber ich bin immer noch nicht das globale Minimum zu finden – dilyar