分布式并行处理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

武汉理工大学

研究生课程论文

课程名称分布式并行处理

论文题目装箱问题的算法报告

专业班级计算机应用1002班

学生姓名李霞

任课老师袁景凌

2010 — 2011 学年第二学期

装箱问题的算法报告

一.实验环境

Visual C++ 6.0,MPICH2

二.实验目的

(1)通过这次实验,更好的了解装箱问题算法的串行下次适应算法和并行下次适应算

法及其思想,对这两个算法进行实现,并分析实验结果。

(2)在(1)的基础上,分析并行算法与串行算法的差别以及并行算法的优越性。 (3)最后通过分析装箱问题的几种算法,理解各种算法的思想及与其他算法相比的优

越性。

三.实验内容

装箱问题及其串行算法:经典的一维装箱问题(Bin Packing Problem)是指,给定n 件物品的序列12,,,n n L a a a =<> ,物品)1(n i a i ≤≤的大小]1,0()(∈i a s ,要求将这些物品装入单位容量1的箱子12,,,m B B B 中,使得每个箱子中的物品大小之和不超过1,并使所使用的箱子数目m 最小。

下次适应算法(Next Fit Algorithm )是最早提出的、最简单的一个在线算法,[Joh73]首次仔细分析了下次适应算法的最坏情况性能。下次适应算法维持一个当前打开的箱子,它依序处理输入物品,当物品到达时检查该物品能否放入这个当前打开的箱子中,若能则放入;否则把物品放入一个新的箱子中,并把这个新箱子作为当前打开的箱子。算法描述如下: 串行下次适应算法

输入:输入物品序列12,,,n L a a a =<> 。

输出:使用的箱子数目m ,各装入物品的箱子12,,,m P B B B =<> 。 procedure NextFit Begin

(1)s (B ) = 1 /* 初始化当前打开的箱子B ,令B 已满 */ (2)m = 0 /* 使用箱子计数 */ (3)for i = 1 to n do

if s (a i ) + s (B ) ≤ 1 then

(i ) s (B ) = s (B ) + s (a i ) /* 把a i 放入B 中 */ else

(i ) m = m + 1 /* 使用的箱子数加一 */ (ii ) B = B m /* 新打开箱子B m */ (iii )s (B ) = s (a i ) /* 把a i 放入B 中 */

end if end for End /* NextFit */

装箱问题的并行算法:下次适应算法使用一遍扫描物品序列来实现,本身具有固有的顺序性,其时间复杂度为O(n)。我们使用平衡树和倍增技术对其进行并行化。首先利用前缀和算法建立一个链表簇,令A[i]为输入物品序列中第i件物品的大小,如果链表指针由A[j]指向A[k],则表示A[j]+A[j+1]+…+A[k]>1且A[j]+A[j+1]+…+A[k-1]≤1;其后利用倍增技术计算以A[1]为头的链表的长度,而以A(1)为头的链表的长度即是下次适应算法所使用的箱子数目。接下来利用在上一步骤中产生的中间数据反向建立一棵二叉树,使该二叉树的叶节点恰好是下次适应算法在各箱子中放入的第一个物品的序号;最后,根据各箱子中放入的第一个物品的序号,使用二分法确定各物品所放入的箱子的序号。

并行下次适应算法

输入:数组A[1,n],其中A[i]为输入物品序列中第i个物品的大小。

输出:使用的箱子数目m,每个物品应放入的箱子序号数组B[1,n]。

procedure PNextFit

Begin

(1)调用求前缀和的并行算法计算F[j]= A[1]+A[2]+…+A[j]

(2)for j = 1 to n pardo

借助F[j],使用二分法计算C[0,j]= max{k|A[j]+A[j+1]+…+A[k] ≤1} end for

/* 以下(3)-(8),计算下次适应算法使用的箱子数目m */

(3)C[0, n+1] = n

(4)h = 0

(5)for j=1 to n pardo E[0, j]=1 end for

(6)while C[h,1] ≠n do

(6.1)h = h + 1

(6.2)for j = 1 to n pardo

if C[h - 1, j] = n then

(i)E[h, j] = E[h-1, j]

(ii)C[h,j] = C[h - 1,j]

else

(i)E[h, j] = E[h - 1, j] + E[h - 1,C[h - 1, j] + 1]

(ii)C[h, j] = C[h - 1,C[h - 1, j] + 1]

end if

end for

end while

(7)height = h

(8)m = E[height, 1]

(9)/* 计算D[0, j]=第j个箱子中第一件物品在输入序列中的编号*/

for h = height downto 0 do

for j = 1 to n / 2h pardo

(i)if j = even then D[h,j] = C[h,D[h-1,j/2]]+1 endif

(ii)if j = 1 then D[h,1] = 1 endif

(iii)if j = odd > 1 then D[h,j] = D[h-1,[j+1]/2] endif

end for

end for

(10)for j=1 to n pardo /* 计算B[j] = 第j个物品所放入的箱子序号*/

相关文档
最新文档