资源优化:使用背包、蛮力或任何其他方法中的哪一个?
Resource Optimization: which one to use Knapsack, brute-force or any other approach?
在资源分配问题中,我有 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
推理:
-- Knapsack 方法将 return 解决方案 2 因为它会根据更大的桶大小进行优化。
-- 蛮力 方法将return 两种解决方案。我对这种方法的一个担忧是;鉴于我必须使用 Node js 并且它是单线程的,所以我对 n(存储桶)和 m(资源)时的性能持怀疑态度会很大。
Brute-Force 会做的很好还是有更好的 way/algorithm 我可以用来解决这个问题?另外,我上面提到的担忧在任何意义上都是有效的吗?
背包问题(这是背包问题)是NPC,这意味着,您只能通过brute-force或具有O-complexity的算法找到解决方案与蛮力相同,但可以更好平均情况...
it is single threaded, i am little skeptic about performance when n
(buckets) and m (resources) will be very large.
我不确定,如果你知道它是如何工作的。如果您不创建子线程并处理它们(这并不容易),则每种标准语言都将在一个线程中工作,因此在一个处理器中工作。如果你想要更多的处理器,你甚至可以在 Node.Js 中创建子线程。
同样在复杂性问题中,如果解决方案需要 multiple-time 多,如果 "multiple" 是常量,这并不重要。在你的情况下,我想 "multiple" 意味着 4,如果你有 quad-core.
有两个好的解决方案:
1)回溯 - 它基本上是先进的 brute-force 机制,在相同情况下 return 可以更快地解决问题。
2) 动态规划 - 如果你有相对 low-values 的项目,那么虽然经典 brute-force 无法在 universe 本身的预期时间内找到 200 个项目的解决方案,但动态方法可以在 (mili) 秒内为您提供解决方案。
在资源分配问题中,我有 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
推理:
-- Knapsack 方法将 return 解决方案 2 因为它会根据更大的桶大小进行优化。
-- 蛮力 方法将return 两种解决方案。我对这种方法的一个担忧是;鉴于我必须使用 Node js 并且它是单线程的,所以我对 n(存储桶)和 m(资源)时的性能持怀疑态度会很大。
Brute-Force 会做的很好还是有更好的 way/algorithm 我可以用来解决这个问题?另外,我上面提到的担忧在任何意义上都是有效的吗?
背包问题(这是背包问题)是NPC,这意味着,您只能通过brute-force或具有O-complexity的算法找到解决方案与蛮力相同,但可以更好平均情况...
it is single threaded, i am little skeptic about performance when n (buckets) and m (resources) will be very large.
我不确定,如果你知道它是如何工作的。如果您不创建子线程并处理它们(这并不容易),则每种标准语言都将在一个线程中工作,因此在一个处理器中工作。如果你想要更多的处理器,你甚至可以在 Node.Js 中创建子线程。 同样在复杂性问题中,如果解决方案需要 multiple-time 多,如果 "multiple" 是常量,这并不重要。在你的情况下,我想 "multiple" 意味着 4,如果你有 quad-core.
有两个好的解决方案:
1)回溯 - 它基本上是先进的 brute-force 机制,在相同情况下 return 可以更快地解决问题。
2) 动态规划 - 如果你有相对 low-values 的项目,那么虽然经典 brute-force 无法在 universe 本身的预期时间内找到 200 个项目的解决方案,但动态方法可以在 (mili) 秒内为您提供解决方案。