在使用依赖项调度单元任务时最大化利润

时间:2014-12-07 13:21:21

标签: c++ algorithm optimization job-scheduling maximize

问题我有一些工作要在P秒内安排在无限数量的工作机器上,这些机器之间具有相关性,即。对于每个工作,都有一组工作,只有在完成这项工作后才能安排。在任何机器上以j th 秒调度i th 作业的利润是f(i,j),这是正的。
我的目标是通过在最多P秒内完成一次调度每个作业来最大化总利润。

我们可以假设所有作业都可以在P秒内安排。

事先知道一切,即离线问题。

0 <= f(i,j)&lt; = B.对于所有我,j。

和依赖数是O(n)。

这个问题容易吗? [可能是由于有限约束]

我的方法
为简单起见,首先假设对于一项工作,其利润与时间无关。
即f(i,j)对于所有i而言与j无关,并且仅依赖于i 然后任何适合P秒的拓扑排序都可以。
如果没有依赖关系,那么我们也会为每项工作选择最高的利润给予时间,这也很容易。

但问题是,当工作的利润随着时间的推移随着依赖性而变化时,在这种情况下,我无法想到任何通用算法。

我在处理作业之间的依赖关系时遇到问题,在线调度算法的依赖单元任务是否有任何资源?

请分享任何可以帮助的想法......

更新:我已添加各种参数的界限,因为它们可能是分析问题所必需的。

1 个答案:

答案 0 :(得分:3)

这是一个动态编程问题。让我们简单地假设所有利润都是非负的。

F(i, j)定义为通过安排i'工作以及所有依赖于它的工作(递归向下)在j或更晚的时间来获得的最大利润{1}}第二次,或-1如果不可能的话。

F(i, j) -1 F(i_1, j+1) -1 i_1 i f(i, j) F(i_1, j+1) F(i, j+1)。否则,它是(F(i, 0)加上i)或A之和的较大者。

然后你的答案是B对所有工作C的总和而没有依赖关系。

(如果没有无限制的机器,这个问题就会变得很难......)


以下是如何使用您的问题对MAX-SAT方程进行建模的示例,其中每个子句都包含所有未被否定的项或所有项被否定。

假设我们有4个布尔变量D(A && B) || (!A && !C) || (!B && !C && !D) || (C && D)!&&。作为一个例子,假设我们想要对方程||做最大的可满足性。 (J1 > J2表示不是,J1表示,而J2表示或。)

让我们使用符号J1 > (J2, J3)进行J1) is a dependency for both必须在and之前运行的作业。并在括号上分发,以便A1 > A2 > A3表示B1 > B2 > B3 J2 C1 > C2 > C3 J3`。

现在为布尔人模拟,我们设置了12个工作岗位。 D1 > D2 > D3A2, B2, C2, D223。然后,作业A必须在时间A21发生,布尔11是声明的真实情况&#34; 2发生在时间2&#34 ;.同样对于其他布尔人。

无论他们在什么时间工作,所有这些工作都会获得3的利润。我们引入了3到3个与布尔一样多的工作,但到目前为止这很简单。

现在让我们为子句添加作业。如果这些作业在几秒钟内1(A2, B2) > J1以及(A && B)运行,则每个作业的利润为J2 > (A2, C2))。因此,当您找到布尔值的设置时,将达到您的最大利润,从而最大限度地增加条款的数量。

(!A && !C)模拟J3 > (B2, C2, D2)的真相。

(!B && !C && !D)模拟(C2, D2) > J4的真相。

(C && D)模拟(A && !B)的真相。

{{1}}模拟{{1}}的真相。

这又是一个简单的转变,添加的工作数量等于条款数量。

因此,我们通过调度对MAX-SAT问题进行建模。但我们无法对所有这些进行建模。特别是我们无法使用{{1}}这样的混合否定来构建子句。因此,尽管MAX-SAT是NP-hard,但这种限制版本可能不是。然而,MAX-SAT的其他限制版本,例如MAX-2SAT,往往是NP难的,我的直觉是这个也是。

但是对于这种直觉的证明或反对,你应该在更合适的论坛上提问。与https://cs.stackexchange.com/一样。