迭代地在反抛物线中找到最大值

时间:2018-05-04 11:49:01

标签: python algorithm sorting

我有一个代表反抛物线的数组,我想找到数组中任意位置的最大值。在我的应用程序中,我不能采取衍生物,我必须循环数组。 我通过从左边开始迭代数组来实现这一点,直到我得到一个低于前一次迭代的值:

import numpy as np 

def simulation(n):
    # create inverse parabola
    num = 21
    parabola= np.linspace(-8, 12, num=num)
    parabola= -np.abs(parabola) ** 2
    return parabola[n]


previous_iteration = -1000 # some initialization
for n in range(num):

    # Configure the entire system
    # Run simulation

    # simulation(n) - a function returning simulation result with configuration "n"
    simulation_result = simulation(n)

    if previous_iteration < simulation_result :
        previous_iteration = simulation_result 
    else:
        best_iteration = n-1
        break

print(best_iteration)
print(previous_iteration)

有更快的方法吗?

编辑: 实际的实现将在FPGA上进行,每次迭代我都必须配置系统并运行模拟,因此每次迭代都需要花费大量时间。如果我使用所有可能的配置运行模拟,我将获得抛物线向量,但这将是耗时且非常低效的。 我正在寻找一种方法来找到最大值,同时产生尽可能少的点。不幸的是,for循环必须保留,因为这表示系统的工作方式。这里的关键是更改for循环中的代码。 我编辑了代码以更好地解释我的意思。

4 个答案:

答案 0 :(得分:0)

您要做的是网格搜索。您需要定义搜索网格点(此处为&#39; x&#39;)并计算这些点的抛物线的所有值(此处为&#39; y&#39;)。您可以使用np.argmax查找产生最大值的参数的索引:

import numpy as np

# Define inverse parabola
parabola = lambda x: -np.abs(x)**2

# Search axis
x = np.linspace(-8, 12, 21)

# Calculate parabola at each point
y = parabola(x)

# Find argument that yields maximum value
xmax = x[np.argmax(y)]
print(xmax)           # Should be 0.0

答案 1 :(得分:0)

反抛物线(以均匀间隔的点采样)具有相邻点之间的差异总是减小的特性。最大值就在差异变为负值之前。

如果前两个点之间的差值为负或零,则最大值是数组中的第一个点。

否则,进行二分搜索以找到两个相邻点之间的最小正差。最大值将是这两点中的第二点。

答案 2 :(得分:0)

我编辑这篇文章希望问题现在更清楚了。

答案 3 :(得分:0)

您正在寻找的内容称为&#34;三元搜索&#34;:https://en.wikipedia.org/wiki/Ternary_search

它可以找到任何函数 f(x)的最大值,其中有一个增加的部分,可能后跟一个全部相等的部分,然后是一个递减的部分。

给定界限,选择2点 m1 =低+(高 - 低)/ 3 m2 =低+(高 - 低)* 2/3

然后,如果 f(m1)> f(m2),您知道最大值是 x <= m2 ,因为 m2 不能增加部分。所以设置 high = m2 然后重试。

否则,您知道最大值位于 x&gt; = m1 ,因此设置 low = m1 并重试。

重复直到高 - 低&lt; 3 ,然后选择这些值中最大的一个。