多段图的动态规划算法(C、C++)

1.实验环境:

(1)VC++6.0
(2)Windows系统PC机

2.算法描述:

(1) 问题描述:

多段图问题是一种特殊的有向无环图的最短路径问题。其中产生从源点s到汇点t的最短路径的决策序列就是最优决策,此长度最短的路径是最优解,而路径长度就是最优解值。

(2) 数据结构:

采用邻接表存储该有向无环图的节点及边的信息。

(3) 算法的具体实现:

a) 源点s编号为0,汇点t编号为n-1(共有n个节点,m条边)。

b) 使用一维数组cost[j]保存节点j到汇点t的最短路径长度(这样做可以节省空间)。

c) cost[n-1]初始化为0(汇点到汇点的最短路径长度为0)。

d) cost[0]即为最优解值,为了计算cost[j],必须先计算从节点j后的所有后继节点p到汇点t的最短路径长度,即先计算cost[p]的值,这是子问题的最优解值。

e) cost[j]=min{c(j,p)+cost[p]}(c(j,p)为以节点j和节点p为端点的边的长度)。

3.源程序:

#include < iostream >

using namespace std;

struct ENode

{

     int adjVex;

     int w;

     ENode *nextArc;

};

ENode **a; //邻接表

int *cost; //cost[i]表示i节点到汇点的最短路径长度

int n; //总节点数

int m; //总边数

int i; //循环变量

void CreatGraph(); //构建邻接表

void FMultiGraph(); //多段图的向前递推算法

int main()

{

     cin>>n>>m;

     a=(ENode **)malloc(n*sizeof(ENode*));

     CreatGraph();

     FMultiGraph();

     cout<

}

//构建邻接表

void CreatGraph()

{

     int u,v;

     int w;

     ENode *t;   //临时变量

     for(i=0;i>u>>v>>w;

              t=(ENode*)malloc(sizeof(ENode));

              t->adjVex=v;

              t->nextArc=a[u];

              t->w=w;

              a[u]=t;

     }

}

//多段图的向前递推算法

void FMultiGraph()

{

     cost=(int*)malloc(n*sizeof(int));

     cost[n-1]=0;   //汇点到汇点的最短路径长度为0

     int min;

     ENode *r;   //临时变量

     for(i=n-2;i>=0;i--)

     {

              min=0x7fffffff;

              for(r=a[i];r;r=r->nextArc)

              {

                      if(r->w+cost[r->adjVex]w+cost[r->adjVex];

              }

              cost[i]=min;

     }

}
本算法参考自《算法设计与分析——C++语言描述(第3版)》——陈慧南 编著

4.调试与测试结果
多段图的动态规划算法(C、C++)_第1张图片
多段图的动态规划算法(C、C++)_第2张图片
5.小知识:
什么是最优性原理?解决动态规划问题的步骤是什么?

答:

最优性原理:一个最优策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,其余决策必定构成最优策略。这便是最优决策序列的最优子结构特性。

解决动态规划问题的步骤:

(1) 刻画最优解的结构特性;

(2) 递归定义最优解值;

(3) 以自底向上方式计算最优解值;

(4) 根据计算得到的信息构造一个最优解。

你可能感兴趣的:(算法设计与分析)