繁体   English   中英

动态编程问题

[英]Dynamic programming question

我陷入了算法作业问题之一。 谁能给我一些解决的提示? 这是问题:

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

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

该问题的目的是找到对P的赋值V,以使max1 <= k <= m Tk最小,其中我们假设每个处理器必须至少采用一个模块。 (可以通过在计算和通信时间上添加m个权重为零的虚拟模块来放松这一假设。)开发一种动态编程算法来解决多项式时间(即O(mn))中的这一问题。

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

我认为您也许可以修改Viterbi算法来解决此问题。

好的。 这很容易。 将问题分解为需要最小化的函数,例如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

暂无
暂无

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

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