带权请求策略的几种算法
2010-08-28 00:08 by Creason New, 1020 visits, 收藏, 编辑在看《算法设计》的贪心算法时,有一个问题:Weight Interval Scheduling,也就是常常提到的带权请求策略问题,这个算法经常用到,比如CPU的进程调度,资源调度等。书中给出的方案是使用动态规划算法解出的,后来我发现也可以从图论的角度解决,就整理了一下思路,想出了几个解决问题的其它方案,在这里跟大家一同分享一下,探讨还有没有更多解法。
问题描述
在一定时间段内,有n个请求需要占用同一资源,它们的起始和结束时间各不相同,每一个请求有一个权值,指示完成请求所付的报酬。那么,怎么才能得到最大的报酬。

Figure 1.1 A simple instance of weighted interval scheduling
动态规划法
每一个请求i,都有起始和结束时间si,fi,共有n个请求,假设S是最终的解,那么S∈{1..n},解为∑(i∈S)vi。这里我们还要定义一个变量,p(i):
p(i):按照结束时间对n个请求正序排序,p(i)代表请求i前的结束时间最晚而且不相冲突的请求的索引,即i前最近的不相冲突的请求的索引,如果没有则为0。

Figure 2.1 An instance of weighted interval scheduling with the functions p(i) defined for each interval i.
设Oi为包含请求i的最优解,OPT(i)为Oi的总权值,那么OPT(0)=0,所以我们要求的便是On中的n,设j=n,当j∈Oj时,那么OPT(j)=vj+OPT(p(j)),如果!j∈Oj,那么OPT(j)=OPT(j-1),于是:
OPT(j) = max( vj+OPT(p(j)) , OPT(j-1) ).
如果j属于最优解,那么当且仅当:vj+OPT(p(j)) >= OPT(j-1)
则整个过程为:
Compute-Opt(j) If j=0 then Return 0 Else Return max(vj+Compute-Opt(p(j)), Compute-Opt(j-1)) Endif
在程序运行时,我们发现很多时候我们重新计算了很多值,如果问题的规模非常大,那么这将是笔不小的开销:

Figure 2.2 The tree of subproblems called by Compute-Opt
所以,要一个数组保存Opt(j)的值,改进后的算法为:
M-Compute-Opt(j) If j=0 then Return 0 Else if M[j] is not empty then Return M[j] Else Define M[j] = max(vj+M-Compute-Opt(p(j)), M-Compute-Opt(j-1)) Return M[j] Endif
最终算法的时间复杂度为O(n),已经相当出色了,这就是动态规划的实力。
最大连通图法
我将通过一个实例来阐述这种方法,如下面图中的情况:

Figure 3.1 An instance of weighted interval scheduling with longest path
首先,我把所有请求的起始终止时间投影到时间轴上,并对它们编号。
然后,绘制出图,其中点为时间点,边为时间点间的请求,边的权值为该请求的权值,如图:

Figure 3.2 Process of get a graph from requests
从请求中得到图我们需要做一些额外的工作,正如上图中所示,首先如果请求i位于时间点a,b间,就连接a,b,并把请求i的权值作为边ab的权值。完成这一步我们将得到一个包含多个子图的弱连通图。然后,加入一个起始点s和一个结束点f,s连接到所有子图的最先时间点,f连接到所有子图的最迟时间点,并给它们0权值。最后,也是最重要的一步,就是连接各个子图,这一步有一个原则:
找到子图中最先时间点a,连接a之前的最邻近的时间点,并赋权值0。找子图中最迟的时间点b,连接b之后的最邻近的时间点,并赋权值0。这样,我们就得到一个连通图。继而,使用图的理论求得s,f间的最长路径,继而求解成功。
最大独立集法
独立集就是图中互不连通的点的集合,最大独立集也就是图中点数最多的独立集,根据这一理论,我们可以使用最大独立集法求解。
首先,我们用请求的权值作为图的点,如果请求a,b冲突,就做边ab,于是得到图。然后,根据图的理论求出图的最大独立集。
总结
有关带权请求策略的算法可能还有很多,以上的两种为本人的个人解法,可能没有第一种效率高,但针对不同的问题,使用图论来解决会得到更好的结果,具体的性能分析也没有测试,希望有兴趣的可以试一下。如果,你有更好的算法不妨说出来,让我们一起研究一下。
作者:Creason New(Creason's Blog)
出处: http://www.cnblogs.com/niuchenglei
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。