收藏 分享(赏)

回溯算法设计-new.ppt

上传人:j35w19 文档编号:9839662 上传时间:2019-09-10 格式:PPT 页数:37 大小:464KB
下载 相关 举报
回溯算法设计-new.ppt_第1页
第1页 / 共37页
回溯算法设计-new.ppt_第2页
第2页 / 共37页
回溯算法设计-new.ppt_第3页
第3页 / 共37页
回溯算法设计-new.ppt_第4页
第4页 / 共37页
回溯算法设计-new.ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

1、1,计算机导论与程序设计基础,2,一. 回溯算法的含义 二. 用回溯算法解决问题的一般步骤 三. 回溯法解题思路应用递归函数求解,提纲,3,一. 回溯算法的含义以组合问题为例:找出从自然数1、2、n中任取r个数的所有组合(要求r个数从小到大排列)。例如n=5,r=3的所有组合为: (1)1,2,3 (2) 1,2,4 (3)1,2,5 (4) 1,3,4 (5)1,3,5 (6) 1,4,5(7)2,3,4 (8) 2,3,5 (9)2,4,5 (10) 3,4,5,一. 回溯算法的含义,4,一. 回溯算法的含义,求n=5,r=3的所有组合 算法1:使用前面学的穷举算法 罗列出3个数字剔重之后

2、的54360种候选解。 利用限制条件(r个数从小到大排列)来剔除不符合要求的解。 算法评价:计算量大,可能候选解中只有一小部分解是符合要求的解。,5,一. 回溯算法的含义,求n=5,r=3的所有组合 算法2:使用回溯算法,回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:在搜索问题的解时,从一条路往前走,能进则进,不能进则退(回溯)回来,换一条路再试。,迷宫,x1,x2,x3,6,一. 回溯算法的含义 二. 用回溯算法解决问题的一般步骤 三. 回溯法解题思路应用递归函数求解,提纲,7,二. 用回溯算法解决问题的一般步骤,二. 用回溯算法解决问题的一般步骤: 针对所给问

3、题,定义问题的解空间,它至少包含问题的一个(最优)解。 确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。 问题的解空间通常是在搜索问题解的过程中动态产生的,这是回溯算法的一个重要特性。,8,第1步. 定义问题的解空间。问题的解空间应至少包含问题的一个(最优)解。例:求n=5,r=3的所有组合,二. 用回溯算法解决问题的一般步骤,解空间中共有54360种可能的解,其中符合要求的解为(列举法): (1,2,3),(1,2,4),(1,2,5),(1,3,4),(1,3,5), (1,4,5),(2,3,4),(2

4、,3,5),(2,4,5),(3,4,5) ,符合要求的解为(描述法): E=(x1,x2,x3)xiS , 1 i3 , 且x1x2x3 其中:S=1,2,3,4,5,9,第1步. 定义问题的解空间。可用回溯法求解的问题P, 下述集合E中的n元组组成了问题P的解空间:E=(x1,x2,xn)xiSi ,1 in其中Si是xi的定义域,且 Si中元素个数 有限。问题P的解:E中所有满足约束集D的n元组(D是对x1xn取值的全部约束条件)。,二. 用回溯算法解决问题的一般步骤,n 元组或多元组是对象个数有限的序列。多元组被数学家们用来描述确定成分的数学对象。多元组区别于集合的主要性质在于:(1)

5、它可以多次含有某个对象;(2)对象按照一定顺序出现。,10,二. 用回溯算法解决问题的一般步骤,第2步.确定易于搜索的解空间结构。通常可以将解空间组织成一棵树,使得能用回溯法方便地搜索整个解空间 。,问题的解: (1,2,3),(1,2,4),(1,2,5),(1,3,4),(1,3,5), (1,4,5),(2,3,4),(2,3,5),(2,4,5),(3,4,5) ,x1,x2,x3,11,二. 用回溯算法解决问题的一般步骤,树的定义:树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次

6、结构中有一个结点具有特殊的地位,这个结点称为该树的根结点。,根结点,深 度,宽度,12,二. 用回溯算法解决问题的一般步骤,第3步.以深度优先的方式搜索解空间回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始结点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为一个新的活结点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法即以这种工作方式

7、递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。,13,搜索问题解,建立解空间1,x1,x2,x3,深 度,14,一. 回溯算法的含义 二. 用回溯算法解决问题的一般步骤 三. 回溯法解题思路应用递归函数求解,提纲,15,三. 回溯法解题思路 就是求所有满足条件D的n元组(x1,x2,, xn ) 为求n元组(x1,x2,, xn ) ,可以先求出x1 ,然后再求n-1元组( x2,, xn )。这样,求(x1,x2,, xn )的问题被转化为规模小一级但同性质的求( x2,, xn )的问题。 同理,求( x2,, xn )的问题可以转化为求( x3,, xn )的问题

8、,如此不断转化,问题规模不断减小。 当被转化为求一元组(xn)时,可以直接给出结果,而不需要继续转化 。 这就是递归算法实现回溯法的思想。,三. 回溯法解题思路,16,例1. 求n=5,r=3的所有组合。 问题分析:求组合其实就是求满足条件的3元组( x1,x2, x3 )。可以设计递归函数求解元组( xi, xn ) 。 递归函数参数设计考虑: i肯定是作为一个参数,那么n是作为参数还是其他采用方式(如全局变量、常量)? xi的取值范围是递归函数必须要获得的。 求得的元组采用什么数据结构存放?采用全局变量还是使用形式参数?,三.回溯法解题思路应用递归函数求解,17,递归函数设计:求元组( x

9、i,, xn )void try(int i,int n,int min,int max,int result,int size) 参数说明:i和n:表示递归函数求元组( xi,, xn )min和max:min xj maxresult:存放元组size:result的长度,三.回溯法解题思路应用递归函数求解,18,三.回溯法解题思路应用递归函数求解,19,void try(int i,int n,int min,int max,int result,int size) int xi,j; for(xi=min; xi=max; xi+)/依次试探xiresulti=xi; /确定xiif

10、(i=n) /若本次是求一元组,则递归结束,输出结果for(j=1;j=size-1;j+)printf(“%-5d“,resultj);printf(“n“); elsetry(i+1,n,xi+1,max,result,size); /继续求解(xi+1, xn )resulti=0;/清空xi ,组合问题递归函数,20,组合问题主函数,#include #define N 3 main() int resultN+1=0;/*记录一个N元组,ai记录xi*/try(1,3,1,5,result,N+1); /*调用递归函数求3元组*/system(“pause“);return 0; ,

11、21,例2. 跳马问题有一块n*n的格子的棋盘,一位骑士放在初始坐标为的格子里, 并按照象棋的移动规则移动。提出的问题是:是否可以找到可以走遍整个棋盘的方案。即经过一个n*n-1次移动的巡游,使得棋盘上每一个格子恰好被访问一次。输出各方案及总方案数。,三.回溯法解题思路应用递归函数求解,22,从(x,y)出发,下一步可以走的八种选择:,三.回溯法解题思路应用递归函数求解,23,第1步:定义解空间 假设是55的棋盘,则本题实际就是求解由25元组组成的状态空间E。E=(x1,x2,,x25)xiS , 1 i25其中:S是棋盘上的25个坐标组成的集合xi代表第i步的坐标约束集D为:x1x25互不相

12、等,三.回溯法解题思路应用递归函数求解,24,三.回溯法解题思路应用递归函数求解,第2步. 采用一棵树描述解空间,树的深度为25。第3步. 动态搜索并建立解空间。,共25个结点,25,解题思路: 1)元组的存放(即旗盘路线):用一个全局二维数组存储int boardSIZESIZE;/SIZE表示棋盘的行和列数,三. 回溯法解题思路,1 16 21 10 25 20 11 24 15 22 17 2 19 6 9 12 7 4 23 14 3 18 13 8 5,表示第22步走到此位置,26,三. 回溯法解题思路,2)递归函数设计:用于求元组(xixn )。由于必须在xi-1基础上根据移动规则

13、确定xi,因 此需要将xi的坐标作为参数传入。 void try(int i,int n,int x,int y),27,三. 回溯法解题思路,28,3)如何在xi-1坐标 基础上确定xi的各个可能坐标:int row8=1,2,2,1,-1,-2,-2,-1;/*8个方向上的x增量*/int col8=-2,-1,1,2,2,1,-1,-2; /*8个方向上的y增量*/for(dir=0;dir=7;dir+) /*依次试遍8个方向*/u=x+rowdir; /*得到的新坐标*/ v=y+coldir; 4)递归结束条件: 第i步有位置可走且i等于25,三. 回溯法解题思路,29,s,/函数

14、功能:从stepi-1出发,求(stepistepSIZE*SIZE)。stepi-1坐标为(x,y) void try(int i,int n,int x,int y)int dir,u,v; for(dir=0;dir=0) /清空位置 。不可少!/ end of if /end of for ,跳马问题 递归函数,30,#include #define SIZE 5 int row8=1,2,2,1,-1,-2,-2,-1;/*8个方向上的x增量*/ int col8=-2,-1,1,2,2,1,-1,-2; /*8个方向上的y增量*/ int boardSIZESIZE=0;/*记录走

15、的路径*/ int num;/*记录方案总个数*/ main() int row,col;/*初始化*/num=0;board00=1; /*占据位置(0,0)*/ try(2,SIZE*SIZE,0,0); /*从(0,0)出发,寻找后续位置*/ /*输出总方案数*/ printf(“总方案数为%d“,num); system(“pause“); ,跳马问题 主函数,31,三. 回溯法解题思路,例3. 背包问题有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。,weight=16,15,15 value

16、=45,25,25 weightLimit=30 则最优解是(0,1,1),32,33,背包问题1,void try(int i,int n,int weight,int value,int weightLimit,int solution,int bestSolution) int xi;for(xi=0;xigetValue(bestSolution,value,n)saveSolution(solution,bestSolution,n);/将当前方案作为最大值方案 elsetry(i+1,n,weight,value,weightLimit,solution,bestSolution)

17、; solutioni=0; ,34,#define SIZE 4main() int i,weightLimit=50;int solutionSIZE+1=0;int bestSolutionSIZE+1=0; int weightSIZE+1=0,16,15,15,20;int valueSIZE+1=0,45,25,25,30;try(1,SIZE,weight,value,weightLimit,solution,bestSolution);for(i=1;i=SIZE;i+)printf(“%dt“,bestSolutioni);system(“pause“);return 0;

18、,背包问题2,35,void saveSolution(int solution,int bestSolution,int size) int i; for(i=1;i=size;i+)bestSolutioni=solutioni; int getWeight(int solution,int weight,int size) int totalWeight=0,i;for(i=1;i=size;i+)totalWeight+=solutioni*weighti;return totalWeight; ,背包问题3,36,int getValue(int solution,int value,int size) int totalValue=0,i;for(i=1;i=SIZE;i+)totalValue+=solutioni*valuei;return totalValue; ,背包问题4,37,例4. 迷宫问题,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报