【问题标题】:Resource Optimization: which one to use Knapsack, brute-force or any other approach?资源优化:使用背包、蛮力或任何其他方法?
【发布时间】:2016-04-12 00:10:20
【问题描述】:

在资源分配问题中,我有 n 个桶大小和 m 个资源。资源应该以这样的方式分配给存储桶,以使利用率最大化。我需要在 Node js

中编写算法

问题来了:假设我有 2 个桶,分别是 50 号和 60 号。资源大小为 20、25、40。以下是可能解决方案的更合适的表示:

解决方案 1

|铲斗尺寸 |分配的资源 |利用率 |

| 50             | 20, 25                  | 45/50 = 0.9   |
| 60            | 40                     | 40/60 = 0.667 |
在这种情况下,总利用率 >1.5

解决方案 2

|铲斗尺寸 |分配的资源 |利用率 |

| 50             | 25                     | 25/50 = 0.5   |
| 60            | 20, 40                   | 60/60 = 1.0    |
在这种情况下,总利用率为 1.5

推理:
-- 背包方法将返回解决方案 2,因为它会根据更高的存储桶大小进行优化。
-- Brute-Force 方法将返回两种解决方案。我对这种方法的一个担忧是;鉴于我必须使用 Node js 并且它是单线程的,我对 n(桶)和 m(资源)非常大时的性能持怀疑态度。

蛮力会做得很好,还是有更好的方法/算法可以解决这个问题?另外,我上面提到的担忧在任何意义上都有效吗?

【问题讨论】:

    标签: node.js algorithm optimization brute-force knapsack-problem


    【解决方案1】:

    背包问题(这是背包问题)是NPC,这意味着,您只能通过蛮力或具有与蛮力相同的O复杂度的算法找到解决方案,但在一般情况下可能会更好......

    它是单线程的,我对 n 时的性能有点怀疑 (buckets) 和 m (resources) 会非常大。

    我不确定,如果你知道事情是如何运作的。如果您不创建子线程并处理它们(这并不容易),那么每种标准语言都将在一个线程中运行,因此在一个处理器中运行。如果你想要更多的处理器,你甚至可以在 Node.Js 中创建子线程。 同样在复杂性问题中,如果解决方案需要多次,如果“倍数”是恒定的,也没有关系。在你的情况下,如果你有四核,我想“多个”意味着 4。

    有两个很好的解决方案:

    1)Backtracking - 它基本上是先进的蛮力机制,在相同的情况下可以更快地返回解决方案。

    2) 动态规划 - 如果您有价值相对较低的项目,那么虽然经典的蛮力无法在宇宙本身的预期时间内找到 200 个项目的解决方案,但动态方法可以为您提供解决方案 (毫)秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多