我正在尝试实现一种最小化单机总延迟的精确算法。我正在网上搜索,以了解如何使用动态编程实现它。我读过Lawler的论文,他在77年提出了一个PSEUDOPOLYNOMIAL算法。但是,仍然无法用java或c#代码映射它。
请您帮我提供一些如何有效实施这种精确算法的参考资料?
Edit-1:@bcat:不是真的。我需要为我们的软件实现它。 :(我仍然无法找到任何指导如何实现它。贪婪的一个很容易实现,但调度的结果并不那么令人印象深刻。
亲切的问候,
Xiaon
答案 0 :(得分:1)
您可以指定特定问题的确切特征,以及不同变量的限制和输入的整体特征。
如果没有这个,我假设你使用这个定义:
您希望在具有n个独立作业的单个计算机调度问题中最小化总延迟,每个作业具有处理时间和截止日期。
您要做的是选择一部分工作,使它们不重叠(单机可用),您也可以选择执行这些工作的顺序,保留截止日期。
我想第一步要按截止日期排序,似乎没有任何好处以某种不同的方式对它们进行排序。
接下来剩下的就是选择子集。这是动态编程提供帮助的地方。我将尝试描述状态和递归关系。
<强>州:强>
[current time][current job] = maximum number of jobs done
<强>关联:强>
您要么处理当前作业并致电
f(current time + processing_time_of[current job],current job +1)
或者您跳过此过程并致电
f(current time,current job +1)
最后,您将这些调用返回的这两个值中的最小值保存到状态
[current time][current job]
然后在时间0和作业0开始递归。
顺便说一下,贪婪似乎做得很好,请看看:
答案 1 :(得分:0)
对于单机,最长处理时间表(也称为减少时间算法)是最佳的,如果您提前知道所有作业并且可以将它们从最长到最短排序(所以您需要做的就是排序)。
正如已经提到的那样,您没有指定有关您的日程安排问题的信息,因此除此之外很难提供帮助(因为没有普遍优化的和高效调度程序)。
答案 2 :(得分:-1)
也许Stony Brook Algorithm Repository的Job Scheduling Section可以帮到你。