有多项式算法吗?可能是动态编程方法?

时间:2014-03-03 02:07:12

标签: algorithm dynamic-programming

假设您有一组 A = {1,2,..., m }和一组 B = {1 ,2,..., n },这样 A 集合中的每个元素都必须分配给 B 中的某个元素> 的。来自集合 A 的每个元素 i 以及来自集合 B 的每个元素 j 的以下参数是已知的:

  • S ij 是元素 i 分配给元素 j 大于或等于零的成本;
  • t ij 是元素 i 对元素 j 的最小偏好,大于或等于零; < / LI>
  • T ij 是元素 i 对元素 j 的最大偏好,大于或等于零。< / LI>

对于每个固定的 i t ij 的所有值, T ij (对于所有 j )是不同的。 m n 是大于0的整数,其他变量是非负实数。

根据 t ij t ij Ť<子> IJ 的)。例如,如果 t ij &lt; t ik (首选项 T ij T ik 可以在任何情况下使用,进一步阅读),然后将元素 i 分配给 j ,而不是 k 。在 mn 首选项中,它们的 r 必须使用 T ij 的值作为首选项值,剩下的 mn - r 必须使用 t ij 的值(这是较低的值,然后 T ij 的)。

如果将元素 i 分配给元素 j ,则成本 S ij 将添加到分配给元素 j 的总成本,即 C j = C j + S ij 。让 Max 成为所有费用中的最大值 C j Min 所有费用中的最小费用 C <子>Ĵ 的。目标是选择赋值元素 i 到元素 j 的哪些首选项将取 T ij 的值,哪个首选项将采用 t ij 的值,使得值为:

  1. Max 很小;
  2. Max - Min 是最小的。
  3. 我认为有一些动态编程算法,但我不确定。有人知道如何通过DP方法或其他方法解决这个问题吗?然而,它可能不是多项式的,但我认为它是。

    示例。 m = 3, n = 2,即 A = {1,2, 3}和 B = {1,2,3}。设 r = 2,矩阵 S t T

        |5 9|      |1 3|      |10  7|
    S = |7 1|, t = |4 2|, T = | 5  4|.
        |8 4|      |3 4|      | 9 12|
    

    在最小化 Max 的值的情况下,解决方案等于5 。可以构建类似的示例以最小化 Max - Min

1 个答案:

答案 0 :(得分:5)

问题是NP难,可以通过减少Partition来表示。

假设我们有一个算法 M 可以最佳地解决您的问题。

我们获得了一个分区实例 X = { x 1 ,x 2 ,...,x m }并希望将 S 的分区找到两个具有最小和差的子集。设定 n = 2,S ij = x i ,t ij = -j,T ij = j 。现在我们只是迭代所有可能的 r 并调用 M 作为子例程来查找 Max 的全局最小值。我们可以证明导致最小 Max 的分配是 X 的最佳2分区。

由于您不是在处理整数成本,而是使用实际成本,因为 n&gt;可能会使您的问题变得更加困难。 2 (我们也可以直接将 n 二进制文件缩小Bin packing到你的问题中),你的问题似乎不太可能存在假的多元化解决方案除非 P = NP 。您应该考虑使用启发式方法来获得良好的近似解。一个好的起点是查看Bin打包的近似方案,并尝试使它们适应您的问题。也许简单的首选方法足以满足您的需求。还有两件事你应该记住:

  • 您可以二进制搜索 Max ,然后将其用作“bins”的固定上限
  • t ij T ij 可以缩减为各自的argmins以获得固定的 i 。您有一组首选项 T i,1 (从 t ij 中提取)和另一组首选项每个 i T i,2 (从 T ij 中提取)。即使考虑非最小偏好,也没有意义。