`
静妙仙人
  • 浏览: 85936 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

动态规划(dynamic programming)

阅读更多

方法概述: 发展及研究内容

动态规划(dynamic programming)是运筹学的一个分支,20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。

动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、资源分配、设备更新等问题,用动态规划比用其它方法求解更为方便。

 

方法概述: 基本思想

A.动态规划的思想实质是分治思想和解决冗余。

B.与分治法类似的是,将原问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

C.与分治法不同的是,经分解的子问题往往不是互相独立的。若用分治法来解,有些共同部分(子问题或子子问题)被重复计算了很多次。

D.如果能够保存已解决的子问题的答案,在需要时再查找,这样就可以避免重复计算、节省时间。动态规划法用一个表来记录所有已解的子问题的答案。

E.这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表方式。

 

方法概述: 求解步骤

1、找出最优解的性质,并刻画其结构特征;

2、递归地定义最优值(写出动态规划方程);

3、以自底向上的方式计算出最优值;

4、根据计算最优值时记录的信息,构造最优解。

注:

-步骤1-3是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤4可以省略;

-若需要求出问题的一个最优解,则必须执行步骤4,步骤3中记录的信息是构造最优解的基础

 

方法概述: 适用条件

动态规划法的有效性依赖于问题本身所具有的两个重要性质

最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。

重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。

 

1:多段图的最短路问题

多段图:设G=<V,E>是一个有向连通图,其中|V|=n, |E|=m,  V有划分{V1,V2,···,Vk},这里V1 ={s},s称为源点, Vk ={t},t称为终点,其中k ≥ 2 。对于每条有向边<u,v> E都存在Vi V,使得u Viv Vi+1, 其中1≤i<k且每条边<u,v>均附有代价C(u,v),则称G是一个k段图。

 

 

最短路:从源点s到终点t的整条路上的代价之和为最小。

每个子集Vi构成图中的一段。由于E的约束,每条从st的路径都是从第一段开始,然后顺次经过第2段,第3段,···,最后在第k段终止。对于每条从st的路径,可以把它看成在k-2个阶段中做出的某个决策序列的相应结果。

假设s,v2,v3,···,vk-1,t是一条从st的最短路径,还假定从源点s(初始状态)开始,已做出了到结点v2的决策(初始决策),因此v2就是初始决策所产生的状态。如果把v2看成是原问题的一个子问题的初始状态,解这个子问题就是找出一条由v2t的最短路径。这条路径显然是 v2,v3,···,vk-1,t,否则设v2,q3,···,qk-1,t是一条由v2t的更短路径,则s,v2,q3,···,qk-1,t是一条比路径s,v2,v3,···,vk-1,t 更短的由st的路径,与假设矛盾,故最优化原理成立。

向前处理法:设P(i,j)是从Vi中的点jt的一条最短路,cost(i,j)是这条路线的耗费。由后向前推算,得到

 

 

 

 

 

                      cost(i,j)=min{C(j,r)+cost(i+1,r)} 

                  cost(4,9)=4 cost(4,10) =2  cost(4,11)=5

                  cost(3,6)=min{6+cost(4,9),5+cost(4,10)}

                                   =min{6+4,5+2}=7

从第3段的顶点6t的最短路径是6-10-t

 

 cost(3,7)=min{4+cost(4,9),3+cost(4,10)} =min{4+4,3+2}=5

从第3段的顶点7t的最短路径是7-10-t

cost(3,8)=7

从第3段的顶点8t的最短路径是8-10-t

cost(2,2)=7 从第2段顶点2t的最短路是2-7-10-t

cost(2,3)=9从第2段顶点3t的最短路是3-6-10-t

cost(2,4)=18从第2段顶点4t的最短路是4-8-10-t

cost(2,5)=15从第2段顶点5t的最短路是5-8-10-t

cost(1,1)=16 从第1段顶点1t的最短路径由两条:

                     1-2-7-10-t1-3-6-10-t

D(i,j)表示使C(j,r)+cost(i+1,r)取得最小值
r,则在上述求解过程中同时得到:

D(3,6)=10, D(3,7)=10, D(3,8)=10

D(2,2)=7, D(2,3)=6, D(2,4)=8

D(2,5)=8, D(1,1)=2

设从st的最短路径为s,w2,w3,···,wk-1,t

则有w2=D(1,1)=2

w3= D(2,D(1,1))=D(2,2)=7

w4=D(3,D(2,D(1,1)))=D(3,D(2,2))=D(3,7)=10

所以这条路径是1-2-7-10-t

 

为了便于描述算法,对一个k段图的顶点,按段的顺序给它的每个顶点编号。设图中有n个顶点,则编号为12···n。首先,给s编为1号;然后给V2中的各个顶点分别编为23 ··· | V2 |+1号;以此类推,最后t编号为n

这样编号使Vi+1中的任何顶点的编号大于Vi中所有顶点的编号。

于是,可以按n-1,n-2,···,1的顺序计算出cost(i,j)D(i,j)。算法中可以利用顺序编号的特点,而不再考虑顶点所在的段。

设顶点的编号已知,边已知及边的代价函
C(i,j)已知。用cost[i]表示顶点it的最小
代价, 1≤i ≤n。用D[i]表示从顶点it的最短路径上顶点i的后继顶点号,用P[i]表示最短路径经过第i级的顶点号, 1≤i ≤k

 

例2

对于由从1到N (1 <= N <= 39)这N个连续的整数组成的集合来说,我们有时可以将集合分成两个部分和相同的子集合。
例如,N=3时,可以将集合{1, 2, 3} 分为{1,2}和{3}。此时称有一种方式(即与顺序无关)。
N=7时,共有四种方式可以将集合{1, 2, 3, ..., 7} 分为两个部分和相同的子集合:
{1,6,7} 和 {2,3,4,5} 
{2,5,7} 和 {1,3,4,6} 
{3,4,7} 和 {1,2,5,6} 
{1,2,4,7} 和 {3,5,6} 
输入:程序从标准输入读入数据,只有一组测试用例。如上所述的N。
输出:方式数。若不存在这样的拆分,则输出0。

代码实现:

#include<stdio.h>

void main(){

	int i,j,x,y,flag,sum;
	int input,outresult;
	int num[40][410] = {0};
	num[0][0] = 1;

	scanf("%d",&input);

	x = input, y = (1 + input)*input/2;
	sum = y/2;

	flag = y%2;

	if(flag == 1)
		printf("0\n");

	else{
		for(i=1;i<=x;i++){
			for(j=1;j<=y/2;j++)
				if(i<=j)
					num[i][j] = num[i-1][j] + num[i-1][j-i];
				else
					num[i][j] = num[i-1][j];
		}

		outresult = num[x][sum];
		printf("%d\n",outresult);
	}


}

 

 

  • 大小: 43.1 KB
  • 大小: 19.3 KB
  • 大小: 57 KB
3
3
分享到:
评论

相关推荐

    动态规划dynamic programming

    动态规划(Dynamic Programming,简称DP)是计算机科学中一种强大的问题解决方法,广泛应用于算法设计与分析中。它主要处理具有重叠子问题和最优子结构的问题,通过将复杂问题分解为更小的子问题来求解全局最优解。...

    什么是动态规划(Dynamic Programming)?动态规划的意义是什么? - 知乎1

    动态规划(Dynamic Programming,简称DP)是一种用于解决最优化问题的算法思想,它通过将大问题分解为相互重叠的子问题,并存储子问题的解,以避免重复计算,从而达到高效求解的目的。DP的核心在于它能够识别并利用...

    算法数据结构-动态规划算法(Dynamic Programming)超详细总结加应用案例讲解.txt

    算法数据结构——动态规划算法(Dynamic Programming)超详细总结加应用案例讲解算法数据结构——动态规划算法(Dynamic Programming)超详细总结加应用案例讲解算法数据结构——动态规划算法(Dynamic Programming...

    Dynamic Programming

    动态规划(Dynamic Programming,简称DP)是一种在计算机科学、数学优化等领域广泛应用的方法,主要用于解决多阶段决策过程中的最优化问题。它通过将复杂的问题分解成相对简单的子问题,并存储已经解决的子问题的...

    Adaptive Dynamic Programming 自适应动态规划

    自适应动态规划(Adaptive Dynamic Programming,ADP)是动态规划领域中的一种新颖方法,它在解决各种优化和决策问题时提供了一种自适应的解决策略。动态规划是解决多阶段决策过程优化问题的重要理论和方法,尤其在...

    ROBUST ADAPTIVE DYNAMIC PROGRAMMING

    特别是自适应/近似动态规划(Adaptive/Approximate Dynamic Programming,简称ADP),这是一种强大而富有成效的方法,它将从哺乳动物大脑中观察到的强化学习(Reinforcement Learning,简称RL)的理念与决策理论结合...

    Dynamic Programming and optimal control

    动态规划(Dynamic Programming,DP)是由美国数学家理查德·贝尔曼提出的,它是一种将复杂问题分解为多个子问题,并逐个求解以找到全局最优解的方法。动态规划的核心思想是“最优子结构”和“无后效性”,即最优解...

    Dynamic Programming for Interviews

    在对编程面试中动态规划的理解和应用方面,《Dynamic Programming for Interviews》这本电子书旨在帮助读者掌握面试中常见的动态规划问题,书籍由Sam Gavis-Hughson撰写,他是ByteByByte LLC的创始人。这本电子书...

    《Dynamic Programming and Optimal Control》 Vol 2

    Dynamic Programming and Optimal Control, Vol 2 貌似vol1有人发了,这是vol2

    Adaptive and Approximate Dynamic Programming (ADP)

    Adaptive and Approximate Dynamic Programming (ADP) 是一种基于动态规划的优化方法,它通过 approximate dynamic programming 来解决复杂的决策问题。该方法结合了自适应技术和近似动态规划技术,旨在解决复杂...

    Dynamic Programming and Optimal Control, Vol 1

    Dynamic Programming and Optimal Control, Vol 1

    dynamic programming.pdf

    动态规划(Dynamic Programming,简称DP)是一种优化问题求解策略,尤其适用于解决具有重叠子问题和最优子结构特点的问题。在计算机视觉领域,动态规划被广泛应用在立体匹配算法中,用于高效、准确地寻找左右图像...

    Dynamic programming and optimal control V1

    《动态规划与最优控制》(Dynamic Programming and Optimal Control)是一部经典的著作,主要涉及运筹学、控制理论和优化算法等领域。动态规划是解决多阶段决策问题的一种有效方法,而最优控制则是研究如何使系统在...

    DNA Sequence Alignment Using Dynamic Programming

    动态规划(Dynamic Programming)是一种在计算机科学中解决优化问题的有效方法,尤其适用于DNA序列比对。在这个场景下,C#语言可以作为实现这种算法的工具。 DNA序列由四种碱基组成:腺嘌呤(A)、胸腺嘧啶(T)、...

    105.Dynamic Programming

    动态规划(Dynamic Programming,简称DP)是一种解决多阶段决策过程中的最优化问题的方法。这种方法被广泛应用于计算机科学、数学、经济学以及运筹学等领域。《105.Dynamic Programming》这本书提供了深入浅出的动态...

    DYNAMIC PROGRAMMING AND OPTIMAL CONTROL

    DYNAMIC PROGRAMMING AND OPTIMAL CONTROL

    dynamic programming

    动态规划(Dynamic Programming)是通过将复杂问题分解为更小的子问题来解决的方法。这种方法的关键在于存储和重用之前解决过的子问题的解决方案,避免了重复计算,提高了效率。动态规划主要应用于最优化问题,如...

Global site tag (gtag.js) - Google Analytics