查找离散定义函数的全局最小值

时间:2014-01-16 19:32:36

标签: python scipy genetic-algorithm mathematical-optimization

我有一个四参数函​​数,我没有数学形式,因为它实际上是几个独立过程的结果。在最简单的形式中,它可以被认为是一个黑盒子,它返回一个值,该值取决于调用它的参数a,b,c,d的值。这就是它的样子:

def my_func(a, b, c, d):
    # Make lots of calculations here to come up with 'func_value',
    # which depends on the values of the parameters given a,b,c,d.
    func_value = x(a, b, c, d)
    return func_value

这四个参数的空间不仅限制在范围内,而且也是离散的。这意味着参数可以具有某些值:

a = [0.004, 0.006, 0.008, 0.010, ...]
b = [0.2, 0.25, 0.3, 0.35, ...]
c = [0.0, 0.01, 0.02, 0.03, ...]
b = [10.1, 10.2, 10.3, 10.4, ...]

而不是介于两者之间的那些(即:它们在步骤中有所不同)。

我需要为此函数找到全局最小值,即:由特定参数值[a_i,b_j,c_k,d_l]组成的集合,它返回my_func可能的最小值。< / p>

我知道存在scipy.optimize.anneal之类的算法或DEAPPyBrainPyevolve中定义的遗传算法应该适用于这种优化问题。

我不确定的是我可以使用哪一个我的代码强加的限制,即:多个(四个)参数功能没有数学形式,参数的限制和离散空间。

检查所有这些方法可能需要花费很多时间,因此我们非常感谢您应该尝试应用的任何指示。

2 个答案:

答案 0 :(得分:1)

正如您所提到的,这是一个常见的优化问题。数学公式很少需要,因为在实践中我们很少有它。一个简化很多的重要特征是函数的凸性(同样,你不需要用数学公式来考虑它,而是全局最大值是唯一的)。

首先,我建议使用以下经典算法之一:

答案 1 :(得分:1)

所有“爬山”算法都依赖于输入中的微小变化导致(通常)输出中的微小变化的假设。您对问题的描述包括对功能图形式的完全没有限制(除了您对概率爬山的兴趣,这意味着它确实适用于您的域)。例如,您无法在加密哈希函数上使用爬山。

但最好的算法在很大程度上取决于问题的其他特征:

  1. 模拟退火开始于逐渐变小的大“跳跃”,这个想法是你在跳跃之前最终在最大的“山丘”(或山谷,因为你制定了你的目标)很小,你被困在那里。

  2. 当不同的参数或它们的组彼此半独立时,遗传算法是好的。这个想法是通过局部爬山可以独立地优化小组参数,并且重组功能可以将几个优化的子组汇集在一起​​以产生超级解决方案。如果所有参数都紧密耦合,那就没用了。

  3. 其他算法同样最适合不同的问题配置文件。 (不幸的是,您的问题描述似乎并未包含相关属性。)

    简而言之:虽然数学公式不是必需的,但您确实需要了解函数图表的行为方式,以及任何投影不变量(有助于x但不依赖于所有四个的数量参数a, b, c, d)。最后这个也有助于加快函数值的计算,正如你所说的那样非常昂贵。我建议您至少在搜索空间中绘制一些低分辨率切片。他们可能会给你一些想法。

    PS。如果解决方案的质量比计算时间更重要,您可以始终实现几种方法,并行运行它们,并保持最佳解决方案。