2016春季14级本科“算法设计与分析”大作业题目要求
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2014级计算机科学与技术专业“算法设计与分析”大作业题
2015学年~2016学年第2学期
2016年4月18日
总体要求
本次综合大作业(上机实现题目)是为了配合“算法设计与分析”课程的讲授而设置的,目的在于培养学生理论联系实际的问题求解能力。综合大作业题目共两道,两题均要求采用动态规划算法求解。每题50分。以小组为单位检查,自由组合(可跨越班级),每组人数一般不少于3人、但不超过5人。每组提交1份课程报告,检查时每组至少须有1人做成果展示演讲(答辩),在课堂上就题目的设计思想、实现方法的正确性等进行说明,全组成员一起参与答辩,回答教授及同学的提问与质疑。
对于“动态规划”问题,报告中必须对最优值函数和标记函数的含义进行详细说明,列出子问题计算中所使用的有关最优值函数和标记函数的递推关系(一般采用递归式加以描述)和初值(边界条件)。给出所设计算法的时间复杂度分析。
每组自备2、3个相关问题的实例,报告中以实例中的数据描述算法的执行步骤。
一、广义背包问题
广义背包问题的描述如下:给定载重量为M的背包和n种物品,每种物品有一定的重量和价值,现在需要设计算法,在不超过背包载重量的前提下,巧妙选择物品,使得装入背包的物品的总价值最大化。规则是,每种物品均可装入背包多次或不装入(但不能仅装入物品的一部分)。请用数学语言对上述背包问题加以抽象,在此基础上给出动态规划求解该问题的递归公式。要求对所给公式中的符号意义加以详细说明,并简述算法的求解步骤。用一种你熟悉的程序设计语言加以实现。
二、在下面A 、B两道题中选取一道感兴趣的题目完成
A、加工顺序问题
“加工顺序问题”又被称为“批处理作业调度问题”。
设有n个工件需要在机器M1和M2上加工,每个工件的加工顺序都是先在M1上加工,然后在M2上加工。t1j,t2j分别表示工件j在M1,M2上所需的加工时间(j=1,2,···,n)。问应如何在两机器上安排生产,使得第一个工件从在M1上加工开始到最后一个工件在M2上加工完所需的总加工时间最短?关于此(类)问题的回溯法求解被作为经典案例在很多教材或参考文献中出现,现要求设计求解此问题的动态规划算法。
请用数学语言对“加工顺序问题”加以抽象,在此基础上给出动态规划求解该问题的递归公式。要求对所给公式中的符号意义加以详细说明,并简述算法求解步骤。用一种你熟悉的程序设计语言加以实现。
提示(分析最优解的性质,刻画最优解的结构—最优子结构性质)
将n个工件的集合看做N={1,2,···,n},设P是给定n个工件的一个最优加工顺序方案,则P(i)是该调度方案的第i个要调度的工件(i=1,2,···,n)。先考虑初始状态,第一台机器M1开始加工集合N中的P(1)工件时,第二台机器M2空闲。随着时间的推移,经过t1P(1)的时间,进入一个新的状态:第一台机器M1开始加工集合N-{P(1)}中的P(2)工件时,第二台机器M2开始加工P(1)工件,需要t2P(1)的时间才能空闲。以此类推,可以将每一个状态表示成更一
般的形式,即:当第一台机器M1开始加工集合S(S N是N的作业子集)中的工件i时,第二台
机器M2需要t时间才能空闲下来。这种状态下,从集合S中的第一个工件开始在机器M1上加工到最后一个工件在机器M2上加工结束时所耗的时间为T(S,t)。设集合S的最优加工顺序中第一个要加工的工件为i,那么,经过t1i的时间,进入的状态为第一台机器M1开始加工集合S-{ i }中的工件时,第二台机器M2需要t‘ 时间才能空闲下来,这种情况下机器M2加工完S-{i}中的工件所需的时间为T(S-{i},t’),其中
则T(S,t)=t1i + T(S-{i},t2i+max{t-t1i,0})(2-1)从式(1-1)可以看出,如果T(S,t)是最小的,那么其包含的子问题
T(S-{i},t2i+max{t-t1i,0})肯定也是最小的。即该问题的整体最优一定包含其子问题的最优。
B、TSP问题
所谓TSP问题是指旅行商要去n个城市推销商品,其中每个城市到达且仅到达一次,并且要求所走的路程最短(该问题又称货郎担问题、邮递员问题、售货员问题等)。TSP问题最容易想到、也肯定能得到最优解的算法是穷举法,即考察所有可能的行走线路,从中选出最佳的一条。但是用穷举法求解TSP问题的时间复杂性为O(n!),属于NP问题。请用数学语言对该TSP问题加以抽象,在此基础上给出动态规划求解该问题的递推公式。要求对所给公式中的符号意义加以详细说明,并简述算法求解步骤。用一种你熟悉的程序设计语言加以实现。