how to find global minimum in python optimization with bounds?

前端 未结 3 1340
梦谈多话
梦谈多话 2020-12-05 05:46

I have a Python function with 64 variables, and I tried to optimise it using L-BFGS-B method in the minimise function, however this method have quite a strong dependence on

3条回答
  •  爱一瞬间的悲伤
    2020-12-05 06:23

    Many thanks to your detailed reply, but as im fairly new to python, i didnt quite know how to implement the code to my program, but here was my attempt at the optimisation:

    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
    

    the merit function combines x0 with some other values to form 6 control points for 8 curves, then calculates their lengths, radii of curvature, etc. It returns the final merit as linear combinations of those parameters with some weights.

    i used basinhopping with low precisions to find the some minima, then used minimize to increase the precision of the lowest munimum.

    p.s. the platform i am running on is Enthoght canopy 1.3.0, numpy 1.8.0 scipy 0.13.2 mac 10.8.3

提交回复
热议问题