使用fmin_powell优化CJA,仅使用正参数

2024-06-10 22:41:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试使用fmin_-powell方法优化系数。 我希望优化器只检查正值。因此,我添加了参数是否为负的条件-返回100000000.0

coeff = np.array([1.,1.,1.,1.])

def run(coeff, *func):
     if (coeff[0] or coeff[1] or coeff[2] or coeff[3]) < 0: return 100000000.0
     else:
          [some math operations]
          return Energy

def optimize(f):
   return opt.fmin_powell(run, coeff, args=(f,f), disp=0)

f = ['1a','2b','3c', '4d', '5e', '6e', '7f', '8g']

p = Pool(processes=8)
async_ret = p.map(optimize,f,chunksize=1)
result = async_ret.get()
p.terminate()

不管怎样,我写下一个条件,我得到的是负值:

    [ 1.  1.  1.  1.]10.1985596621
    [ 1.  1.  1.  1.]10.1985596621
    [ 2.  1.  1.  1.]10.2100842541
    [ 1.  1.  1.  1.]10.1985596621
    [ 0.38196603  1.          1.          1.        ]10.1822540716
    [ 0.14589804  1.          1.          1.        ]10.1678012695
    [ 0.0557281  1.         1.         1.       ]10.1563797355
    [ 0.02128625  1.          1.          1.        ]10.1480644959
    [ 0.01000002  1.          1.          1.        ]10.1433906566
    [  1.55472633e-08  -6.18034000e-01   1.00000000e+00   1.00000000e+00]10.1319877158
    [  1.55472633e-08  -3.23606803e+00   1.00000000e+00   1.00000000e+00]10.1319475286

我做错了什么


Tags: or方法run参数asyncreturndefnp
1条回答
网友
1楼 · 发布于 2024-06-10 22:41:32

虽然从表面上看,通过将成本函数设置为高值来限制搜索空间似乎是个好主意,但这种方法有一些缺点

  1. 您需要确保该值主导成本函数
  2. 优化器不知道该范围被禁止。它只是看到了高昂的成本,但这并不妨碍它去那里
  3. 您正在成本函数中创建平台。当优化器运行到禁止区域时,它可能不知道如何退出,因为函数在各个方向上看起来都是一样的

通常,最好使用有界或有约束的优化器。这样,算法就知道它可能不会去哪里。通常我使用^{},让它根据得到的信息(成本函数、导数、边界、约束)自动选择使用哪种优化算法

但是,如果您确实需要使用不带边界或约束的特定优化算法,您可以通过使成本函数向正值倾斜来帮助它返回到可行区域。例如:

if (coeff[0] or coeff[1] or coeff[2] or coeff[3]) < 0: 
    return (np.minimum(coef, 0)**2 + 1) * 100000000.0

相关问题 更多 >