Algorithm 如何最小化';你知道它是U形的吗?

Algorithm 如何最小化';你知道它是U形的吗?,algorithm,math,mathematical-optimization,Algorithm,Math,Mathematical Optimization,设f是定义在非负整数n上的函数≥ 0假设f是已知的U形(凸的,并最终增加)。如何找到它的最小值?也就是说,m使得f(m)≤ f(n)表示所有n U形函数的示例: n**2-1000*n+100 (1+1/2+…+1/n)+1000/平方米(1+n) 当然,人类数学家可以尝试使用微积分最小化这些特定函数。不过,对于我的电脑,我想要一个通用的搜索算法,可以最小化任何U形函数 在Python中,这些函数同样可以帮助任何想要测试算法的人 f = lambda n: n**2 - 1000*n +

设f是定义在非负整数n上的函数≥ 0假设f是已知的U形(凸的,并最终增加)。如何找到它的最小值?也就是说,m使得f(m)≤ f(n)表示所有n

U形函数的示例:

  • n**2-1000*n+100
  • (1+1/2+…+1/n)+1000/平方米(1+n)
当然,人类数学家可以尝试使用微积分最小化这些特定函数。不过,对于我的电脑,我想要一个通用的搜索算法,可以最小化任何U形函数


在Python中,这些函数同样可以帮助任何想要测试算法的人

f = lambda n: n**2 - 1000*n + 100
g = lambda n: sum(1/i for i in range(1,n+1)) + 1000/sqrt(1+n)

答案中不一定需要(任何语言的)代码,只需要算法的描述。不过,我想看看这些特定函数的答案。

如果已知您的函数是单峰函数,请使用斐波那契搜索

对于离散域,确定新“测试点”探测位置的方法必须稍微调整,因为连续域的公式不会产生整数。无论如何,工作原理仍然存在

关于所需的测试数量,我们有以下层次结构:

#Fibonacci < #Golden < #Ternary < #Dichotomic
#斐波那契<#黄金<#三元<#二分法

您可能正在寻找。
三元搜索将有助于根据您的要求在
O(logN)
时间中查找
f(m)
,其中
N
是曲线上的点数

它基本上在
(l,r)
范围内取两个点m1和m2,然后在
1/3第
部分递归搜索

python代码(来自维基百科)

def ternarySearch(f, left, right, absolutePrecision):
    while True:
        #left and right are the current bounds; the maximum is between them
        if abs(right - left) < absolutePrecision:
            return (left + right)/2

        leftThird = (2*left + right)/3
        rightThird = (left + 2*right)/3

        if f(leftThird) < f(rightThird):
            right = rightThird
        else:
            left = leftThird
def ternalysearch(f、左、右、绝对精度):
尽管如此:
#左和右是当前边界;最大值介于两者之间
如果abs(右-左)<绝对精度:
返回(左+右)/2
leftThird=(2*左+右)/3
右三分之一=(左+2*右)/3
如果f(左三分之一)
这同样有效。对导数使用二进制搜索以最大化f'0或0 返回二进制搜索(f_素数,0) 其中定义了二进制搜索

def binary_search(f, t):
    """Given an increasing function f, find the greatest non-negative integer n such that f(n) <= t. If f(n) > t for all n, return None."""
def二进制搜索(f,t):
“”“给定一个递增函数f,求最大的非负整数n,使f(n)t对于所有n,返回None。”“”

是否为“您正在寻找的答案类型?”正整数n≥ “0”-我认为您有边界错误。@OliCharlesworth:可能没有;这个问题是关于一个离散输入的函数。梯度下降法适用于多个连续输入。如果你找到了一个最小值必须位于的区域,那么最好尝试指数增加值,然后进行二进制搜索。顺便说一句,对于大的
n
(比如
n>750**2=562500
),你的第二个函数是凹下的。谢谢。这正是我(重新)发明的算法
def binary_search(f, t):
    """Given an increasing function f, find the greatest non-negative integer n such that f(n) <= t. If f(n) > t for all n, return None."""