您的位置:首页 > 其它

动态规划

2016-06-30 17:33 204 查看
机考前一天抱抱佛脚吧,之前学过一些,现在整理一下概念。

强烈安利动态规划:从新手到专家

以最短路径Dijkstra算法为例说明。先贴代码(参考大话数据结构):

#define MAXVEX 100
#define INFINITY 100000000
typedef int Path[MAXVEX]; //存储最短路径下标
typedef int Cost[MAXVEX]; //存储到各点的最短路径
void ShortestPath_Dijkstra(MGraph G, int v0, Path p[], Cost d[])
{
int i,j,k,min;
int final[MAXVEX]; //final[i]=1表示已求得从v0至vi最短路径

/*初始化数据*/
for(i=0;i<G.numVertexes;i++)
{
final[i]=0;
d[i]=G.arc[v0][i]; //arc数组中存储两顶点间距离信息
p[i]=0;
}
d[v0]=0; //v0至v0距离为1
final[v0]=1; //v0至v0不需要求路径

/*状态求解*/
for(i=1;i<G.numVertexes;i++)
{
min=INFINITY;
for(j=0;j<G.numVertexes;j++)
{
if(!final[j] && d[j]<min) //寻找离v0最近的顶点
{
k=j;
min=d[j];
}
}
final[k]=1; //目前已找到的最近顶点置1
for(j=0;j<G.numVertexes;j++)
{
if(!final[j] && (min+G.arc[k][j])<d[j])
{
d[j]=min+G.arc[k][j];
p[j]=k;
}
}
}
}


状态:用来描述该问题的子问题的解。一般只与前面出现的状态有关,与后面出现的状态无关。此处a(i)即是我们要找的状态(这里a(i)指的是第i个阶段下d[i]的整体情况)。i表示状态的阶段,由于要求v0到其他n-1个点的路径,因此有n-1种状态(每一阶段不一定都会更新,但是若每个阶段都会更新,则至多更新n-1次,这是因为每一阶段必会至少求出到一个顶点的最短路径)。j表示每一阶段状态中,对应不同顶点的情况。

状态转移方程:由i-1状态转换到i状态的方程,一般根据题目情况可以推导出来。在求最短路径时,若要求v0到vi点的最短路径,就需要知道与v0到与vi相连的其他点的最短路径,并求得这些点与vi之间的最短路径,若两者之和小于在i-1状态下的最短路径,则进行更新。

故状态转移方程可以表示为:di[j]=min{mini+arc[k][j],di−1[j]}

动态规划,最重要的问题就是分析出状态,以及状态转移方程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划