回溯算法实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中南大学

《算法设计与分析》实验报告

姓名:

专业班级:

学号:

指导教师:

完成日期:20010.1

一.实验名称

回溯算法实验

二.实验目的

1. 掌握回溯算法思想

2. 掌握回溯递归原理

3. 了解回溯法典型问题

三.实验内容

1. 编写一个简单的程序,解决8皇后问题

2. 批处理作业调度

3. 数字全排列问题

四.算法思想分析

1. 编写一个简单的程序,解决8皇后问题

在N*N的棋盘上,放置N个皇后,要求每一横行,每一列,每一对角线上均只能放置一个皇后,求可能的方案及方案数。问题的状态即棋盘的布局状态,状态空间树的根为空棋盘,每个布局的下一步可能布局为该布局结点的子结点;任意两个王后不放在同一行或同一列或同一斜线。因此为了简化状态空间树,采用逐行布局的方式,即每个布局有n个子结点

回溯过程分析:

(1)从空棋盘起,逐行放置棋子。

(2)每在一个布局中放下一个棋子,即推演到一个新的布局。

(3)如果当前行上没有可合法放置棋子的位置,则回溯到上一行,重新布放上一行的棋子。

2. 批处理作业调度

给定n个作业的集合J=(J1, J2, … , Jn)。每一个作业Ji都有两项任务需要分别在2台机器上完成。每一个作业必须先由机器1处理,然后再由机器2处理。作业Ji需要机器i的处理时间为tji,i=1,2, … ,n; j=1,2。对于一个确定的作业调度,设Fji是作业i在机器i上完成处理的时间。则所有作业在机器2上完成处理的时间和成为该作业调度的完成时间和。

批处理作业调度问题要求对于给定的n个作业,制定一个最佳的作业调度方案,使其完成时间和达到最小。

要求输入: a.作业数 b.每个作业完成时间表:

要求输出: a.最佳完成时间 b.最佳调度方案

3. 数字全排列问题

任意给出从1到N的N个连续的自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式:123,132,213,231,312,321。

注意:数字不能重复,N由键盘输入(N<=9)。

五.算法源代码及用户屏幕

1. 八皇后问题

(备注:语言:c;编译环境:c-free3.5;共1个文件)

#include

#define N 8

int count=0;

int M[N]={0},L[2*N]={0},R[2*N]={0};

int A[N][N]={0};

void print(int A[N][N]);

void main()

{

int mytry(int i,int M[N],int L[2*N],int R[2*N],int A[N][N]);

int n=mytry(0,M,L,R,A);

cout<<"\n count="<

}

int mytry(int i,int M[N],int L[2*N],int R[2*N],int A[N][N])

{

for(int j=0; j

if(!M[j]&&!L[i-j+N]&&!R[i+j])

{

A[i][j]=1;

M[j]=L[i-j+N]=R[i+j]=1;

if(i==N-1)

{

print(A);cout<

}

else

mytry(i+1,M,L,R,A);

A[i][j]=0;

M[j]=L[i-j+N]=R[i+j]=0;

}

return count;

}

void print(int A[N][N])

{

int i,j;

for(i=0;i

{

for(j=0;j

cout<<" "<

cout<

}

}

用户屏幕(部分):

2. 批处理作业调度

(备注:语言JAVA;编译环境:Eclipse SDK 3.2.0;共1个文件)////FlowShop.java ////////////////////////////

import java.util.*;

public class FlowShop

{

static int n;

static int f1;

static int f;

static int bestf;

static int[][] m;

static int[] x;

static int[] bestx;

static int[] f2;

public static void trackback(int i) {

if (i == n) {

for (int j = 0; j < n; j++) {

bestx[j] = x[j];

}

bestf = f;

} else {

for (int j = i; j < n; j++) {

f1 += m[x[j]][0];

if (i > 0) {

f2[i] = ((f2[i - 1] > f1) ? f2[i - 1] : f1) + m[x[j]][1]; } else {

f2[i] = f1 + m[x[j]][1];

}

f += f2[i];

if (f < bestf) {

swap(x, i, j);

trackback(i + 1);

swap(x, i, j);

}

f1 -= m[x[j]][0];

f -= f2[i];

}

}

}

private static void swap(int[] x, int i, int j) {

int temp = x[i];

x[i] = x[j];

x[j] = temp;

}

private static void test() {

n = 3;

int[][] testm = {{2, 1}, {3, 1}, {2, 3}};

m = testm;

int[] testx = {0, 1, 2};

x = testx;

bestx = new int[n];

f2 = new int[n];

相关文档
最新文档