全局优化:如何更一致地找到相同的最小值?

时间:2018-12-03 06:07:28

标签: python python-3.x optimization scipy

目前,我正在使用scipy库中的盆地跳跃法来找到优化我的目标函数的最优x(其中x由4个因子组成)。当我让它运行几次时,每次运行都会给我不同的结果。有没有办法使结果更一致(即在多次迭代中函数的最小化参数相同)?

cons = [
    {
        'type': 'eq',
        'fun': lambda x: x[0] + x[1] + x[2] - 1
    },
    {
        'type': 'ineq',
        'fun': lambda x: (w_0 / prob_death(T)[T-1]) - x[3]
    },
    {
        'type': 'ineq',
        'fun': lambda x: x[3] - 10000
     }
]

bounds = ( (0, 1), (0, 1), (0, 1), (0, 1'000'000)) )

res = basinhopping(func = utility_expected,
          x0 = np.array([0.33, 0.33, 0.33, 50000]),
          minimizer_kwargs = {"method": 'SLSQP',
          "bounds": bounds,
          "constraints": cons,
          "options": {
              "eps": 0.01,
              "ftol": 0.001
              }
          }, 
          disp = False,
          interval = 40,
          niter = 250)

1 个答案:

答案 0 :(得分:1)

因此,我对scipy的盆地跳跃特别不熟悉,但是如果我没看错,您给它的epsilon为0.01,可用于Jacobian的数值逼近。但是,变量的比例差异很大。 (0-1与0-1000000),这可能会给您带来怪异的行为。考虑将第四个变量缩放为0-1。

此外,对于您要求优化器执行的操作而言,250次迭代确实是一个很小的数目。尝试使其运行更长。