回溯算法实验报告

回溯算法实验报告
回溯算法实验报告

本科学生综合性实验报告

姓名刘春云学号0103918___

专业软件工程班级_软件103班__

实验项目名称_n皇后问题的回溯算法实验

指导教师及职称_赵晓平__教授__

开课学期2011 至_2012 学年_三_学期

上课时间2012 年 2 月20 日

学生实验报告(3)

一、问题描述

n后问题是指在一个n*n的棋盘上放置n个皇后,使得它们彼此不受攻击。而一个皇后可以攻击与它处在同一行或同一列或同一斜线上的任何棋子。故n后问题可以理解为:在一个n*n的棋盘内放置n个皇后,使任意两个皇后不处在同一行或同一列或同一斜线上。

在这个问题中,我用了一个n*n的数组来存储棋盘,由于n后问题的典型是8皇后问题,所以我做的是8皇后问题。得出的解以以下形式出现在文件中:8皇后问题

第1个解为:

oxxxxxxx

xxxxoxxx

xxxxxxxo

xxxxxoxx

xxoxxxxx

xxxxxxox

xoxxxxxx

xxxoxxxx

二、解题思路

根据条件可以知道皇后肯定是每行都有且只有一个所以我们创建一个数组c[cur]让数组角标表示八皇后的行,用这个角标对应的数组值来确定这个皇后在这行的那一列。

我用递归来做这问题。要求皇后所在的位置必须和其他皇后的位置不在同一行、列和斜线上,所以这个限定条件可以用来判断一个皇后是否能放在当前位置。既然是用递归来解决问题那就要把这个问题分成一个个相同的小问题来实现。

这小问题是什么呢?不难发现我们要在n*n的方格里放好n个皇后那我们就要知道在n(列)*n-1(行)是怎么放的,再有我们事先写好的判断条件放好最后行就搞定了。以此类推我们要知道8*7的怎么方的我们就要知道8*6是怎么样的就好了。所以我们是以一行怎么放作为一个单元,每一行有n个位置可以放,每一个位置我

们都要去判断一下所以我们就用循环来搞定。在这个循环里面我们让c[cur]=i也就是从这一行的第一个开始判断。先尝试放再去判断是否符合条件。如果符合条件我们就在调用这个函数本身向下一行搜索

在进行判断下一行之前我们要判断一下cur是不是大于n也就是已经是最后一行了,如果是最后一行了我们就可以将其进行输出。打印n*n的矩阵皇后的位置用o 表示出来没有的用x表示。

三、算法描述

分析:每个皇后在一行。做个n重循环,把每个皇后安排在每行的每个位置都试一遍。

1、棋盘是n*n数组,定义n+1个空棋盘。

2、第一个皇后从1行1列到1行n列循环。

3、第二个皇后从2行1列到2行8列循环。

用c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j]来判断是否与前面放置的皇后冲突若本点不符合,则此点能放棋子,继续搜索。否则退出循环

4、以此类推

在算法中#define n 8控制皇后个数int *c; 指向n*n的数组指针search函数是搜索下一行中哪列符合条件

for(j=1;j

if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j])//同列、同正对角线、同负对角线

{

ok=0;

break;

}/这个for循环检测是否与前cur-1行的皇后有冲突

四、算法实现

具体代码:

#include

#include

using namespace std;

#define n 8 //控制皇后个数

int *c; //指向n*n的数组指针

void search(int cur)

{

void show();

int i,j;

if(cur==n+1)

show();//只要走到这,就一定可以有一组解并将它们输出

else

for(i=1;i<=n;i++)//按列搜索

{

bool ok=1;

c[cur]=i; //尝试将第cur行的皇后放入第i列

for(j=1;j

if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j])//同列、同正对角线、同负对角线

{

ok=0;

break;

}

if(ok)

search(cur+1);//不冲突,继续搜索

}

}

void show()

{

ofstream outfile;

outfile.open("output.txt",ios::app);//打开output文件

static int count=0;//静态变量计算解的个数

outfile<<"第"<<++count<<"个解为:"<

for(int i=1;i<=n;i++)//在文件中输出结果:o表示皇后在,x表示皇后不在

{

for(int j=1;j<=n;j++)

{

if(c[i]==j)

outfile<<"o";

else

outfile<<"x";

}

outfile<

}

}

void main()

{

c=new int[n+1];

ofstream outfile;

outfile.open("output.txt",ios::app);//创建output文件

outfile<

search(1);//由第一行开始搜索

outfile.close();

}

五、程序测试及分析

结果输出:

六、总结

回溯法是一种最一般的算法设计方法,特别适用于求解那些涉及到寻求一组解的问题或者求满足某些约束条件的最优解的问题。我解决n皇后问题用的算法正是基于回溯算法的思想提出的一种递归算法,并且找出了八皇后问题的92个真正不同的解,此算法具有结构清晰,容易理解且可读性强等优点,并且通过稍加变通也可以适用于其他类似问题,例如汉诺塔等。与非递归算法设计相比,它往往更容易一些,但是会耗费更多的时间和空间,执行效率不高。

七、导教师评语及成绩:

评语:

成绩:指导教师签名:

批阅日期:

回溯法实验(0-1背包问题)

算法分析与设计实验报告第五次附加实验

附录: 完整代码(回溯法) //0-1背包问题回溯法求解 #include using namespace std; template class Knap //Knap类记录解空间树的结点信息 { template friend Typep Knapsack(Typep [],Typew [],Typew,int); private: Typep Bound(int i); //计算上界的函数 void Backtrack(int i); //回溯求最优解函数

Typew c; //背包容量 int n; //物品数 Typew *w; //物品重量数组| Typep *p; //物品价值数组 Typew cw; //当前重量 Typep cp; //当前价值 Typep bestp; //当前最后价值 }; template Typep Knapsack(Typep p[],Typew w[],Typew c,int n); //声明背包问题求解函数template inline void Swap(Type &a,Type &b); //声明交换函数 template void BubbleSort(Type a[],int n); //声明冒泡排序函数 int main() { int n ;//物品数 int c ;//背包容量 cout<<"物品个数为:"; cin>>n; cout<<"背包容量为:"; cin>>c; int *p = new int[n];//物品价值下标从1开始 int *w = new int[n];//物品重量下标从1开始 cout<<"物品重量分别为:"<>w[i]; } cout<<"物品价值分别为:"<>p[i]; } cout<<"物品重量和价值分别为:"<

子集和数的回溯算法

设计四 子集和数的回溯算法 班级通信08-2BF 学号1408230929 姓名杨福 成绩 分 一、 设计目的 1.掌握回溯法解题的基本思想; 2.掌握子集和数问题的回溯算法; 3.进一步掌握子集和数问题的回溯递归算法、迭代算法的基本思想和算法设计方法; 二、 设计内容 a) 任务描述 1)子集和数问题简介 子集和数问题是假定有n 个不同的正数(通常称为权),要求找出这些数中所有事的某和数为M 的组合。 2)设计任务简介 设计、编程、测试求解子集和数问题的回溯算法。 1. 子集和数问题的表示方案 本设计利用大小固定的元组来研究回溯算法,在此情况下,解向量的元素X (i )取1或0值,它表示是否包含了权数W (i ). 生成图中任一结点的儿子是很容易的。对于i 级上的一个结点,其左儿子对应于X (i )=1,右儿子对应于X(i)=0。对于限界函数的 一种简单选择是,当且仅当∑∑+==≥+ n k i k i M i W i X i W 11)()()(时,B(X(1),〃〃〃,X (k ))=true 。 显然,如果这个条件不满足,X(1),〃〃〃,X (k )就不能导致一个答案结点。如果假定这些W (i )一开始就是按非降次序列排列的,那么这些限界函数可以被强化。在这种情 况下,如果M k W i X i W k i >++∑=)1()()(1 ,则X(1),〃〃〃,X (k )就不能导致一个答案结 点。因此,将要使用的限界函数是B k (X (1),〃〃〃,X (k ))=true,当且仅当 M i W i X i W n k i k i =+∑∑+==11)()()(。 2. 主要数据类型与变量 int M ; // 表示要求得到的子集和; int s; // 表示所选当前元素之前所选的元素和;

回溯法实验(最大团问题)

算法分析与设计实验报告第七次附加实验

} } 测试结果 当输入图如下时: 当输入图如下时: 1 2 3 4 5 1 2 3 4 5

当输入图如下时: 1 2 3 4 5

附录: 完整代码(回溯法) //最大团问题回溯法求解 #include using namespace std; class Clique { friend void MaxClique(int **,int *,int ); private: void Backtrack(int i); int **a; //图的邻接矩阵 int n; //图的顶点数 int *x; //当前解 int *bestx; //当前最优解 int cn; //当前顶点数 int bestn; //当前最大顶点数 }; void Clique::Backtrack(int i) { //计算最大团 if(i>n) //到达叶子节点 { for(int j=1;j<=n;j++) bestx[j]=x[j]; bestn=cn;

cout<<"最大团:("; for(int i=1;i=bestn) { //修改一下上界函数的条件,可以得到 x[i]=0; //相同点数时的解 Backtrack(i+1); } } void MaxClique(int **a,int *v,int n) { //初始化Y Clique Y; Y.x=new int[n+1]; Y.a=a; Y.n=n; https://www.360docs.net/doc/7d10560732.html,=0; Y.bestn=0; Y.bestx=v; Y.Backtrack(1); delete [] Y.x; cout<<"最大团的顶点数:"<

回溯搜索算法

补充2 回溯法 解回溯法的深度优先搜索策略 z理解回溯法的深度优先搜索策略。 z掌握用回溯法解题的算法框架 (1)递归回溯 (2)迭代回溯 (3)子集树算法框架 (4)排列树算法框架 通过应用范例学习回溯法的设计策略 z通过应用范例学习回溯法的设计策略。

Sch2-1z Sch2-1 方法概述搜索算法介绍 (1)穷举搜索 (2)盲目搜索 —深度优先(DFS)或回溯搜索( Backtracking); —广度优先搜索( BFS ); (Branch &Bound) —分支限界法(Branch & Bound);—博弈树搜索( α-βSearch) (3)启发式搜索 —A* 算法和最佳优先( Best-First Search ) —迭代加深的A*算法 —B*AO*SSS*等算法B , AO , SSS 等算法 —Local Search, GA等算法

Sch2-1z Sch2-1 方法概述搜索空间的三种表示: —表序表示:搜索对象用线性表数据结构表示; —显示图表示:搜索对象在搜索前就用图(树)的数据结构表示; —隐式图表示:除了初始结点,其他结点在搜索过程中动态生成。缘于搜索空间大,难以全部存储。 z 搜索效率的思考:随机搜索 —上世纪70年代中期开始,国外一些学者致力于研究随机搜索求解困难的组合问题,将随机过程引入搜索; —选择规则是随机地从可选结点中取一个从而可以从统计角度分析搜选择规则是随机地从可选结点中取一个,从而可以从统计角度分析搜索的平均性能; —随机搜索的一个成功例子是:判定一个很大的数是不是素数,获得了第个多式时算法 第一个多项式时间的算法。

回溯法实验报告

实验04 回溯法 班级:0920561 姓名:宋建俭学号:20 一、实验目的 1.掌握回溯法的基本思想。 2.掌握回溯法中问题的解空间、解向量、显式约束条件、隐式约束条件以及子 集树与排列树的递归算法结构等内容。 3.掌握回溯法求解具体问题的方法。 二、实验要求 1.认真阅读算法设计教材,了解回溯法思想及方法; 2.设计用回溯算法求解装载问题、n后问题、图的m着色问题的java程序 三、实验内容 1.有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱 i的重量为wi,且∑wi≤C1+C2。装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。 2.在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则, 皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 3.给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每 个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。 这个问题是图的m可着色判定问题。 四、算法原理 1、装载问题 用回溯法解装载问题时,用子集树表示其解空间是最合适的。可行性约束可剪去不满足约束条件(w1x1+w2x2+…+wnxn)<=c1的子树。在子集树的第j+1层结点Z处,用cw记当前的装载重量,即cw=(w1x1+w2x2+…+wjxj),当cw>c1时,以结点Z为根的子树中所有结点都不满足约束条件,因而该子树中的解均为不可行解,故可将该子树剪去。 解装载问题的回溯法中,方法maxLoading返回不超过c的最大子集和,但未给出达到这个最大子集和的相应子集。 算法maxLoading调用递归方法backtrack(1)实现回溯搜索。Backtrack(i)搜索

第一章回溯法(习题二

1.5 走迷宫(maze.pas)* 【问题描述】 有一个m * n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m * n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向(搜索顺寻:左上右下)。如果一条路都不可行,则输出相应信息(用-1表示无路)。 【输入】 第一行是两个数据m,n(1”表示方向。 如果没有一条可行的路则输出-1。 【样例】 maze,in 5 6 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 5 6 Maze.out (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5 )->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5 )->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6) (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6) 1.6 单向双轨道(track.pas)***

回溯算法实验

中原工学院信息商务学院 实验报告 实验项目名称回溯划算法的应用 课程名称算法设计与分析 学院(系、部)中原工学院信息商务学院学科专业计算机科学与技术系班级学号计科132班17号姓名程一涵 任课教师邬迎 日期2014年12月9日

实验五回溯算法的应用 一、实验目的 1.掌握回溯算法的基本概念 2.熟练掌握回溯算法解决问题的基本步骤。 3.学会利用回溯算法解决实际问题。 二.问题描述 题目一:N皇后问题 要在n*n的国际象棋棋盘中放n个皇后,使任意两个皇后都不能互相吃掉。规则:皇后能吃掉同一行、同一列、同一对角线的任意棋子。求所有的解要求:键盘输入皇后的个数n (n ≤ 13) 输出有多少种放置方法 输入输出实例:

三.算法设计 首先,确定第一行皇后的位置,再确定第二行的位置,并且要注意不能同行同列同对角线,若是发现有错则返回上一层,继续判断。满足约束条件时,则开始搜索下一个皇后的位置,直到找出问题的解。 四.程序调试及运行结果分析 五.实验总结 通过这次试验,使得我们面对问题时的解题思路变得更加灵活和多变,并且使我们的编写能力稍稍的提高一些。初步了解了回溯算法,回溯算法实际是一个类似枚举的搜索尝试方法,他的主题思想是在搜索尝试的过程中寻找问题的解,当发现已不满足求解条件时,就回溯返回,尝试别的路径。他特别适用于求解那些涉及到寻求一组解的问题或者求满足某些约束条件的最优解的问题。此算法具有结构清晰,容易理解且可读性强等优点,并且通过稍加变通也可以适用于其他类似问题

附录:程序清单(程序过长,可附主要部分) #include #include using namespace std; int a[20],n; backdate(int n); int check(int k); void output(int n); int main() { int n; cout<<"请输入皇后的个数:"; cin>>n; cout<<"位置排列是:"<0) { a[k]=a[k]+1; while((a[k]<=n) && (check(k)==0)) a[k]=a[k]+1; if(a[k]<=n) if(k==n) { num++; output(n); } else { k=k+1; a[k]=0; } else k=k-1; } cout<<"一共有"<

算法设计与分析:回溯法-实验报告

应用数学学院信息安全专业班学号姓名 实验题目回溯算法 实验评分表

实验报告 一、实验目的与要求 1、理解回溯算法的基本思想; 2、掌握回溯算法求解问题的基本步骤; 3、了解回溯算法效率的分析方法。 二、实验内容 【实验内容】 最小重量机器设计问题:设某一个机器有n个部件组成,每个部件都可以m个不同供应商处购买,假设已知表示从j个供应商购买第i个部件的重量,表示从j个供应商购买第i个部件的价格,试用回溯法求出一个或多个总价格不超过c且重量最小的机器部件购买方案。 【回溯法解题步骤】 1、确定该问题的解向量及解空间树; 2、对解空间树进行深度优先搜索; 3、再根据约束条件(总价格不能超过c)和目标函数(机器重量最小)在搜索过程中剪去多余的分支。 4、达到叶结点时记录下当前最优解。 5、实验数据n,m, ] ][ [j i w,] ][ [j i c的值由自己假设。 三、算法思想和实现【实现代码】

【实验数据】 假设机器有3个部件,每个部件可由3个供应商提供(n=3,m=3)。总价不超过7(c<=7)。 部件重量表: 部件价格表: 【运行结果】

实验结果:选择供应商1的部件1、供应商1的部件2、供应商3的部件3,有最小重量机器的重量为4,总价钱为6。 四、问题与讨论 影响回溯法效率的因素有哪些? 答:影响回溯法效率的因素主要有以下这五点: 1、产生x[k]的时间; 2、满足显约束得x[k]值的个数; 3、计算约束函数constraint的时间; 4、计算上界函数bound的时间; 5、满足约束函数和上界函数约束的所有x[k]的个数。 五、总结 这次实验的内容都很有代表性,通过上机操作实践与对问题的思考,让我更深层地领悟到了回溯算法的思想。 回溯算法的基本思路并不难理解,简单来说就是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。回溯法的基本做法是深度优先搜索,是一种组织得井井

回溯法

回溯法 回溯法也是搜索算法中的一种控制策略,但与枚举法不同的是,它是从初始状态出发,运用题目给出的条件、规则,按照深度优秀搜索的顺序扩展所有可能情况,从中找出满足题意要求的解答。回溯法是求解特殊型计数题或较复杂的枚举题中使用频率最高的一种算法。 一、回溯法的基本思路 何谓回溯法,我们不妨通过一个具体实例来引出回溯法的基本思想及其在计算机上实现的基本方法。【例题12.2.1】n皇后问题 一个n×n(1≤n≤100)的国际象棋棋盘上放置n个皇后,使其不能相互攻击,即任何两个皇后都不能处在棋盘的同一行、同一列、同一条斜线上,试问共有多少种摆法? 输入: n 输出: 所有分案。每个分案为n+1行,格式: 方案序号 以下n行。其中第i行(1≤i≤n)行为棋盘i行中皇后的列位置。 在分析算法思路之前,先让我们介绍几个常用的概念: 1、状态(state) 状态是指问题求解过程中每一步的状况。在n皇后问题中,皇后所在的行位置i(1≤i≤n)即为其时皇后问题的状态。显然,对问题状态的描述,应与待解决问题的自然特性相似,而且应尽量做到占用空间少,又易于用算符对状态进行运算。 2、算符(operater) 算符是把问题从一种状态变换到另一种状态的方法代号。算符通常采用合适的数据来表示,设为局部变量。n皇后的一种摆法对应1..n排列方案(a1,…,a n)。排列中的每个元素a i对应i行上皇后的列位置(1≤i≤n)。由此想到,在n皇后问题中,采用当前行的列位置i(1≤i≤n)作为算符是再合适不过了。由于每行仅放一个皇后,因此行攻击的问题自然不存在了,但在试放当前行的一个皇后时,不是所有列位置都适用。例如(l,i)位置放一个皇后,若与前1..l-1行中的j行皇后产生对角线攻击(|j-l|=|a j -i|)或者列攻击(i≠a j),那么算符i显然是不适用的,应当舍去。因此,不产生对角线攻击和列攻击是n皇后问题的约束条件,即排列(排列a1,…,a i,…,a j,…,a n)必须满足条件(|j-i|≠|a j-a i|) and (a i≠a j) (1≤i,j≤n)。 3、解答树(analytic tree) 现在让我们先来观察一个简单的n皇后问题。设n=4,初始状态显然是一个空棋盘。 此时第一个皇后开始从第一行第一列位置试放,试放的顺序是从左至右、自上而下。每个棋盘由4个数据表征相应的状态信息(见下图): (××××)

算法分析与设计实验四回溯法

实验四 回溯法 实验目的 1. 掌握回溯法的基本思想方法; 2. 了解适用于用回溯法求解的问题类型,并能设计相应回溯法算法; 3. 掌握回溯法算法复杂性分析方法,分析问题复杂性。 预习与实验要求 1. 预习实验指导书及教材的有关内容,掌握回溯法的基本思想; 2. 严格按照实验内容进行实验,培养良好的算法设计和编程的习惯; 3. 认真听讲,服从安排,独立思考并完成实验。 实验设备与器材 硬件:PC 机 软件:C++或Java 等编程环境 实验原理 回溯法是最常用的解题方法,有“通用的解题法”之称。当要解决的问题有若干可行解时,则可以在包含问题所有解的空间树中,按深度优先的策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,继续查找该结点的兄弟结点,若它的兄弟结点都不包含问题的解,则返回其父结点——这个步骤称为回溯。否则进入一个可能包含解的子树,继续按深度优先的策略进行搜索。这种以深度优先的方式搜索问题的解的算法称为回溯法。它本质上是一种穷举法,但由于在搜索过程中不断略过某些显然不合适的子树,所以搜索的空间大大少于一般的穷举,故它适用于解一些组合数较大的问题。 回溯法也可以形式化地描述如下:假设能够用n 元组()n i x x x x ,,,,,21 表示一个给定问题P 的解,其中i i S x ∈。如果n 元组的子组()i x x x ,,,21 ()n i <满足一定的约束条件,则称为部分解。如果它已经是满足约束条件的部分解,则添加11++∈i i S x 形成新的子组()121,,,,+i i x x x x ,并检查它是否满足约束条件,若仍满足则继续添加22++∈i i S x ,并以此类推。如果所有的11++∈i i S x 都不满足约束条件,那么去掉1+i x ,回溯到i x 的位置,并去掉当前的i x ,另选一个i i S x ∈',组成新的子组()i x x x ',,,21 ,并判断其是否满足约束条件。如此反复下去,直到得到解或者证明无解为止。

大学计算机基础第五章

大学计算机基础第五章 第五章软件技术基础 1.程序设计语言 (1)机器语言和汇编语言 由计算机硬件系统可以识别的指令组成的语言称为机器语言。汇编语言是将机器指令映射为一些可以被人读懂的助记符。由于计算机只能识别机器语言,所以汇编语言通常需要通过汇编程序翻译为机器语言。汇编语言的翻译软件称为汇编程序,它可以将程序员写的助记符直接转换为机器指令,然后由计算机去识别和执行。用机器语言编写的程序是计算机可以直接执行的程序。 用机器语言编写的程序,代码长度短,执行效率高。但是,这种语言的缺点也很明显。最主要的是编写机器语言程序必须要熟知CPU 的指令代码,编写程序既不方便,又容易出错,调试查错也非常困难。而且编写的程序只能在特定的机器上运行,没有通用性。 (2)高级语言 高级语言源程序翻译为指令代码有两种做法:编译或者解释。编译通过编译程序来完成。解释则是通过解释程序完成。解释的结果产生可以直接执行的指令。编译的结果是得到目标程序。目标程序也是要经过连接才会得到可执行程序目前应用比较广泛的几种高级语言由FORTRAN/BASIC/PASCAL/C等。 (3)面向对象的语言 (4)未来的语言 2、语言处理程序语言处理程序是把源程序翻译成机器语言的程序,可分为三种:汇编程序、编译程序和解释程序。 (1)汇编程序把汇编语言源程序翻译成机器语言程序的程序称为汇编程序,翻译的过程称为汇编。汇编程序在翻译源程序时,总是对源程序从头到尾一个符号一个符号地进行阅读分析,一般用两遍扫描完成对源程序的加工转换工作。汇编语言在翻译的同时,还对各种形式的错误进行检查和分析,并反馈给用户,以便修改。反汇编程序也是一种语言处理程序,它的功能与汇编程序相反,它能把机器语言程序转换成汇编语言程序。 (2)编译程序编译程序是把高级语言源程序(如Fortran、Pascal、C 等)翻译

回溯法实验(最优装载)

算法分析与设计实验报告第二次附加实验 )用可行性约束函数可剪去不满足约束条件

附录: 完整代码(贪心法) //回溯法递归求最优装载问题#include #include #include using namespace std; template class Loading { public: void Backtrack(int i);

int n, //集装箱数 *x, //当前解 *bestx; //当前最优解 Type *w, //集装箱重量数组 c, //第一艘轮船的载重量 cw, //当前载重量 bestw, //当前最优载重量 r; //剩余集装箱重量 }; template void Loading::Backtrack(int i); template //参数为:w[]各物品重量数组,c为第一艘轮船的载重量,n为物品数量,bestx[]数组为最优解 Type MaxLoading(Type w[],Type c,int n,int bestx[]); int main() { int n=3,m; int c=50,c2=50; int w[4]={0,10,40,40}; int bestx[4]; clock_t start,end,over; //计算程序运行时间的算法 start=clock(); end=clock(); over=end-start; start=clock(); m=MaxLoading(w,c,n,bestx); //调用MaxLoading函数 cout<<"轮船的载重量分别是:"<

相关主题
相关文档
最新文档