Python 求离散定义函数的全局极小值

Python 求离散定义函数的全局极小值,python,scipy,genetic-algorithm,mathematical-optimization,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,

我有一个四参数函数,我没有数学形式,因为它实际上是几个独立过程的结果。在其最简单的形式中,它可以被认为是一个黑盒,返回一个值,该值取决于调用它的参数
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
的最小值

我知道算法的存在,例如,或中定义的遗传算法,或应该适用于此类优化问题的算法

我不确定的是,考虑到我的代码所施加的限制,我可以使用哪一个,即:没有数学形式的多(四)个参数函数,参数的受限和离散空间


回顾所有这些方法可能需要花费很多时间,因此任何关于我应该尝试应用哪些方法的建议都将不胜感激。

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

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

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

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

  • 模拟退火从大的“跳跃”开始,并逐渐变小,其思想是在跳跃变得太小而被困在那里之前,你最终会到达最大的“山丘”(或山谷,因为你将目标设定为最小值)

  • 当不同的参数或参数组彼此半独立时,遗传算法是很好的。其思想是,小组参数可以通过局部爬山进行独立优化,而重组函数可以将多个优化的子组组合在一起,生成一个超级解。如果所有参数都是紧密耦合的,那么它是无用的

  • 其他算法同样最适合不同的问题。(不幸的是,您的问题描述似乎没有包含相关属性。)

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


    注:如果解的质量比计算时间更重要,您可以始终实施多种方法,并行运行它们,并保留最佳解。

    您需要找到精确的全局最小值还是概率结果就足够了?你完全没有关于功能结构的信息吗?您是否希望相邻输入的功能变化很大,还是相当平稳?你的搜索空间有多大?(有多少维度和每个维度有多少个点?)维度是强相关的还是几乎可分离的?概率结果就足够了(据我所知,如果需要,我可以通过增加算法的运行次数来获得更高的精度)我没有关于函数结构的精确信息,除了它应该为相邻的输入平滑变化之外。搜索空间是四维的(由四个参数给出),每个维度的点数是可调整的,但我希望它总共不会超过1e6个点数(即:每个维度点数的乘积应保持在该值以下).如果你愿意计算所有可能的值,这应该不会太难计算。你能给出a、b、c、d的起点和终点以及步长吗?虽然你称x为黑盒,我们能称x吗?因为你的四个参数是有界的,并且以固定的增量变化,你只有有限数量的可能的值组合。当然,这个数字可能很大,但是你应该考虑穷尽搜索是否有可能。蛮力方法所需的计算可能是非常重复的。您仍然应该仔细考虑以一种避免缓存和重用部分结果计算的方式组织计算(“记忆化”是python中的一种方法)。例如,可能有几个昂贵的数量仅取决于
    a
    b
    c
    ,您需要将这些数量与
    d
    的每个值结合起来。感谢Alexis的推荐。