AOE算法典例 |
您所在的位置:网站首页 › 下载一部电影需要多少空间 › AOE算法典例 |
一、问题描述:
要完成一部电影需要很多环节,如下: 1、 项目启动到确定导演需要 1 个时间,已确定导演到完善细节需要 2 个时间,已经完善细节到开始拍摄需要 2 个时间。 2、 项目启动到确定演员需要 3 个时间,已确定导演到已确定演员需要 1 个时间,已确定演员到开始拍摄需要 2 个时间。 3、 项目启动到完成场地确认需要 5 个时间,完成演员确定到完成场地确认需要 1 个时间,完成场地确认到完善细节需要 1 个时间,完成场地确认到开始拍摄需要 2 个时间。 可以看出,每个环节的时间不同,且有着严格的先后关系,可以同时做多个工作,如何求出从项目启动到开始拍摄的最短时间呢?下面就是解决此问题的办法。 二、解决方法:此问题很明显是一个寻找关键路径的问题,我们可以建立一个图的模型,将每一个顶点代表每一个环节,用有向边来表示两顶点之间的活动,边的权值就代表所需要的时间。 由此,我们也看画出关于此问题的带权有向图(AOE图): 我们能够很容易的找到关键路径为:项目启动->场地确认->完善细节->开始拍摄。即为: 我们可以计算出最短的时间为8个时间。 虽然对这种整体环节不是很多的情况下,我们能够用肉眼观察到,但是如果所需要的的环节很多,关系也较为复杂的情况时,我们无法较为容易的观察出最短的路径,这时我们自己要设计一个小程序,来解决这种问题,下面就是代码实现。 三、代码实现: 1、代码思路首先考虑的是对于有向图的表示方法,由于涉及到权值,我们选择用邻接矩阵的方法对有向图的表示,若两顶点之间不连通,则相对应的坐标表示为无限大(代码中表示为一个很大的值),若存在,则对应坐标代表权值。 先将上述的各项环节转换成数字(即为数组下标)这样能更加容易的代码实现: 由此,我们可以得到上述问题的邻接矩阵: 再通过关键路径算法来求得关键路径与最短时间,下面是算法分析。 2、主要算法首先是设置了一个函数来对邻接矩阵进行初始化,并将边权信息输入进去: void Initialize() { int a,b,c; for(i = 0;i if(a == last) return; for(int i = 0;i if((e[a] + graph[a][i]) > e[i]) { e[i] = e[a] + graph[a][i]; } Getearly(i,last); } } }同理,也能够得到最迟的时间,存入到l[i]数组中: void Getlater(int a,int first) { if(a == first) return; for(int i = 0;i if(l[a] - graph[i][a] Initialize(); //初始化邻接矩阵 Getpath(); } void Initialize() { int a,b,c; for(i = 0;i int first,last; int k,f; printf("请输入开始的点和结束的点:\n"); scanf("%d%d",&first,&last); for(i = 0;i for(i = 0;i p[f++] = i; k = i; break; } } } printf("关键路径为:\n"); for(i = 0;p[i] != last;i++) { printf("%d->",p[i]); } /*输出关键路径 */ printf("%d\n",p[i]); for(;i > 0;i--) { time = time + graph[p[i-1]][p[i]]; //path所记录的下标对应矩阵的权值进行相加 } printf("此方案所花费的时间为:%d",time); } void Getearly(int a,int last) //得到每个节点的最早时间,存入到e[i]数组中 { if(a == last) return; for(int i = 0;i if((e[a] + graph[a][i]) > e[i]) { e[i] = e[a] + graph[a][i]; } Getearly(i,last); } } } void Getlater(int a,int first) //得到每个节点的最晚时间,存入到e[i]数组中 { if(a == first) return; for(int i = 0;i if(l[a] - graph[i][a] |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |