实验4 动态规划算法设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法分析与设计》实验报告
实验四动态规划算法设计
姓名xxxxxxx 学号xxxxxxxx 班级xxxxxxxx
时间:xxxxxx 地点:xxxx
同组人:无
指导教师:xxxxxx
实验目的
1.掌握动态规划法算法设计的一般原理和方法。
2.理解动态规划向前处理和向后处理的思想,掌握递推公式的求解方法。
3.掌握多段图、每对结点之间最短路径的计算算法。
4.能用动态规划法设计算法求解一般问题。
实验内容
1.设计求解多段图问题的动态规划程序,上机调试通过。
2.设计求解每对结点之间最短路径问题的动态规划程序,上机调试通过。
3.准备几个多段图和几个道路交通图的数据。
4.输入求解多段图问题的动态规划程序,并用准备的数据调试通过。
5.输入每对结点之间最短路径问题的动态规划程序,并用准备的数据调试通
过。
实验环境
硬件: Intel(R) Pentium(R) CPU RAM:4G
软件:Myeclipse2013
编程语言:Java
实验前准备
一个5段图的例子
line procedure FGRAPH(E, k, n, P) //多段图的向前处理算法//
1real COST(n), integer D(n-1),P(k), r, j, k, n
2COST(n)←0
3for j←n-1 to 1 by -1 do
4设r是一个这样的结点,
取最小值。
5 COST(j)←c(j, r)+COST(r)
6 D(j) ←r
7repeat
8P(1) ←1;P(k) ←n
9for j←2 to k-1 do
10 P(j) ←D(P(j-1))
11repeat
12endFGRAPH
二、求每对结点之间最短路径长度问题的算法
line procedure ALL-PATHS(COST, A, n)
integer i, j, k, n; real COST(n, n), A(n, n)
1for i←1 to n do
2for j←1 to n do
3 A(i,j) ←COST(i,j)
4 repeat
5repeat
6for k←1 to n do
7 for i←1 to n do
8 for j←1 to n do
9 A k(i,j) ←min{A k-1(i,j), A k-1(i,k)+A k-1(k,j)}
10 repeat
11 repeat
12repeat
13endALL-PATHS
1、程序设计:见附1
实验步骤
1、准备实验数据。
准备几个多段图和几个道路交通图的数据。
多段图的实验数据和道路交通图的数据均可利用程序生成(ReadEdgeData.java的randMultGraph和radomDirectedGraph);
其中多段图的生成原则是n个结点分为k段,且每段大约为4到5个结点,第一个和最后一个结点要和相邻段所有结点相连,中间段的结点与相邻段的结点至少要有一个结点相邻,每条边的成本随机生成。
道路交通图至少则是生成有图的方式,n个结点有(n*n)*4/5使边数不至于多,也不至于少。
将生成的边以数对的形式存于文本文件中,如下图,其中第一行分别为结点数和边数。剩下的若干行表示每条表的两个结点和成本。在需要的时间通过读取文本文件来获取数据。
2、多段图问题的动态规划程序
根据算法设计的多段图向前处理法的sparks语言,写出相应的java程序,并调试验证通过。其中边是以邻接表的形式表现出来更方便显示点之间的邻接关
/**
*
输入是按段的顺序给结点编号的,G表示图,并且用邻接表的访求来表示边集,最后得到的是最小成本路径P
* @param G 图
* @param k k段图
* @param n n个结点
* @param P 最小成本路径
*
*/
public static void FGRAPH(Graph G,int k,int n,int[] P){
int[] COST=new int[n+1];//用来记录从j到最后一个结点的最小权值
int[] D=new int[n];//D[j]用来表示j到最后一个结点最短路径上的后续一个结点
for(int j=n-1;j>=1;j--){
int minCost=Graph.MAXCOST;
int r=1;
LinkedList
for(Edge edge: costList){//找到j之后的一个点r,使
edge.cost+COST[r]取最小值,并将最小值赋给minCost
int v=edge.v;//edge.cost代表j到v的权值
if(v>j&&edge.cost+COST[v] { r=v; minCost=edge.cost+COST[v]; } } COST[j]=minCost;//将从j到最后一个结点的最短路径的权值赋给COST[j] D[j]=r; } P[1]=1;//第一个结点 P[k]=n;//最后一个结点 for(int j=2;j P[j]=D[P[j-1]]; } } 将课本上的实验数据进行计算得到结果如下,其结果与书的最短路径一致。