繁体   English   中英

最小化数组中相邻项的功能

[英]Minimize function in adjacent items of an array

我有一个元素数组( arr )和一个函数( f ),它需要2个元素并返回一个数字。

我需要阵列的排列,使得f(arr[i], arr[i+1])是尽可能少地为每个iarr (它应该循环,即,它也应该最小化f(arr[arr.length - 1], arr[0])

而且, f工作原理类似于距离,所以f(a,b) == f(b,a)

如果效率太低,我就不需要最佳解决方案,但是它可以运行得很好并且很快,因为我需要实时计算它们(我不知道arr长度是多少,但是我认为可以30岁左右)

“使arr中的每个i的f(arr [i],arr [i + 1])尽可能小”是什么意思? 您要最小化总和吗? 您想最大程度地减少其中的最大数量吗? 您是否要首先最小化f(arr [0],arr [1]),然后在所有最小化f(arr [1],arr [2])的解决方案中选择一个,依此类推,等等。上?

如果您想使总和最小化,那么这完全是广义上的旅行商问题(好吧,“度量TSP”,如果您的f确实形成了度量)。 天真的解决方案有巧妙的优化,可以为您提供确切的优化,并在合理的时间内运行约n = 30; 您可以使用其中一种,也可以使用一种启发式的近似方法。

如果您想最小化最大值 ,这是一个更简单的问题,尽管仍然是NP难题:您可以对答案进行二进制搜索; 对于特定值d,绘制具有f(x,y)的线对的边

如果要按Lexiocographic最小化它,这很简单:选择距离最短的对并将其设置为arr [0],arr [1],然后选择最接近arr [1]的arr [2],依此类推。

根据f(,)的来源,这可能比TSP容易得多。 提到这一点对您也很有用。

您不确定要优化的是什么-f(a [i],a [i + 1])值的总和,最大值(或其他值)?

无论如何,由于速度的限制,贪婪可能是最好的选择-选择一个使a [0]的元素(由于回绕而无关紧要),然后选择每个连续的元素a [i + 1]作为是最小化f(a [i],a [i + 1])的那个。

那将是O(n ^ 2),但要包含30个项目,除非这是一个内部循环或可以的事情。 如果您的f()确实是关联的和可交换的,那么您也许可以在O(n log n)中做到这一点。 显然,归结为排序不会更快。

我不认为这种形式的问题定义明确:

让我们改为定义n fcns g_i:Perms-> Reals

g_i(p) = f(a^p[i], a^p[i+1]), and wrap around when i+1 > n

假设要在所有排列上最小化f实际上意味着您可以选择i的值,并在所有排列上最小化g_i ,但是对于任何将g_i最小化的p ,相关但不同的排列将g_j最小化(只需对排列进行共轭)。 因此,对每个i而言 ,说最小化排列的f毫无意义。

除非我们对f(x,y)的结构有更多了解,否则这是一个NP难题。 给定一个图G和任何顶点x,y,令f(x,y)在没有边的情况下为1,在有边的情况下为0。 问题要求的是顶点的排序,以便最大f(arr [i],arr [i + 1])值最小。 由于对于该函数,它只能是0或1,返回0等于在G中找到哈密顿路径,而1表示不存在这样的路径。

该函数必须具有某种不允许该示例易于处理的结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM