算法分析与设计——贪心法实验报告

 

   算法导论  课程设计

 

 

题    目:    贪心法    

 

 

 

 

 

 

 

学院班级:        1613013        

学    号:      16130130216      

姓    名:        库 妍          

主讲教师        张立勇         

日    期:       2019.5.9        

 

 

 

 

 

一、Knapsack Problem

1、实验题目

下面有5个具有值和权重列表的项目,背包最多可以包含100磅。解决了分数背包和0/1背包问题。

2、使用的算法

部分背包采用动态规划法,0/1背包采用贪心法。

3、算法分析与设计

1)0/1背包

①描述最优解的结构:考虑重量至多为W磅的最值钱的一包东西。如果我们从中去掉物品j,余下的必须是从除了j以外的n-1件物品中,可以带走的重量至多为W-wj的最值钱的一包东西。

②递归定义最优解的值 :wi表示第i件物体的重量,vi表示第i件物品的价值。定义二维数组c[i, j],其中每个元素代表一个状态,即前i个物体中若干个放入体积为背包中最大价值。c[i-1,j]代表的就是不将这件物品放入背包,而c[i-1,j-vi] + wi则是代表将第i件放入背包之后的总价值。

0/1背包问题的递归式为:

 

 

③按自底向上的方式计算最优解的值。

④由计算出的结果构造一个最优解。

(2)部分背包

①决定问题的最优子结构:考虑我们如果从最优的货物中去掉某物品j的重量w,则余下的货物必须是可以从n-1件原有物品和物品j的wj-w磅中可以带走的、重量至多为W-w的一包东西。

②贪心策略:先对每件物品计算其每磅的价值vi/wi。尽量拿每磅价值大的物品。

4、项目测试(功能与性能)

分数背包问题采用选择单位重量价值最大的物品顺序进行挑选,其算法的时间复杂度为O(nlgn)。0/1背包问题的动态规划解法时间复杂度是O(n)。

5、实验总结

分数背包问题所采用的贪心策略之不能得到最优解,是由于物品不允许分割,因此,无法保证最终能将背包装满,部分闲置的背包容量使背包的单位重量价值降低了。

一、scheduling problem

1、实验题目

一个简单的调度问题,给予工作编号为J1,J2...Jn,已知所以工作的运行时间分别为T1,T2...TN。有一个单独的处理器,为了安排这些工作以到达减少平均完成时间的最好方法是什么。假定它是一个非抢占式调度:一旦工作开始,它必须运行完成。

a)(j1, j2, j3, j4) : (15,8,3,10)

2、使用的算法

贪心策略

3、算法分析与设计

由于是非抢占式调度,所以应该尽量让时间短的工作先做,然后再让时间长的工作做。这里我们使用堆进行排序,建立一个小顶堆,然后每次拿出小顶堆上的最小元素,并使用sum中的公式就可以算出平均完成时间。堆排序的时间复杂度是O(nlgn),其BuildMinHeap的时间复杂度是O(n),而MinHeap()的时间复杂度是O(lgn)。其中HeapExtractMin()的时间复杂度是O(lgn)。

4、项目测试(功能与性能)

5、实验总结

应用排序算法,让运行时间最短的工作先做。

三、Single-source shortest paths

1、实验题目

A为源点,求出下图的单源点最短路径。

A   B   C   D   E

     A       -1   3

 B            3   2  2

 C       

 D        1   5

 E                -3

2、使用的算法

由于图中存在负权值,所以Dijkstra算法无法使用,因此采用Bellman-Ford算法求取图的单源点最短路径。

3、算法分析与设计

(1)Bellman-Ford算法通过对边进行松弛操作来渐近地降低从源点A到每个结点的最短路径的估计值,直到该估计值与实际的最短路径权重ơ(A,v)相同为止。该算法返回TRUE值当且仅当输入图中不包含可以从源结点到达的权重为负值的环路。

(2)Bellman-Ford算法的执行步骤:

①初始化:将除源点外的所有顶点的最短距离估计值d[v]←+∞, d[s]←0;

②迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离;运行(|v|-1次)

③检验负权回路:判断边集E中的每一条边的两个端点是否收敛。如果存在未收敛的顶点,则算法返回false表明问题无解;否则算法返回true,并且从源点可达的顶点v的最短距离保存在d[v]中。

3)算法适用范围和条件:   

①单源最短路径(从源点A到其它所有顶点v);            

②有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图); 

③边权可正可负(如有负权回路输出错误提示)。       

4、项目测试(功能与性能)

Bellman-Ford算法的时间复杂度为θ(VE)。

5、实验总结

Bellman-Ford算法能在一般的情况下(存在负权边的情况下),解决单源最短路径问题。对于给定的有向图G=(V, E),其源点为s,加权函数为w:E→R,对该图运行Bellman-Ford算法返回一个布尔值,表示图中是否存在着一个从源点可达的权为负的回路。若存在回路的话,算法说明该问题无解;若不存在这样的回路,算法将产生最短路径及其权值。

四、All-pairs shortest paths

1、实验题目

求题3图中每对结点的最短路径问题。

2、使用的算法

Floyd-Warshall算法。

3、算法分析与设计

(1)最短路径的结构:设G的顶点为V={1,2,3...n},对于任意一对顶点i,j属于V,假设i到j有路径且中间节点皆属于集合{1,2,3...k},P是其中的一条最小权值路径。就是i到j的最短路径P所通过的中间顶点最大不超过k。

(2)解决每对顶点间最短路径问题的一个递归解:设d(k)ij为从结点i到结点j的所有中间结点全部取自结合{1,2,...,k}的一条最短路径的权重。d(k)ij的递归定义为:

 

 

(3)自底向上,计算最短路径的权值:

 

(4)构造一条最短路径

4、项目测试(功能与性能)

Floyd-Warshall算法的时间复杂度为θ(v^3)。

5、实验总结

Floyd-Warshall算法的运行时间是由第3~6行的三重嵌套for循环所决定的。每次执行花费O(1)时间,因此算法的运行时间为Θ(n^3),其代码是紧凑的,而且不包含其他数据结构,因此隐含于Θ记号中的常数是很小的。因此,即便对于中等规模的输入图来说,Floyd-Warshall算法仍然是相当实用的。

原文地址:https://www.cnblogs.com/ku1274755259/p/11108482.html