回溯法实验报告

上传人:夏** 文档编号:489899788 上传时间:2023-07-07 格式:DOC 页数:10 大小:86.50KB
返回 下载 相关 举报
回溯法实验报告_第1页
第1页 / 共10页
回溯法实验报告_第2页
第2页 / 共10页
回溯法实验报告_第3页
第3页 / 共10页
回溯法实验报告_第4页
第4页 / 共10页
回溯法实验报告_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《回溯法实验报告》由会员分享,可在线阅读,更多相关《回溯法实验报告(10页珍藏版)》请在金锄头文库上搜索。

1、 实验04 回溯法 班级:0920561 姓名:宋建俭 学号:20一 、实验目的1. 掌握回溯法的基本思想。2. 掌握回溯法中问题的解空间、解向量、显式约束条件、隐式约束条件以及子集树与排列树的递归算法结构等内容。3. 掌握回溯法求解具体问题的方法。二 、实验要求1. 认真阅读算法设计教材,了解回溯法思想及方法;2. 设计用回溯算法求解装载问题、n后问题、图的m着色问题的java程序三 、实验内容1. 有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且wiC1+C2。装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方

2、案。2. 在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。3. 给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。四、算法原理1、装载问题用回溯法解装载问题时,用子集树表示其解空间是最合适的。可行性约束可剪去不满足约束条件(w1x1+w2x2+wnxn)c1时,以结点Z为根的子树中所有结点都不满足约束条件,因而该子树中的解

3、均为不可行解,故可将该子树剪去。解装载问题的回溯法中,方法maxLoading返回不超过c的最大子集和,但未给出达到这个最大子集和的相应子集。算法maxLoading调用递归方法backtrack(1)实现回溯搜索。Backtrack(i)搜索子集树中第i层子树。类Loading的数据成员记录子集树结点信息,以减少传给backtrack的参数。cw记录当前结点相应的装载重量,bestw记录当前最大装载重量。在算法backtrack中,当in时,算法搜索至叶结点,其相应的装载重量cw。如果cwbestw,则表示当前解优于当前最优解,此时应更新bestw。当i=n时,当前扩展结点Z是子集树的内部结

4、点。该结点有xi=1和xi=0两个儿子结点。其左儿子结点表示xi=1的情形,仅当cw+win时,算法搜索至叶节点,得到一个新的n皇后互不攻击方案,当前已找到的可行方案数sum曾1.当i=n时,当前扩展节点Z是解空间中的内部结点。该结点有xi=1,2,,n,共n个儿子结点。对当前扩展结点Z的每一个儿子结点,由place检查其可行性,并以深度优先的方式递归地对可行子树搜索,或剪去不可行子树。3、图的m着色问题给定图G=(V,E)和m种颜色,用图的邻接矩阵a表示无向连接图G=(V,E)。若(i,j)属于图G=(V,E)的边集E,则aij=0。整数1,2,m用来表示m种不同颜色。顶点i所着颜色用xi表

5、示。数组x1:n是问题的解向量。问题的解空间可表示为一棵高度为n+1的完全m叉树。解空间树的第i(1=in时,算法搜索至叶结点,得到新的m着色方案,当前找到的m可着色方案数sum增1。当i=n时,当前扩展结点Z是解空间中的内部结点。该结点有xi=1,2,,m共m个儿子结点。对当前扩展结点Z的每一个儿子结点,由方案ok检查其可行性,并以深度优先的方式递归地对可行子树搜索,或剪去不可行子树。五、实验程序功能模块1、装载问题import java.io.IOException;public class MainLoading public static void main(String args)

6、throws IOException Loading loading = new Loading();int n = 4;System.out.println(集装箱个数: + n);int x = new intn + 1;String b = new Stringn;String a = 30 50 20 70;System.out.println(集装箱重量: + a);int w = new intn + 1;w1 = 30;w2 = 50;w3 = 20;w4 = 70;int c1 = 130;int c2 = 70;System.out.println(轮船载重量: + c1 +

7、 , + c2);int result = loading.maxloading(w, c1, x);int max, temp;for (int i = 1; i 3; i+) for (int j = 2; j wj) temp = wi;wi = wj;wj = temp;if (w3 c1) & (w3 c2) System.out.println(都不可装); else System.out.println(轮船1装载的集装箱:);for (int u = 1; u (result + c2)System.out.println(轮船1可装: + result + + 轮船2装不完.

8、);else System.out.println(轮船2装载的集装箱:);for (int u = 1; u n + 1; u+)if (loading.bestxu = 0)System.out.println(u + );System.out.println(最优装载-轮船1: + result + + 轮船2:+ (loading.r - result);public class Loading static int n;static int w;static int c1, c2; / 第一、二艘轮船的载重量static int cw;static int bestw;static

9、int r;static int x;static int bestx;public static int maxloading(int ww, int cc, int xx) n = ww.length - 1;w = ww;c1 = cc;bestw = 0;cw = 0;x = new intn + 1;bestx = xx;r = 0;for (int i = 1; i n) if (cw bestw) for (int j = 1; j = n; j+)bestxj = xj;bestw = cw;return;r -= wi;if (cw + wi bestw) xi = 0;backtrack(i + 1);r += wi;2、n后问题import java.io.IOException;public class MainNQueen public static void main(String args) nQueen nqueen = new nQueen();int nn; / 输入n值int sum; / 可行方案个数try nn = 4; / 将输入值转换为int保存if (nn = 0) throw new IOException(不能输入负数);System.out.println(方格数是:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号