实验4 动态规划算法设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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是一个这样的结点,∈E且使c(j, r)+COST(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 costList= G.getCostList()[j];

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]];

}

}

将课本上的实验数据进行计算得到结果如下,其结果与书的最短路径一致。

相关文档
最新文档