繁体   English   中英

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

[英]What is an efficient way to go beyond a greedy algorithm

这个问题的领域是在受限硬件上调度操作。 结果的分辨率是计划适合的时钟周期数。 搜索空间的增长非常迅速,早期的决策限制了未来的决策,而可能的时间表总数也呈指数级增长。 许多可能的时间表都是等效的,因为仅交换两个指令的顺序通常会导致相同的时序约束。

基本上,问题是在不花费太多时间的情况下探索广阔的搜索空间的最佳策略是什么。 我希望只搜索一小部分,但同时希望探索搜索空间的不同部分。

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

编辑:要指出,结果是非常二进制的,可能是贪心算法以8个周期结束,而存在一个仅使用分支和界限使用7个周期的解决方案。

第二点是,指令之间的数据路由以及指令之间的依赖性存在很大的限制,从而限制了解决方案之间的共性。 可以将其视为一个背包问题,它具有很多排序约束,并且某些解决方案由于路由拥塞而完全失效。

澄清:在每个循环中,每种类型有多少个操作是有限制的,某些操作具有两种可能的类型。 有一组路由约束可以改变为相当严格或相当宽容,并且该限制取决于路由拥塞。

NP难题的整数线性优化

根据您的侧面约束,您可能可以使用关键路径方法或(如先前答案中所建议的) 动态编程 但是,就像传统的旅行销售员一样,许多计划问题也很难解决,就像您在问题中所描述的那样,精确的解决方案在最坏情况下需要指数搜索时间。

重要的是要知道,尽管NP难题仍然具有非常糟糕的最坏情况解决时间,但是有一种方法通常只需要很短的计算就能得出准确的答案( 平均情况是可以接受的,而您通常看不到最坏情况) 。

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

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

由于您的问题说明没有包含有关侧面约束的更多详细信息,因此我无法进一步详细介绍如何应用该方法。

编辑/添加:示例实现

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

假设您有10条指令cmd(i)(i = 1..50)被调度在10个或更少的周期cycle(t)(t = 1..10)中。 我们引入500个二进制变量v(i,t)(i = 1..50; t = 1..10),这些变量指示指令cmd(i)是否在cycle(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)->最小值 #一个目标函数

我选择6大于5,以确保向系统添加一个周期比将所有内容压缩到更少的周期中更加昂贵。 副作用是该程序将尽其所能尽早安排操作。 您可以通过执行两步优化来避免这种情况:首先,使用此目标函数查找所需循环的最小数量。 然后,使用不同的目标函数再次提出相同的问题---一开始就限制了可用周期的数量,并对以后的操作施加了较为适中的价格损失。 您必须尝试一下,希望您有主意。

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

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

乍一看,似乎这个问题可能适合于动态编程解决方案 几个操作可能花费相同的时间,因此您可能会遇到重叠的子问题。

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

解决这个问题的一种快速方法是蚂蚁算法 (或蚁群优化)。

这个想法是您沿着每条路径发送一只蚂蚁。 蚂蚁在路径上散布有气味的物质,该气味随着时间的流逝而蒸发。 较短的部分意味着当下一只蚂蚁出现时,路径会更臭。 蚂蚁喜欢臭味而不是干净的道路。 通过网络运行成千上万的蚂蚁。 最臭的路径是最佳路径(或至少非常靠近路径)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM