我应该使用哪种优化算法来最大限度地利用时间限制?

时间:2011-07-08 19:39:12

标签: c# java .net algorithm optimization

我想找到一个合适的算法来解决这个问题:

假设我们有N个项目,我们知道每个项目将获得多少钱,以及每个项目需要多少时间(每个项目的预计时间)。我们有一定的时间来完成所有项目。我们希望选择项目,以便我们的利润最大化,总体估计时间不超过可用时间。你能告诉我应该使用哪种优化算法吗?有没有我可以在C#,.NET技术或Java技术中使用的东西?

4 个答案:

答案 0 :(得分:6)

这听起来很简单Knapsack problem

  

给定一组具有权重和值的项目,确定要包含在集合中的每个项目的计数,以使总权重小于或等于给定限制,并且总值与可能的。

在您的情况下,权重是项目所需的时间,限制是时间限制。

通常情况下,如果你是为现实世界做这件事,那么对于小案例来说蛮力就足够了,对于大案例,贪婪的近似应该足够大,如果你真的不关心准确的最大值。但是,我怀疑是否有人会在现实世界中使用如此严格的模型。

在理论上感兴趣的情况下,背包问题是NP难的,是一个活跃的算法领域。

答案 1 :(得分:2)

您正在寻找的内容称为Knapsack problem

在您的情况下,“权重”限制是时间限制,值是值。

答案 2 :(得分:0)

简化后,这看起来像加权http://en.wikipedia.org/wiki/Knapsack_problem。您的时间将是项目的大小,您的体重将是您的成本

答案 3 :(得分:0)

从Operations Research的角度来看这个问题,你正在研究混合整数程序(MIP)的一些问题。背包问题方法可能就足够了,但如果没有对问题进行更详细的说明,我就无法提出更详细的表述。

一旦确定了您的配方,就有几种c#解决方案可用于解决MIP问题。 Microsoft有一个Microsoft Solver Foundation,您可以查看它能够解决简单的MIP并且具有很好的C#API

IBM最近购买了可用于开发MIP配方的OPL优化包(被认为是业界领先的)。一旦你有了这个配方,OPL提供了.NET API,你可以调用它来运行你的模型。

自己走了OPL路线后,如果可能的话,我会避免使用OPL .NET API,因为它们非常麻烦。如果您的问题很简单,您可能需要查看求解器基础,因为与OPL相比,它提供了一个现代而干净的API