ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:33.12KB ,
资源ID:7826095      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7826095.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(回溯与分支限界算法设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

回溯与分支限界算法设计.docx

1、回溯与分支限界算法设计 算法设计与分析实验报告专 业班 级姓 名学 号实验名称实验四:回溯与分支限界算法设计实验目的1.掌握回溯法解决问题的一般步骤。2.学会使用回溯法解决实际问题。3.掌握分支限界法解决问题的基本思想。4.学会使用分支限界法解决实际问题。实验内容1. 骑士游历问题(采用回溯法):在国际象棋的棋盘(8行8列)上放置一个马,按照“马走日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并且每格只到达一次。若给定起始位置(x0,y0),编程探索出一条路径,沿着这条路径马能遍历棋盘上的所有单元格。2. 行列变换问题(采用分支限界法):给定两个mn方格阵列组成的图形A和图形B,每个方格的

2、颜色为黑色或白色,如下图所示。行列变换问题的每一步变换可以交换任意2行或2列方格的颜色,或者将某行或某列颠倒。上述每次变换算作一步。试设计一个算法,计算最少需要多少步,才能将图形A变换为图形B。算法描述1. 骑士游历问题的解题思路或算法思想:如果在每步选择方向时,不是任意选择一个方向,而是经过一定的测试和计算,“预见”每条路的“宽窄”,再选择一条最“窄”的路先走,成功的可能性较大。理由是先走“困难的路”,光明大道留在后面。因为每一格迟早都要走到,与其把困难留在后面,不如先走“困难的路”,这样路就会越走越宽,成功的机会就越大。这种方法称为预见算法。为每个方向测定一个值可通路数,它表示该位置上还有

3、多少条通路。在每一格上对8个方向都进行试探,并分析比较,下一步应该选择可通路数值最小的方向走。2. 行列变换问题的解题思路或算法思想:先进先出队列式分支限界法输入数据,将计算出的最少变换次数和相应的变换序列输出。第1 行是最少变换次数。从第2 行开始,每行用4 个数表示一次变换。程序及运行结果1. 骑士游历问题的程序:package com.t5;import java.util.Scanner; public class Qishi private boolean Travel(int firstX, int firstY, int board) / 对应骑士可走的8个方向 int move

4、x = -2, -1, 1, 2, 2, 1, -1, -2 ; int movey = 1, 2, 2, 1, -1, -2, -2, -1 ; / 下一步出路的位置 int nextStepX = new intboard.length; int nextStepY = new intboard.length; / 记录出路的个数 int exitS = new intboard.length; int nextX = firstX; int nextY = firstY; boardnextXnextY = 1; for (int m = 2; m = Math.pow(board.le

5、ngth, 2); m+) /初始化下一个位置可走的位置的数目 for (int i = 0; i board.length; i+) exitSi = 0; int count = 0; / 试探8个方向 for (int i = 0; i 8; i+) int temI = nextX + movexi; int temJ = nextY + moveyi; / 走到边界,路断 if (temI 7 | temJ 7) continue; / 记录下可走的方向 if (0 = boardtemItemJ) nextStepXcount = temI; nextStepYcount = te

6、mJ; count+; / 到这里,cout表示当前点有几种走法。nextStep中存储各种走法的坐标。 int min = -1; if (count = 0) return false; if (1 = count) min = 0; else for (int i = 0; i count; i+) for (int j = 0; j 8; j+) int temI = nextStepXi + movexj; int temJ = nextStepYi + moveyj; if (temI 7 | temJ 7) continue; / 记录下这个位置可走的方向数 if (0 = bo

7、ardtemItemJ) exitSi+; int tem = exitS0; min = 0; / 从可走的方向中,寻找最少走的出路 for (int i = 1; i exitSi) tem = exitSi; min = i; / 得到最少的出路 nextX = nextStepXmin; nextY = nextStepYmin; boardnextXnextY = m; return true; public static void main(String args) int firstX, firstY; System.out.println(输入起始点(0-7):); Scann

8、er scanner = new Scanner(System.in); firstX = scanner.nextInt(); firstY = scanner.nextInt(); int board = new int88; Qishi knight = new Qishi(); if (knight.Travel(firstX, firstY, board) System.out.println(游历完成:); else System.out.println(游历失败!n); for (int i = 0; i board.length; i+) for (int j = 0; j b

9、oard0.length; j+) if (boardij 10) System.out.print( + boardij); else System.out.print(boardij); System.out.print( ); System.out.println(); 实例:2. 行列变换问题的程序:package com.t8;import java.util.LinkedList;import java.util.Scanner;class graph static int sour, dest;/sour是图形的初始整数,dest是图形的目的整数 static int ans=n

10、ew int116;/静态变量(即全局变量),用于存放图形变换的路径 int m=4,n=4,x; int row=new int4; int col=new int4; void setx(int x) this.x=x; int getx() return this.x; void rowx()/将一个整数划分成四行二进制 int y; for(int i=0;im;i+) y=1; rowi=0; for(int j=0;jn;j+) if(x&1)!=0) /如果x的最低位是1 rowi|=y; y=1; void colx()/将一个整数划分成四列二进制 int y; for(int

11、 j=0;jn;j+) colj=0; y=1; for(int i=0;im;i+) for(int j=0;j=1; y=1; void rowy()/将四行二进制转换成一个整数 int z=1, x=0, y; for(int i=0;im;i+) y=rowi; for(int j=0;jn;j+) if(y&1)!=0) /如果y的最低位是1 x|=z; z=1; this.x=x; void coly()/将四列二进制转换成一个整数 int z=1, x=0, y; for(int i=0;im;i+) for(int j=0;jn;j+) if(colj&1)!=0) /如果y的

12、最低位是1 x|=z; z=1; this.x=x; void Swaprow(int i, int j)/将二进数进行行互换 int o; o=rowi; rowi=rowj; rowj=o; void Swapcol(int i, int j)/将二进数进行列互换 int o; o=coli; coli=colj; colj=o; void reveR(int k)/将二进数进行行颠倒 int y=0, z=1(4-1); for(int j=0;j=1; rowk=1; rowk=y; void reveC(int k)/将二进数进行列颠倒 int y=0, z=1(4-1); for(

13、int j=0;j=1; colk=1; colk=y; int rowswap(int x, int i, int j)/将二进制数的第i行与第j行互换 this.x=x; rowx(); Swaprow(i,j); rowy(); return this.x; int colswap(int x, int i, int j)/将二进制数的第i列与第j列互换 this.x=x; colx(); Swapcol(i,j); coly(); return this.x; int revrow(int x, int k)/将二进制数的第K行颠倒 this.x=x; rowx(); reveR(k)

14、; rowy(); return this.x; int revcol(int x, int k)/将二进制数的第K列颠倒 this.x=x; colx(); reveC(k); coly(); return this.x; public class Tuxing public static void main(String args) final int Maxsize=116; graph gN;/用于进行行变换、列变换、行颠倒、列颠倒 int E,N;/变换前的初始值,变换前的结果值 gN=new graph(); int hash=new int116; int i,j,h=0;cha

15、r c; graph G1=new graph(); /初始化,输入初始值和目标值,即1010010000101010和1010000001100101 Scanner scanner = new Scanner(System.in); String ss=scanner.nextLine(); charchArrs=ss.toCharArray(); for(graph.sour=i=0;i16;i+) c=chArrsi; graph.sour|=(int)(c-0)i; String sd=scanner.nextLine(); charchArrd=sd.toCharArray();

16、for(graph.dest=i=0;i16;i+) c=chArrdi; graph.dest|=(int)(c-0)i; LinkedList queue=new LinkedList();/初始化先进先出队列 for(int k=0; kMaxsize;k+)hashk=-1; G1.x=graph.sour; hashG1.x=0; queue.add(G1.x); while(!queue.isEmpty()/以先进先出队列式实现分支限界法 E=(int)queue.removeFirst(); for(i=0;i4-1;i+)/行变换 for(j=i+1;j4;j+) gN.x=g

17、N.rowswap(E,i,j); N=gN.x; if(hashN=-1) hashN=hashE+1; graph.ansN=E; queue.add(N); for(i=0;i4-1;i+)/列变换 for(j=i+1;j4;j+) gN.x=gN.colswap(E,i,j); N=gN.x; if(hashN=-1) hashN=hashE+1; graph.ansN=E; queue.add(N); for(i=0;i4;i+)/行颠倒 gN.x=gN.revrow(E,i); N=gN.x; if(hashN=-1) hashN=hashE+1; graph.ansN=E; qu

18、eue.add(N); for(i=0;i4;i+)/列颠倒 gN.x=gN.revcol(E,i); N=gN.x; if(hashN=-1) hashN=hashE+1; graph.ansN=E; queue.add(N); if(hashgraph.dest!=-1)/如果目的值被遍历到,则退出循环 System.out.println(OK);break; System.out.println(hashgraph.dest); output(graph.dest);/输出变换的路径 public static void outb(int x)/将一个整数以四行二进制的形式显示 for

19、(int i=0; i4;i+) for(int j=0;j4;j+) if(x&1)!=0)System.out.print(1); else System.out.print(0); x/=2; System.out.println(); public static void output(int N) if(N=graph.sour) System.out.println(); outb(N); return; output(graph.ansN);/graph.ansN存放着从初始值到目的值的遍历路径 System.out.println(); outb(N); 实例:总结实验心得体会:掌握回溯法解决问题的一般步骤。学会使用回溯法解决实际问题。掌握分支限界法解决问题的基本思想。学会使用分支限界法解决实际问题改进意见: 对于分支限界法了解的不透彻,应与老师沟通解决此问题,回溯法可以帮我们更好的解决一些多解的复杂性问题,所以,要更好的去学习和运用回溯法思想。实验成绩: 指导教师: 年 月 日

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1