什么是超越贪婪算法的有效方法

时间:2009-05-19 14:15:58

标签: algorithm non-greedy

此问题的范围是在受约束的硬件上调度操作。结果的分辨率是计划适合的时钟周期数。搜索空间增长非常迅速,早期决策限制了未来的决策,可能的计划总数迅速呈指数增长。很多可能的调度都是等价的,因为只需交换两条指令的顺序通常会导致相同的时序约束。

基本上,问题是如何在不花太多时间的情况下探索庞大的搜索空间是一个很好的策略。我希望只搜索一小部分,但希望在搜索空间的同时探索不同的部分。

当前的贪婪算法有时会在早期做出愚蠢的决定,并且分支和绑定的尝试都会超出缓慢的程度。

编辑: 想要指出结果是非常二进制的,也许贪婪算法最终使用8个周期,而存在使用分支和绑定仅使用7个周期的解决方案。

第二点是指令之间的数据路由和指令之间的依赖关系存在重大限制,这限制了解决方案之间的通用性。将其视为带有许多排序约束的背包问题,以及由于路由拥塞而完全失败的一些解决方案。

澄清: 在每个循环中,每种类型的操作数量有限,某些操作有两种可能的类型。有一组路由约束可以变化得相当紧张或相当宽容,限制取决于路由拥塞。

4 个答案:

答案 0 :(得分:3)

NP难问题的整数线性优化

根据您的身边限制,您可以使用critical path method或 (如前一个回答所示)dynamic programming。但是,许多调度问题都是NP难的,就像经典的旅行销售人员一样 - 精确的解决方案具有指数搜索时间的最坏情况,正如您在问题中描述的那样。

重要的是要知道虽然NP难问题仍然有一个非常糟糕的最坏情况解决方案时间,但有一种方法经常会产生非常短的计算的精确答案(平均情况是可以接受的,你经常看不到最糟糕的情况。)

这种方法是将您的问题转换为带有整数变量的线性优化问题。有一些免费软件包(如lp-solve)可以有效地解决这些问题。

这种方法的优势在于它可以在可接受的时间内为您提供NP难题的准确答案。我在一些项目中使用了这种方法。

由于您的问题陈述未包含有关边约束的更多详细信息,因此我无法详细介绍如何应用该方法。

编辑/添加:示例实施

以下是有关如何在您的案例中实施此方法的一些细节(当然,我做了一些可能不适用于您的实际问题的假设 - 我只知道您的问题的详细信息):

假设您有50个指令cmd(i)(i = 1..50)要在10个或更少周期循环(t)(t = 1..10)中进行调度。我们引入了500个二进制变量v(i,t)(i = 1..50; t = 1..10),它们表示指令cmd(i)是否在周期(t)执行。此基本设置提供以下线性约束:

v_it integer variables
0<=v_it; v_it<=1;       # 1000 constraints: i=1..50; t=1..10
sum(v_it: t=1..10)==1   # 50 constraints:   i=1..50

现在,我们必须指定你的条件。让我们假设操作cmd(1)... cmd(5)是乘法运算,并且你有两个乘数 - 在任何一个循环中,你最多可以并行执行两个这样的运算:

sum(v_it: i=1..5)<=2    # 10 constraints: t=1..10

对于您的每个资源,您需要添加相应的约束。

另外,我们假设操作cmd(7)取决于操作cmd(2)并且需要在它之后执行。为了使方程更有趣,我们还需要它们之间有两个周期的间隙:

sum(t*v(2,t): t=1..10) + 3 <= sum(t*v(7,t): t=1..10)   # one constraint

注:sum(t * v(2,t):t = 1..10)是周期t,其中v(2,t)等于1。

最后,我们希望尽量减少周期数。这有点棘手,因为你按照我提出的方式获得相当大的数字:我们给每个v(i,t)分配一个随时间呈指数增长的价格:将操作推向未来要比早期执行它们要昂贵得多:

sum(6 ^ t * v(i,t):i = 1..50; t = 1..10) - &gt;最小。 #one target function

我选择6大于5以确保向系统添加一个循环使其比将所有东西压缩到更少的循环更昂贵。副作用是程序将尽可能早地安排操作。您可以通过执行两步优化来避免这种情况:首先,使用此目标函数查找最少数量的必要循环。然后,使用不同的目标函数再次询问相同的问题 - 在开始时限制可用周期的数量,并对以后的操作施加更适度的价格惩罚。你必须玩这个,我希望你有这个想法。

希望您可以在二进制变量中将所有要求表达为线性约束。当然,可能有很多机会利用您对特定问题的洞察力来减少约束或减少变量。

然后,将你的问题交给lp-solve或cplex,让他们找到最好的解决方案!

答案 1 :(得分:1)

乍一看,听起来这个问题可能适合dynamic programming solution。多个操作可能需要相同的时间,因此您可能会遇到重叠的子问题。

答案 2 :(得分:1)

如果您可以将问题映射到“旅行推销员”(例如:找到在最短时间内运行所有操作的最佳顺序),那么您就会遇到NP完全问题。

解决这个问题的一个非常快捷的方法是ant algorithm(或蚁群优化)。

这个想法是你在每条路上发送一只蚂蚁。蚂蚁在路径上散布一种臭味物质,随着时间的推移蒸发。短的部分意味着当下一只蚂蚁出现时,路径会更加臭。蚂蚁喜欢在干净的路径上臭臭。通过网络运行成千上万的蚂蚁。最臭的路径是最佳路径(或至少非常接近)。

答案 3 :(得分:0)

尝试模拟退火,CFR。 http://en.wikipedia.org/wiki/Simulated_annealing