动态编程问题

时间:2010-11-14 04:21:41

标签: algorithm dynamic

我遇到了一个算法作业问题。任何人都可以给我一些提示来解决它吗?这是一个问题:

考虑由加权图表G =(V; E)表示的链式结构计算 V = {v1; V2; ......; vn}和E = {(vi; vi + 1)使得1 <= i <= n-1。我们还给出了一个链结构相同的处理器P = {P1; ......; Pm}(即,Pk和Pk + 1之间存在通信链路,其中1 <= k <= m - 1)。

顶点集V表示计算模块,边集E表示 两个模块之间的通信。为每个节点vi分配权重wi,表示该权重 模块在单个处理器上的执行时间。每个边缘(vi; vi + 1)被分配权重ci,表示如果两个模块被分配两个不同的处理器,则它们之间的通信时间量。如果将多个模块分配给同一处理器,则分配给同一处理器的模块必须是连续的。假设模块va; VA + 1; ..; vb被分配给处理器Pk。然后,由Tk表示的Pk所花费的时间是计算分配的模块的时间加上相邻处理器之间的通信时间。因此,Tk = wa + ... + wb + ca-1 + cb。注意,如果a = 1,则ca-1 = 0,如果b = n,则cb = 0。

问题的目的是找到赋值V到P,使得max1 <= k <= m Tk 最小化,我们假设每个处理器必须至少采用一个模块。 (这个 通过在计算上添加m个虚拟模块,可以放宽假设 和沟通时间。) 开发一种动态规划算法,在多项式时间(即O(mn))

中解决这个问题

我试图找到每个Pk的最小执行时间然后找到最大值,但我怀疑我的解决方案是动态编程,因为没有递归公式。请给我一些提示! 谢谢!

2 个答案:

答案 0 :(得分:1)

我认为您可以修改Viterbi算法来解决这个问题。

答案 1 :(得分:0)

好。这很简单。 将你的问题分解为你需要最小化的函数,比如F(n,k)。这导致前n个节点到k个第一处理器的最小分配。 然后像这样导出你的公式,收集第k个处理器上的节点数。

F(n,k) = min[i=0..n]( max(F(i,k-1), w[i]+...+w[n]+c[i-1]+c[n]) )
c[0] = 0
F(*,0) = inf
F(0,*) = inf