Arrays 最小化数组相邻项中的函数

Arrays 最小化数组相邻项中的函数,arrays,algorithm,language-agnostic,permutation,mathematical-optimization,Arrays,Algorithm,Language Agnostic,Permutation,Mathematical Optimization,我有一个元素数组(arr),还有一个函数(f),它接受2个元素并返回一个数字 我需要数组的排列,使得f(arr[I],arr[I+1])对于arr中的每个I尽可能少。(它应该循环,也就是说,它应该最小化f(arr[arr.length-1],arr[0])) 而且,f有点像距离,所以f(a,b)==f(b,a) 如果效率太低,我不需要最佳的解决方案,但需要一个工作合理且速度快的解决方案,因为我需要实时计算它们(我不知道arr的长度是多少,但我认为可能是30左右)什么是“f(arr[I],arr[

我有一个元素数组(
arr
),还有一个函数(
f
),它接受2个元素并返回一个数字

我需要数组的排列,使得
f(arr[I],arr[I+1])
对于
arr
中的每个
I
尽可能少。(它应该循环,也就是说,它应该最小化
f(arr[arr.length-1],arr[0])

而且,
f
有点像距离,所以
f(a,b)==f(b,a)

如果效率太低,我不需要最佳的解决方案,但需要一个工作合理且速度快的解决方案,因为我需要实时计算它们(我不知道
arr
的长度是多少,但我认为可能是30左右)

什么是“f(arr[I],arr[I+1]”每一个i in-arr的意思是否尽可能少?你想最小化总和吗?您想最小化其中最大的一个吗?您想先最小化f(arr[0],arr[1]),然后在所有最小化该值的解决方案中,选择一个最小化f(arr[1],arr[2])的解决方案,依此类推

如果你想最小化和,这正是旅行商问题在其全部的普遍性(好吧,“度量TSP”,如果你的f确实形成了一个度量,也许)。有聪明的优化,以天真的解决方案,将给你确切的最佳,并在合理的时间运行约n=30;你可以使用其中的一种,或者一种能给你近似值的启发式方法

如果你想最小化最大值,这是一个简单的问题,尽管仍然是NP难的:你可以对答案进行二进制搜索;对于特定值d,为具有f(x,y)的线对绘制边 如果您想在词汇上最小化它,那么它很简单:选择距离最短的一对,并将其设置为arr[0]、arr[1],然后选择距离arr[1]最近的arr[2],依此类推


根据f(,)的来源,这可能是一个比TSP容易得多的问题;你也应该提到这一点。

你还不完全清楚你在优化什么——f(a[i],a[i+1])值的总和,它们的最大值,还是其他什么

在任何情况下,由于您的速度限制,贪婪可能是您的最佳选择-选择一个元素来生成[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,如果有边,则f(x,y)为0。该问题要求对顶点进行排序,以使最大f(arr[i],arr[i+1])值最小化。因为对于这个函数,它只能是0或1,返回0等于在G中找到哈密顿路径,1表示不存在这样的路径


函数必须具有某种类型的结构,不允许此示例对其进行处理。

如果使用基于零的数组,则循环条件应为f(arr[arr.length-1],arr[0]),对吗?