资源优化:哪一个使用背包,蛮力或任何其他方法?

时间:2016-01-07 14:42:45

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

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

中编写算法

问题在于:假设我有两个大小分别为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 (资源)非常大时,我对性能持怀疑态度。

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

1 个答案:

答案 0 :(得分:0)

背包问题(这是背包问题)是NPC,这意味着,你只能通过蛮力或alghoritms找到解决方案,其具有与暴力相同的O-复杂性,但在平均情况下可以更好...... < / p>

  

它是单线程的,我对n的性能持怀疑态度   (桶)和m(资源)将非常大。

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

有两个好的解决方案:

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

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