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的推荐。