【问题标题】:Minimize function in adjacent items of an array最小化数组相邻项中的函数
【发布时间】:2010-09-23 13:43:42
【问题描述】:

我有一个元素数组 (arr),以及一个接受 2 个元素并返回一个数字的函数 (f)。

我需要数组的排列,使得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[arr.length - 1 ], arr[0])) 对吧?

标签: arrays algorithm language-agnostic permutation mathematical-optimization


【解决方案1】:

“使得 f(arr[i], arr[i+1]) 对于 arr 中的每个 i 尽可能少”是什么意思?你想最小化 sum 吗?你想最小化其中最大的吗?你想首先最小化 f(arr[0],arr[1]),然后在所有最小化这个的解决方案中,选择一个最小化 f(arr[1],arr[2]) 等的解决方案,等等开吗?

如果你想最小化 sum,这正是完全概括的旅行推销员问题(嗯,“度量 TSP”,也许,如果你的 f 确实形成一个度量)。对天真的解决方案进行了巧妙的优化,可以为您提供确切的优化并在合理的时间内运行大约 n=30;您可以使用其中之一,或提供近似值的启发式方法之一。

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

如果你想按字典序最小化它,这很简单:选择距离最短的一对并将其作为 arr[0],arr[1],然后选择 arr[2] 即最接近 arr[1],以此类推。

根据你的 f(,)s 来自哪里,这可能比 TSP 容易得多;你也可以提一下。

【讨论】:

    【解决方案2】:

    您并不完全清楚自己在优化什么 - 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) 中做到这一点。减少到排序显然不会更快。

    【讨论】:

      【解决方案3】:

      我认为问题在这种形式中没有得到很好的定义:

      让我们改为定义 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 是没有意义的。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-05-02
          • 2019-11-14
          • 2013-03-01
          • 2021-07-28
          • 1970-01-01
          • 2018-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多