实验2 分治法算法设计

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

实验2 分治法算法设计

姓名XXX 学号XXX 班级XXXXXX

时间:XXXX-XX-XX 地点:XXX

同组人:无

指导教师:XXX

实验目的

a)掌握分治法算法设计的一般思想和方法。

b)理解并掌握二分查找、归并分类、快速分类算法。

c)能熟练运用分治法求解问题。

d)实验中所准备的数据是有代表性的。

实验内容

a)写一个顺序查找算法,将其与二分查找算法一起转换成程序,上机验证。

b)选择不同规模的数据集运行上二程序,统计它们的时间开销并比较。

c)归并分类、快速分类算法转换成程序并验证之。

d)选择不同规模的数据集运行上二程序,统计它们的时间开销并比较。

e)准备一定规模的数据集用于实验。此数据集越大越有得于验证算法,可以

考虑最终的数据个数超过10000个。

f)编写归并分类、快速分类程序,将上数据集中的数据分类。可以使用较少

的数据调试程序时。

g)用规模从小到大的数据集运行上述程序,统计它们的运行时间,并作对比

分析。

h)编写顺序查找、二分查找程序。

i)将查找程序与分类程序结合起来,用不同规模的数据集运行,统计程序运

行时间。

实验环境

硬件:Intel(R) Pentium(R) CPU RAM:4G

软件:Myeclipse2013

实验前准备

2、程序设计:见附1

实验步骤

a)准备一定规模的随机数据集用于实验,存于数组A中,A为全程数组,此

数据集越大越有得于验证算法,可以考虑最终的数据个数超过10000个。

使用randomInt(int min, int max, int num)方法产生不小于min,小于max 的num个随机数(其中A[0]和A[n]作为数组的上界和下界,供方便排序用,不参与实际排序),在分析程序效率时可修改num来达到产生不同数量的随机数:

b)分别编写归并分类MergeSort、快速分类程序QuickSort(),将上数据集中

的数据分类。可以使用较少的数据调试程序时。

/* 使用辅助数组归并两个已分类的集合 */

private void Merge(int low,int mid,int high){

// arry[n]是一个全程数组

int[] B =new int[high - low +1];

int h = low;// 子序列第一个开始等待进入B数组中

int i =0;// B数组接收两个子序列进队

int j = mid +1;// 子序列从第一个开即行等等待进入B数组中

while(h <= mid && j <= high){// 当两个集合都没取尽时

if(A[h]<= A[j]){// 集合1的小时集合1的进队B

B[i]= A[h];

h++;

}else{// 集合2的小时集合2的进队B

B[i]= A[j];

j++;

}

i++;

}

if(h > mid)// 处理剩余元素

for(int k = j; k <= high; k++){

B[i]= A[k];

i++;

}

else

for(int k = h; k <= mid; k++){

B[i]= A[k];

i++;

}

for(int k = low; k <= high; k++){// 将已归并的集合复制到A A[k]= B[k - low];

}

}

// 改进后的归并排序

private int Merge1(int q,int r){

// TODO Auto-generated method stub

int i = q;

int j = r;

int k =0;

while(i !=0&& j !=0){

if(A[i]<= A[j]){

Link[k]= i;

k = i;

i = Link[i];

}else{

Link[k]= j;

k = j;

j = Link[j];

}

}

if(i ==0)

Link[k]= j;

else

Link[k]= i;

return Link[0];

}

public int MergeSort1(int low,int high){

if(high - low +1<16){

return this.insertionSort(low, high);

}else{

int mid =(low + high)/2;

int q =this.MergeSort1(low, mid);

int r =this.MergeSort1(mid +1, high);

return this.Merge1(q, r);

}

}

// 插入排序

public int insertionSort(int low,int high){

int item;

Link[0]= low;

for(int j = low +1; j <= high; j++){

item = A[j];

int p =0;

int q = Link[p];

while(q !=0&& item > A[q]){

p = q;

q = Link[p];

}

Link[p]= j;

Link[j]= q;

}

return Link[0];

}

/* 快速排序,在主程序中的调用为f.QuickSort(0,f.getSize()); */ public void QuickSort(int low,int high){

if(low < high){

int mid = high +1;

mid =this.partition(low, mid);// 进行一次划分,并返回划分点this.QuickSort(low, mid -1);// 对划分的前半部分进行快速排序

this.QuickSort(mid +1, high);// 对划分的后半部分进行快速排序}

}

// 划分,并返回划分元素所在的下标

private int partition(int low,int high){

int temp = A[low];// A[m]是划分元素

int i = low;

while(true){

do{

low++;

}while(A[low]< temp);

do{

high--;

}while(A[high]> temp);

if(low < high){

int t = A[low];

A[low]= A[high];

A[high]= t;

}else

break;

}

A[i]= A[high];// 划分元素在位置high

A[high]= temp;

return high;

}

c)用规模从小到大的数据集运行上述程序,统计它们的运行时间,并作对比分

析,即改变n的值,使每次随机产生的数的个数不同,并将其复制三份,统计三种算法M(默认100)次的排序时间

int M =100;

int a=0,b=10000;

int n=10000;

for(int i =0; i < M; i++){

FenZhi f =new FenZhi(a, b,n);//new一个对象,n决定每次排序的规模

FenZhi f1 =(FenZhi) f.clone();//复制三份,以保证三次排序的条件相同

FenZhi f2 =(FenZhi) f.clone();

FenZhi f3 =(FenZhi) f.clone();

t1 = System.currentTimeMillis();

f1.MergeSort(1, f1.getSize()-1);//归并排序

t2 = System.currentTimeMillis();

f2.MergeSort1(1, f2.getSize());//改进后的归并排序

t3 = System.currentTimeMillis();

f3.QuickSort(1, f2.getSize()-1);//快速排序

t4 = System.currentTimeMillis();

T1 += t2 - t1;

T2 += t3 - t2;

T3 += t4 - t3;

}

System.out.println("归并排序执行所需要的时间为:"+(T1)

+"毫秒\n改进后的归并排序执行所需要的时间为:"+(T2 )

+"毫秒\n快速排序执行所需要的时间为:"+(T3 )+"毫秒");

}

d)可以明显看到快速排序最快,改进后的归并排序次之,最慢的是普通的归并

排序:

d)编写顺序查找、二分查找程序。

// 顺序查找

public int srch(int x){

for(int i =0; i

if(x == A[i]){

return i;

}

}

return-1;

}

// 二分查找;

public int binSrch(int x){

int low =0;

int high =this.size;

int mid;

while(low <= high){

mid =(low + high)/2;

if(x < A[mid]){

high = mid -1;

}else if(x > A[mid]){

low = mid +1;

}else

return mid;

}

return-1;

}

e)将查找程序与分类程序结合起来,用不同规模的数据集运行,统计程序运行

时间,因为查找所需要的时间极短,所以我们统计查找10000次的结果,放大时间效果,并且数据规模的起始值设为50000,每次增10000

f)附加实验与思考:

设有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表。

①每个选手必须与其它n-1选手各赛一次;

②每个选手一天只能赛一次。

最终实验程序:附2

注意到当n是偶数时,循环赛进行n-1天,当n是奇数时,由于总有一个队伍轮空,循环赛进行n天;

采用分治法的思想:当n为偶数时,可以讲问题分为两个部分n/2; 然后继续划分,知道最后剩余两名选手单独比赛,这时只需要让这两名对手比赛就可以了。当n为奇数时,增设一个虚拟选手,运动员为n+1个,将问题转化为是偶数的情形。当选手与虚拟选手比赛时,表示轮空,因此只需要关注n为偶数的情形。

在这里算法设计的难点就是分开治理后的合并问题,可以从以下例子中看出,将6个选手分为对等的两组,每组3个选手。每组增设一个虚拟的选手,然后再递归的将3个选手分为对等两组,每组2个选手。

在2个选手情况下,这两个选手比赛。可以得到两个选手的日程安排表是:

1 2

2 1

接下来的任务是合并这两组2个选手的日程表得到3个选手的日程安排表,这里我先假设有4个选手参加比赛则:

1 2

2 1

3 4

4 3

接下来的比赛里,第二天让1和3比赛,2和4比赛;第三天让1和4比赛,2和3比赛,即让前一组的选手,循环的和后一组的选手比赛,可得到比赛日程安排表是:

1 2 3 4

2 1 4 3

3 4 1 2

4 3 2 1

这里要得到的是3个选手的日程安排表,则第4个选手是假想的选手将其用0来表示则得到3个选手的日程安排表:

1 2 3 0

2 1 0 3

3 0 1 2

接下来的任务是合并这两个3个选手的日程安排表得到6个选手的日程安排表,这里我们的两组选手前3天的比赛情况如下:

1 2 3 0

2 1 0 3

4 5 6 0

5 4 0 6

6 0 4 5

其中第一天选手3和选手6都没有对手,让他们两个比赛;第二天选手2和选手5没有对手,让他们两个比赛,;第三天选手1和选手4没有对手,让他们两个比赛。这就可以得到合并后6个选手前三天的比赛日程安排表:

1 2 3 4

2 1 5 3

3 6 1 2

4 5 6 1

5 4 2 6

6 3 4 5

将在前三天比过赛的两组的选手对应的列出来:

1 2 3

4 5 6

在这里可以看到合并的两组中3和6,2和5,1和4都已经比过了,这里就跳过这些选手的比赛,然后两个组循环比赛即:

1 2 3

5 6 4

1 2 3

这样就得到了6个选手的比赛完整的日程安排表:

1 2 3 4 5 6

2 1 5

3 6 4

3 6 1 2

4 5

4 5 6 1 3 2

5 4 2

6 1 3

6 3 4 5 2 1

最终实验程序:附2

第1列表示每支队伍,以后几列对表示第1天到第n-1或n天的对战情况:当n取8时,结果:

n取11时,注12表示本轮轮空:

实验结果及其分析

通过实验可以看出,分治法可以有效快速的解决一些问题,如二分查找可大大缩短查找速度。在二分查找,归并分类,快速分类的实验中体会到分治法的思想是统一的,都需要我们在解决问题时将一个复杂的问题分解到一个个不可分解的小问题来解决,大而化小,再合并解决,一个小问题往往容易解决而难的总是将其合并起来,需要实际问题实际对待。

归并排序,改进的归并排序,快速排序,这三种算法的速度依次提高,并随着数据量的

增多差距有增大的趋势。

附1:最终程序

public class FenZhi implements Cloneable {

int min;

int max;

int size;

int A[];

int Link[];

public static void main(String[] args){

long T1 =0, T2 =0, T3 =0, t1 =0, t2 =0, t3 =0, t4 =0;

long T4=0,T5=0,t5=0,t6=0,t7=0;

int M =100;

int a=0,b=10000;

int n=50000;

for(int i =0; i < M; i++){

FenZhi f =new FenZhi(a, b,n);//new一个对象,n决定每次排序的规模

FenZhi f1 =(FenZhi) f.clone();//复制三份,以保证三次排序的条件相同

FenZhi f2 =(FenZhi) f.clone();

FenZhi f3 =(FenZhi) f.clone();

t1 = System.currentTimeMillis();

f1.MergeSort(1, f1.getSize()-1);//归并排序

t2 = System.currentTimeMillis();

f2.MergeSort1(1, f2.getSize());//改进后的归并排序

t3 = System.currentTimeMillis();

f3.QuickSort(1, f2.getSize()-1);//快速排序

t4 = System.currentTimeMillis();

T1 += t2 - t1;

T2 += t3 - t2;

T3 += t4 - t3;

int x=(int)(Math.random()*(f2.max-f2.min)-f2.min);

t5 = System.currentTimeMillis();

f1.srch(x);//顺序查找

t6 = System.currentTimeMillis();

f1.binSrch(x);//十分查找

t7 = System.currentTimeMillis();

T4 += t6 - t5;

T5 += t7 - t6;

}

System.out.println("归并排序执行所需要的时间为:"+(T1)

+"毫秒\n改进后的归并排序执行所需要的时间为:"+(T2 )

+"毫秒\n快速排序执行所需要的时间为:"+(T3 )+"毫秒");

System.out.println("顺序查找所需要的时间为:"+T4+"毫秒\n十分查找所需要的时间为:"+T5+"毫秒\n");

}

public FenZhi(int min,int max,int size){

this.min = min;

this.max = max;

this.size = size;

this.A =new int[this.size +1];

this.Link =new int[this.size +1];

this.randomInt();

}

public FenZhi(){

this.min =0;

this.max =1000;

this.size =200;

this.A =new int[this.size +2];

this.Link =new int[this.size +2];

this.randomInt();

}

// 复制一份

public FenZhi clone(){

FenZhi f =null;

try{

f =(FenZhi)super.clone();

f.A = A.clone();

}catch(CloneNotSupportedException e){ // TODO Auto-generated catch block

e.printStackTrace();

}

return f;

}

public int getMin(){

return min;

}

public void setMin(int min){

this.min = min;

}

public int getMax(){

return max;

}

public void setMax(int max){

this.max = max;

}

public int getSize(){

return size;

}

public void setSize(int size){

this.size = size;

}

public int[] getA(){

return A;

}

public void setA(int[] a){

A = a;

}

private void linkDisplay(){

int p =0;

int q = Link[p];

int i =0;

while(Link[q]!=0){

if(i %10==0&& i !=0)

System.out.println();

System.out.printf("%6d", A[Link[q]]); p = q;

q = Link[p];

i++;

}

}

public void display(){

for(int i =1; i < size; i++){

if(i %10==0&& i !=0)

System.out.println();

System.out.printf("%6d", A[i]);

}

}

/* 产生不小于min,小于max的num个随机数 */

private void randomInt(){

for(int i =0; i

A[i]=(int)(Math.random()*(this.max -this.min)+this.min);

}

A[size]=this.max;

A[0]=this.min -1;

}

/* 归并算法 */

public void MergeSort(int low,int high){

if(low < high){

int mid =(low + high)/2;// 求两个集合的分割点

this.MergeSort(low, mid);// 将一个子集合分类

this.MergeSort(mid +1, high);// 将另一个子集合分类

this.Merge(low, mid, high);// 归并两个已分类的子集合

}

}

/* 使用辅助数组归并两个已分类的集合 */

private void Merge(int low,int mid,int high){

// arry[n]是一个全程数组

int[] B =new int[high - low +1];

int h = low;// 子序列第一个开始等待进入B数组中

int i =0;// B数组接收两个子序列进队

int j = mid +1;// 子序列从第一个开即行等等待进入B数组中

while(h <= mid && j <= high){// 当两个集合都没取尽时

if(A[h]<= A[j]){// 集合1的小时集合1的进队B

B[i]= A[h];

h++;

}else{// 集合2的小时集合2的进队B

B[i]= A[j];

j++;

}

i++;

}

if(h > mid)// 处理剩余元素

for(int k = j; k <= high; k++){

B[i]= A[k];

i++;

}

else

for(int k = h; k <= mid; k++){

B[i]= A[k];

i++;

}

for(int k = low; k <= high; k++){// 将已归并的集合复制到A

A[k]= B[k - low];

}

}

/* 快速排序,在主程序中的调用为f.QuickSort(0,f.getSize()-1); */

public void QuickSort(int low,int high){

if(low < high){

int mid = high +1;

mid =this.partition(low, mid);// 进行一次划分,并返回划分点this.QuickSort(low, mid -1);// 对划分的前半部分进行快速排序

this.QuickSort(mid +1, high);// 对划分的后半部分进行快速排序}

// 划分,并返回划分元素所在的下标

private int partition(int low,int high){ int temp = A[low];// A[m]是划分元素

int i = low;

while(true){

do{

low++;

}while(A[low]< temp);

do{

high--;

}while(A[high]> temp);

if(low < high){

int t = A[low];

A[low]= A[high];

A[high]= t;

}else

break;

}

A[i]= A[high];// 划分元素在位置high

A[high]= temp;

return high;

}

// 顺序查找

public int srch(int x){

for(int i =1; i <=this.size; i++){

if(x == A[i]){

return i;

}

}

return-1;

}

// 二分查找;

public int binSrch(int x){

int low =1;

int high =this.size;

int mid;

while(low <= high){

mid =(low + high)/2;

if(x < A[mid]){

high = mid -1;

}else if(x > A[mid]){

low = mid +1;

}else

return mid;

}

return-1;

}

// 插入排序

public int insertionSort(int low,int high){ int item;

Link[0]= low;

for(int j = low +1; j <= high; j++){

item = A[j];

int p =0;

int q = Link[p];

while(q !=0&& item > A[q]){

p = q;

q = Link[p];

}

Link[p]= j;

Link[j]= q;

}

return Link[0];

public int MergeSort1(int low,int high){ if(high - low +1<16){

return this.insertionSort(low, high);

}else{

int mid =(low + high)/2;

int q =this.MergeSort1(low, mid);

int r =this.MergeSort1(mid +1, high);

return this.Merge1(q, r);

}

}

// 改进后的归并排序

private int Merge1(int q,int r){

// TODO Auto-generated method stub

int i = q;

int j = r;

int k =0;

while(i !=0&& j !=0){

if(A[i]<= A[j]){

Link[k]= i;

k = i;

i = Link[i];

}else{

Link[k]= j;

k = j;

j = Link[j];

}

}

if(i ==0)

Link[k]= j;

else

Link[k]= i;

return Link[0];

}

}

附2:

}

public static void tournament(int[][] a,int n){ // TODO Auto-generated method stub

if(n ==1){

a[1][1]=1;

return;

}

if(odd(n)){

tournament(a, n +1);

return;

}

tournament(a, n /2);

makecopy(a, n);

}

private static void makecopy(int[][] a,int n){ // TODO Auto-generated method stub

if(n /2>1&& odd(n /2))

copyodd(a, n);

else

copy(a, n);

}

private static void copyodd(int[][] a,int n){ // TODO Auto-generated method stub

int m = n /2;

int[] b=new int[n+1];

for(int i =1; i <= m; i++){

b[i]= m + i;

b[m + i]= b[i];

}

for(int i =1; i <= m; i++){

for(int j =1; j <= m +1; j++){

if(a[i][j]> m){

a[i][j]= b[i];

a[m + i][j]=(b[i]+ m)% n;

}else

a[m + i][j]= a[i][j]+ m;

}

for(int j =2; j <= m; j++){

a[i][m + j]= b[i + j -1];

a[b[i + j -1]][m + j]= i;

}

算法设计与分析实验指导2014版

算法分析 设计与实验 王 源 二0一四年十月

实验一:分治算法及其应用 实验要求: 掌握分治算法的原理. 掌握递归算法及递归程序的设计. 能用程序设计语言设计求解典型问题的算法 实验题: 1、棋盘覆盖问题:在一个2k ×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。用图示的4种不同形态的L 型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L 型骨牌不得重叠覆盖。 2、最近对问题:设p 1=(x 1,y 1), p 2=(x 2,y 2), …, p n =(x 1,y 1),是平面上n 个点构成的集合S ,最近对问题就是找出集合S 中距离最近的点对。 3、(选作)最大子段和问题:给定由n 个整数(可能有负整数)组成的序列(a 1, a 2, …, a n ), 最大子段和问题要求该序列形如 的最大值(1≤i ≤j ≤n ),当序列中所有整数均为负 整数时,其最大子段和为0。例如,序列(-20, 11, -4, 13, -5, -2)的最大子段和为 。 ∑=j i k k a ∑==4 220 k k a

实验要求: 基本动态规划法的原理方法; 能用程序设计语言实现求解背包问题的算法 实验题: 1、最长公共子序列问题:对给定序列X=(x1, x2,…, xm)和序列Z=(z1, z2,…, zk),Z是X的子序列当且仅当存在一个递增下标序列(i1, i2,…, ik),使得对于所有j=1, 2, …, k,有(1≤ij ≤m)。给定两个序列X和Y,当序列Z既是X的子序列又是Y的子序列时,称Z是序列X 和Y的公共子序列最长公共子序列问题就是在序列X和Y中查找最长的公共子序列。 2、(选作)多段图的最短路径问题:设图G=(V, E)是一个带权有向图,如果把顶点集合V 划分成k个互不相交的子集Vi (2≤k≤n, 1≤i≤k),使得E中的任何一条边(u, v),必有u∈Vi,v∈Vi+m (1≤i≤k, 1<i+m≤k),则称图G为多段图,称s∈V1为源点,t∈Vk为终点。多段图的最短路径问题求从源点到终点的最小代价路径。 3、

算法设计与分析实验报告贪心算法

算法设计与分析实验报告 贪心算法 班级:2013156 学号:201315614 姓名:张春阳哈夫曼编码 代码 #include float small1,small2; int flag1,flag2,count; typedefstructHuffmanTree { float weight; intlchild,rchild,parent; }huffman; huffmanhuffmantree[100]; void CreatHuffmanTree(intn,int m) { inti; void select(); printf("请输入%d个节点的权值:",n); for(i=0;i

printf("\n"); for(i=0;i

现代设计黄金分割法复合形法实验报告word文档良心出品

《现代设计理论与方法》实验报告 、实验目的 机械优化设计是一门实践性较强的课程,学生通过实际上机计算可以达到以 下目的: 1. 加深对机械优化设计方法的基本理论和算法步骤的理解; 2. 培养学生独立编制或调试计算机程序的能力; 3. 掌握常用优化方法程序的使用方法; 4 .培养学生灵活运用优化设计方法解决工程实际问题的能力。 、实验项目、学时分配及对每个实验项目的要求 1.明确黄金分割法基本原理、计算步骤及程序框图; 吐 入「土 2?编制或调试黄金分割法应用程序; 1 黄金分割法 2 八' " 3 ?用测试题对所编程序进行测试; 4?撰写实验报告。 1.明确复合形法基本原理、计算步骤及程序框图 等; 2 复合形法 4 2?编制或调试复合形法应用程序; 3 ?用测试题对所编程序进行测试; 4?撰写实验报告。 二、测试题 1. 黄金分割法程序测试题 1 )rn"何二?-10r+36,取坷=0 ,卜皿1, 沪 程序如下: #in clude #in clude #in clude #defi ne e 0.00001 序实验项目 学时 号 实验要求

#define tt 0.01 float function(float x) float y=pow(x,2)-10*x+36;// return(y); void finding(float a[3],float f[3]) float t=tt,a1,f1,ia; int i; f[0]=function(a[0]); for(i=0;;i++) a[1]=a[0]+t;f[1]=function(a[1]); if(f[1]=e) t=-t;a[0]=a[1];f[0]=f[1]; else{ if(ia==1) return; t=t/2;ia=1; for(i=0;;i++) a[2]=a[1]+t;f[2]=function(a[2]); if(f[2]>f[1]) break; t=2*t; a[0]=0;/ / 初始区间的下界值 求解的一维函数

算法设计实验3

实验三:动态规划法 【实验目的】 应用动态规划算法思想求解矩阵连乘的顺序问题。 【实验要求】 应用动态规划算法的最优子结构性质和子问题重叠性质求解此问题。分析动态规划算法的基本思想,应用动态规划策略写出算法及相应的程序,求解此题。要读懂读透A[i,j], A[1,n]=A[1,k] ×A[k+1,n],m[i][j],s[i][j]各式所表达的含义并正确加以应用。m[i][j]的递归定义: 0 (i=j ) m[i][j]= min{m[i][k]+m[k+1][j]+n i-1n k n j (i #include class MatrixChain { public: MatrixChain(int mSize); //创建二维数组m和s,一维数组p,并初始化

《算法设计与分析》实验指导

《算法分析与设计》实验指导.

实验一锦标赛问题 [实验目的] 1.基本掌握分治算法的原理. 2.能用程序设计语言求解锦标赛等问题的算法; [预习要求] 1.认真阅读数据结构教材和算法设计教材,了解分治算法原理; 2.设计用分治算法求解背包问题的数据结构与程序代码. [实验题] 【问题描述】设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能参赛一次; (3)循环赛在n-1天内结束。 请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i≤n,1≤j≤n-1。 [实验提示] 我们可以按分治策略将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。这时只要让这两个选手进行比赛就可以了。 1 2 3 4 5 6 7 1 (1)(2)(3) 图1 2个、4个和8个选手的比赛日程表 图1所列出的正方形表(3)是8个选手的比赛日程表。其中左上角与左下角的两小块分别为选手1至选手4和选手5至选手8前3天的比赛日程。据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这

样我们就分别安排好了选手1至选手4和选手5至选手8在后4天的比赛日程。依此思想容易将这个比赛日程表推广到具有任意多个选手的情形。 [实验步骤] 1.设计并实现算法并准备测试用例,修改并调试程序,直至正确为止; 2.应用设计的算法和程序求锦标赛问题; 3.去掉测试程序,将你的程序整理成功能模块存盘备用. [实验报告要求] 1.阐述实验目的和实验内容; 2.阐述分治算法原理; 3.提交实验程序的功能模块; 4.记录最终测试数据和测试结果。 [思考与练习] 【金块问题】老板有一袋金块(共n块,n是2的幂(n>=2)),将有两名最优秀的雇员每人得到其中的一块,排名第一的得到最重的那块,排名第二的雇员得到袋子中最轻的金块。假设有一台比较重量的仪器,请用最少的比较次数找出最重和最轻的金块。

北京理工大学《数据结构与算法设计》实验报告实验一

《数据结构与算法设计》 实验报告 ——实验一 学院: 班级: 学号: 姓名:

一、实验目的 1.通过实验实践、巩固线性表的相关操作; 2.熟悉VC环境,加强编程、调试的练习; 3.用C语言编写函数,实现循环链表的建立、插入、删除、取数据等基本操作; 4.理论知识与实际问题相结合,利用上述基本操作实现约瑟夫环。 二、实验内容 1、采用单向环表实现约瑟夫环。 请按以下要求编程实现: ①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。环表中的 结点编号依次为1,2,……,m。 ②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到 第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点 的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出 了这个环表的全部结点为止。 三、程序设计 1、概要设计 为实现上述程序功能,应用单向环表寄存编号,为此需要建立一个抽象数据类型:单向环表。 (1)、单向环表的抽象数据类型定义为: ADT Joseph{ 数据对象:D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0} 数据关系:R1={ |ai∈D,i=1,2,……,n} 基本操作: create(&L,n) 操作结果:构造一个有n个结点的单向环表L。 show(L) 初始条件:单向环表L已存在。 操作结果:按顺序在屏幕上输出L的数据元素。 Josephf( L,m,s,n) 初始条件:单向环表L已存在, s>0,n>0,s

机电产品设计实验报告

课程名称:机电产品现代设计方法上课时间:2015年春季 机电产品现代设计方法实验报告 姓名: 学号: 班级: 所在学院:机电工程学院 任课教师:张旭堂

一、实验项目与实验目的 实验项目: 典型机电产品多学科协同优化设计。 试验目的: (1) 掌握典型机电产品多学科协同优化设计软件环境组成,包括建模软件、分析软件、协同平台。 (2)自主设计产品模型、分析过程、优化目标。 (3) 对得到的优化结果进行定性分析,解释结果的合理性,编写上机实验报告。 二、实验环境 网络协同设计环境,如下图所示:包括产品CAD建模、有限元分析FEM、动力学仿真ADAMS和控制仿真MATLAB。计算机网络硬件环境和相应软件环境。图形工作站和路由器,安装协同设计仿真软件。

型 协同设计仿真平台组成 三、实验原理 典型机电产品协同设计仿真工作流程如下图所示。 1)利用CAD建模工具,建立产品模型; 2)利用ADAMS建立产品运动学模型; 3)根据CAD和ADAMS传过来的结构模型和边界条件分析零件应力场和应变场; 4)用ADAMS分析得到的运动参数(位移、速度)。

协同设计仿真平台组成 四、实验内容与步骤 (1)总体方案设计 SysML语言是UML语言(Unified Modeling Language,统一建模语言,一种面向对象的标准建模语言,用于软件系统的可视化建模)在系统工程应用领域的延续和扩展,是近年提出的用于系统体系结构设计的多用途建模语言,用于对由软硬件、数据和人综合而成的复杂系统的集成体系结构进行可视化的说明、分析、设计及校验。 在这里我们绘制参数图如下。在下面的参数图中,我们确定了系统中各部件的相互约束情况。

实验一 简单算法设计

实验一简单算法设计 一.实验目的和要求 1. 理解算法设计与分析的基本概念,理解解决问题的算法设计与实现过程; 2. 掌握简单问题的算法设计与分析,能设计比较高效的算法; 3. 熟悉C/C++语言等的集成开发环境,掌握简单程序设计与实现的能力; 二.实验内容 (一)相等元素问题 1.问题描述先排序函数,再查找函数。 #define size 100 Typedef strat { Int Array[size] Int listlength }List List a; Main() { 1、输入 2、排序 3、查找 4、输出 } 元素唯一性问题:给出一个整数集合,假定这些整数存储在数组A[1…n]中,确定它们中是否存在两个相等的元素。请设计出一个有效算法来解决这个问题,你的算法的时间复杂性是多少? 2. 测试数据 输入: 9 71 25 64 38 52 5 31 19 45 26 35 17 92 53 24 6 57 21 12 34 2 17 86 75 33 15 87 32 7 84 35 26 45 78 96 52 22 37 65 9 43 21 3 33 91 输出:No Yes No 3. 设计与实现的提示 算法最坏情况和平均情况的时间复杂性是衡量算法优劣的重要指标,算法设计要求尽可能设计比较高效的算法。 (二) 整数集合分解(选做) 1.问题描述

设计算法把一个n个元素的整数集合(n为偶数)分成两个子集S1和S2,使得:每个新的集合中含有n/2个元素,且S1中的所有元素的和与S2中的所有元素的和的差最大。 2. 测试数据 输入: 68 25 34 16 2 37 3 95 76 57 21 13 4 78 29 6 17 39 51 20 43 12 28 3 48 59 14 32 47 51 42 61 9 24 52 78 65 2 37 78 51 73 29 7 26 95 37 2 输出: 2 3 4 6 12 13 16 17 20 21 25 29 34 37 39 43 51 57 68 76 78 95 2 2 3 7 9 1 4 24 26 28 29 32 37 37 42 47 48 51 51 52 59 61 62 65 73 78 95 3. 设计与实现的提示 本题可以有多种方法。算法时间复杂性是选取算法的重要依据。输出的两个新整数集合要求按照从小到大排序后输出。该排序步骤对算法时间复杂性的影响在此不计。

算法设计与实验报告讲解

算法设计与分析实验报告 学院:信息学院 专业:物联网1101 姓名:黄振亮 学号:20113379 2013年11月

目录 作业1 0-1背包问题的动态规划算法 (7) 1.1算法应用背景 (3) 1.2算法原理 (3) 1.3算法描述 (4) 1.4程序实现及程序截图 (4) 1.4.1程序源码 (4) 1.4.2程序截图 (5) 1.5学习或程序调试心得 (6) 作业2 0-1背包问题的回溯算法 (7) 2.1算法应用背景 (3) 2.2算法原理 (3) 2.3算法描述 (4) 2.4程序实现及程序截图 (4) 2.4.1程序源码 (4) 2.4.2程序截图 (5) 2.5学习或程序调试心得 (6) 作业3循环赛日程表的分治算法 (7) 3.1算法应用背景 (3) 3.2算法原理 (3) 3.3算法描述 (4) 3.4程序实现及程序截图 (4)

3.4.1程序源码 (4) 3.4.2程序截图 (5) 3.5学习或程序调试心得 (6) 作业4活动安排的贪心算法 (7) 4.1算法应用背景 (3) 4.2算法原理 (3) 4.3算法描述 (4) 4.4程序实现及程序截图 (4) 4.4.1程序源码 (4) 4.4.2程序截图 (5) 4.5学习或程序调试心得 (6)

作业1 0-1背包问题的动态规划算法 1.1算法应用背景 从计算复杂性来看,背包问题是一个NP难解问题。半个世纪以来,该问题一直是算法与复杂性研究的热点之一。另外,背包问题在信息加密、预算控制、项目选择、材料切割、货物装载、网络信息安全等应用中具有重要的价值。如果能够解决这个问题那么则具有很高的经济价值和决策价值,在上述领域可以获得最大的价值。本文从动态规划角度给出一种解决背包问题的算法。 1.2算法原理 1.2.1、问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi ∈{0,1}, ?∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题。 1.2.2、最优性原理: 设(y1,y2,…,yn)是 (3.4.1)的一个最优解.则(y2,…,yn)是下面相应子问题的一个最优解: 证明:使用反证法。若不然,设(z2,z3,…,zn)是上述子问题的一个最优解,而(y2,y3,…,yn)不是它的最优解。显然有 ∑vizi > ∑viyi (i=2,…,n) 且 w1y1+ ∑wizi<= c 因此 v1y1+ ∑vizi (i=2,…,n) > ∑ viyi, (i=1,…,n) 说明(y1,z2, z3,…,zn)是(3.4.1)0-1背包问题的一个更优解,导出(y1,y2,…,yn)不是背包问题的最优解,矛盾。 1.2.3、递推关系:

机电产品现代设计方法实验报告

课程名称:机电产品现代设计方法 上课时间:2014年春季 机电产品现代设计方法实验报告 姓名: 学号: 班级: 所在学院:机电工程学院 任课教师:金天国张旭堂

实验名称机电产品现代设计方法 姓名学号班级 实验地点实验日期评分 指导教师张旭堂同组成员其他 1 静态存储器扩展实验 1.1 实验目的 (1)掌握典型机电产品多学科协同优化设计软件环境组成,包括建模软件、分析软件、协同平台; (2)自主设计产品模型、分析过程、优化目标; (3)对得到的优化结果进行定性分析,解释结果的合理性,编写上机实验报告。 1.2 实验内容 (1) 轴的有限元分析 (2) 基于Adams的运动学分析与仿真 1.3实验相关情况介绍(包含使用软件或实验设备等情况) 1.3.1使用软件 本实验使用软件为Adams及abaqus,利用Adams进行运动学仿真分析,利用abaqus进行有限元分析。 1.3.2实验设备 计算机。 1.4实验结果 1.4.1基于ADAMS 的运动学仿真 (1)构造ADAMS样机机械模型 根据指导书建立铲车的三维模型。三维模型可以通过专门三维建模软件进行建模,然后导入ADAMS,也可以直接用ADAMS建模。利用ADAMS建模过程在《adams 运动仿真例子》中有详述,直接给出建模后的模型,如图1所示:

图1 铲车模型 (2)构建约束 根据要求构造四个约束:基座和座架之间的创建转动副,轴肩与座架间构建转动副,铲斗与悬臂间构建转动副,悬臂与轴肩之间构建平动副。构建后的模型如图2所示: 图2 添加约束铲车模型 (3)添加运动 根据题意分别对四个运动副添加运动函数: (a)基座和座架之间的创建转动副:360d*time;

算法设计与分析实验指导书样本

算法设计与分析实验指导书

实验一 C/C++环境及递归算法( 4学时) 一、实验目的与要求 1、熟悉C/C++语言的集成开发环境; 2、经过本实验加深对递归过程的理解 二、实验内容: 掌握递归算法的概念和基本思想, 分析并掌握排列问题的递归算法和Hanoi塔问题的递归算法。 三、实验题 1、设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。任意输入一 串整数或字符, 输出结果能够用递归方法实现整数或字符的全排列。 2、设a,b,c是3个塔座。开始时, 在塔座a上有一叠共n个圆盘, 这些圆 盘自下而上, 由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上, 并仍按同样顺序叠置。 四、实验步骤 1.理解算法思想和问题要求; 2.编程实现题目要求; 3.上机输入和调试自己所编的程序; 4.验证分析实验结果; 5.整理出实验报告。 实验提示 1、 #include inline void swap(int &a,int &b) { int temp=a; a=b;

b=temp; } void perm(int list[],int k,int m) { if(k==m) { for(int i=0;i<=m;i++) cout<

银行家算法设计实验报告

银行家算法设计实验报告

银行家算法设计实验报告 一.题目分析 1.银行家算法: 我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于客户向银行家贷款。操作系统按银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程尚需求的资源量,若是系统现存的资源可以满足它尚需求的资源量,则按当前的申请量来分配资源,否则就推迟分配。 当进程在执行中继续申请资源时,先测试该进程申请的资源量是否超过了它尚需的资源量。若超过则拒绝分配,若没有超过则再测试系统尚存的资源是否满足该进程尚需的资源量,若满足即可按当前的申请量来分配,若不满足亦推迟分配。 2.基本要求: (1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。 (2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。

(3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况: A. 所申请的资源大于其所需资源,提示分配不合理不予分配并返回 B. 所申请的资源未大于其所需资源, 但大于系统此时的可利用资源,提 示分配不合理不予分配并返回。 C. 所申请的资源未大于其所需资源, 亦未大于系统此时的可利用资源,预 分配并进行安全性检查: a. 预分配后系统是安全的,将该进 程所申请的资源予以实际分配并 打印后返回。 b. 与分配后系统进入不安全状态,提示系统不安全并返回。 (4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。 3.目的: 根据设计题目的要求,充分地分析和理解题 目,叙述系统的要求,明确程序要求实现的功能以及限制条件。 明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。

现代设计方法实验报告

《现代机械设计方法学》实验报告 班级: 学号: 姓名: 成绩:

实验一、有限元分析 (一)目的: 1、初步掌握有限元软件分析力学问题的过程,包括几何建模、网格划分等前处理功能,掌握各种计算结果的阅读。 2、掌握材料数据、载荷、约束的添加方法。 (二)要求:学生独立完成一个算例的有限元分析,并阅读其计算结果,提交一个算例的分析报告。 (三)计算实例 1、问题的描述 为了考察铆钉在冲压时,发生多大的变形,对铆钉进行分析。 铆钉圆柱高:10mm 铆钉圆柱外径:6mm 铆钉下端球径:15mm 弹性模量:2.06E11 泊松比:0.3 铆钉材料的应力应变关系如下: 应变0.003 0.005 0.007 0.009 0.011 0.02 0.2 618 1128 1317 1466 1510 1600 1610 应力 /Mpa

1、有限元模型。

3、应力云图,可选主应力或σx、σy、τxy、V on Mises应力、Tresca应力之一输出结果图片,指明你所选的应力的最大值及其位置。 (三)思考题: 1、如果要提高边界处计算精度,一般应如何处理? 答:在边界处划分网格 2、有限元网格划分时应注意哪些问题? 答:选取的时候要将编号显示出来,这样就可以更好的选择,网格尽可能的小,这样结果就越准确。

实验二、优化实验 (一)目的: 初步掌握利用ANSYS软件或MATLAB软件对问题进行分析。 (二)要求: 学生独立完成一个算例的分析,并给出算例的计算结果。。 (三)算例 1.实际问题 梁的形状优化,优化目的是使梁的体积最小,同时要求梁上的最大应力不 超过30000psi,梁的最大挠度不大于0.5in,沿长度方向梁的厚度可以变化,但梁端头的厚度为定值t,采用对称建模。 使用两种方法进行优化,两种方法优化结果。 子问题近视法目标ANSYS 百分比(TVOL)体积in3 3.60 3.62 1.004 (DEFL)挠度max in 0.500 0.499 0.998 (STRS)应力max,psi 30000 29740 0.991 第一阶法目标ANSYS 百分比(TVOL)体积in3 3.6 3.61 1.003 (DEFL)挠度max in 0.5 0.5 1.001 STRS)应力max,psi 30000 29768 0.992

算法设计实验报告一(简单算法设计)

实验报告一 课程C++ 实验名称简单算法设计第 1 页专业_数学与应用数学_ __ 班级__ 双师一班学号105012011056 姓名陈萌 实验日期:2013 年 3 月9 日报告退发(订正、重做) 一、实验目的 1. 理解算法设计与分析的基本概念,理解解决问题的算法设计与实现过程; 2. 掌握简单问题的算法设计与分析,能设计比较高效的算法; 3. 熟悉C/C++语言等的集成开发环境,掌握简单程序设计与实现的能力。 二、实验内容 (一)相等元素问题 1.问题描述 元素唯一性问题:给出一个整数集合,假定这些整数存储在数组A[1…n]中,确定它们中是否存在两个相等的元素。请设计出一个有效算法来解决这个问题,你的算法的时间复杂性是多少? 2. 具体要求(若在ACM平台上提交程序,必须按此要求)――平台上1767题 输入:输入的第一行是一个正整数m,表示测试例个数。接下来几行是m个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数n (n<=500),表示整数序列的长度,第二行给出整数序列,整数之间用一个空格隔开。 输出:对于每个测试例输出一行,若该组测试例中存在两个相等的元素则输出”Yes”,否则,输出”No”。每个测试例的输出数据用一行表示。 3. 测试数据 输入:3 10 9 71 25 64 38 52 5 31 19 45 16 26 35 17 92 53 24 6 57 21 12 34 2 17 86 75 33 20 15 87 32 7 84 35 26 45 78 96 52 22 37 65 9 43 21 3 33 91 输出:No Yes No (二) 整数集合分解 1.问题描述 设计算法把一个n个元素的整数集合(n为偶数)分成两个子集S1和S2,使得:每个新的集合中含有n/2个元素,且S1中的所有元素的和与S2中的所有元素的和的差最大。 2. 具体要求(若在ACM平台上提交程序,必须按此要求)――平台上1768题 输入的第一行是一个正整数m,表示测试例个数。接下来几行是m个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数n (n为偶数,且n<=500),表示原整数集合的长度,第二行给出这n个整数序列,整数之间用一个空格隔开。 输出:对于每个测试例输出两行,分别表示新生成的整数集合。其中,第一行是元素和比较小的整数集合,第二行是元素和比较大的整数集合,整数之间用一个空格隔开。两个测

算法设计与分析课程设计-实验指导书

算法设计与分析课程设计 实验指导书 上海第二工业大学 计算机与信息学院软件工程系

一、运动员比赛日程表 设有n=2k个运动员要进行网球比赛。设计一个满足以下要求的比赛日程表: ●每个选手必须与其它n-1个选手各赛一次 ●每个选手一天只能赛一次 ●循环赛一共进行n-1天 1、运用分治策略,该问题的递归算法描述如下,根据算法编制程序并上机 通过。 输入:运动员人数n(假定n恰好为2的i次方) 输出:比赛日程表A[1..n,1..n] 1. for i←1 to n //设置运动员编号 2. A[i,1]←i 3. end for 4. Calendar(0,n) //位移为0,运动员人数为n。 过程Calendar(v, k) //v表示位移(v=起始行-1),k表示运动员人数。 1. if k=2 then //运动员人数为2个 2. A[v+2,2]←A[v+1,1] //处理右下角 3. A[v+1,2]←A[v+2,1]//处理右上角 4. else 5. Calendar(v,k/2) //假设已制定了v+1至v+k/2运动员循环赛日程表 6. Calendar(v+k/2,k/2) //假设已制定了v+k/2+1至v+k运动员循环赛日程表 7. comment:将2个k/2人组的解,组合成1个k人组的解。 8. for i←1 to k/2 9. for j←1 to k/2 10. A[v+i+k/2,j+k/2]←A[v+i,j] //沿对角线处理右下角 11. end for 12. end for 13. for i←k/2+1 to k 14. for j←1 to k/2 15. A[v+i-k/2,j+k/2]←A[v+i,j] //沿对角线处理右上角 16. end for 17. end for 18. end if 2、编制该问题的非递归算法,上机通过。 将如上文件保存在命名为“学号+姓名+实验一”的文件夹中并上传到指定的服务器。

南京邮电大学算法设计实验报告——动态规划法

实验报告 (2009/2010学年第一学期) 课程名称算法分析与设计A 实验名称动态规划法 实验时间2009 年11 月20 日指导单位计算机学院软件工程系 指导教师张怡婷 学生姓名丁力琪班级学号B07030907 学院(系) 计算机学院专业软件工程

实验报告 实验名称动态规划法指导教师张怡婷实验类型验证实验学时2×2实验时间2009-11-20一、实验目的和任务 目的:加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题。 任务:用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文章比较等多个领域。 要求:掌握动态规划法的思想,及动态规划法在实际中的应用;分析最长公共子序列的问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较,并输出它们的最长公共子序列。 二、实验环境(实验设备) 硬件:计算机 软件:Visual C++

三、实验原理及内容(包括操作过程、结果分析等) 1、最长公共子序列(LCS)问题是:给定两个字符序列X={x1,x2,……,x m}和Y={y1,y2,……,y n},要求找出X和Y的一个最长公共子序列。 例如:X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a}。它们的最长公共子序列LSC={b,c,d,a}。 通过“穷举法”列出所有X的所有子序列,检查其是否为Y的子序列并记录最长公共子序列并记录最长公共子序列的长度这种方法,求解时间为指数级别的,因此不可取。 2、分析LCS问题特征可知,如果Z={z1,z2,……,z k}为它们的最长公共子序列,则它们一定具有以下性质: (1)若x m=y n,则z k=x m=y n,且Z k-1是X m-1和Y n-1的最长公共子序列; (2)若x m≠y n且x m≠z k,则Z是X m-1和Y的最长公共子序列; (3)若x m≠y n且z k≠y n,则Z是X和Y的最长公共子序列。 这样就将求X和Y的最长公共子序列问题,分解为求解较小规模的问题: 若x m=y m,则进一步分解为求解两个(前缀)子字符序列X m-1和Y n-1的最长公共子序列问题; 如果x m≠y n,则原问题转化为求解两个子问题,即找出X m-1和Y的最长公共子序列与找出X 和Y n-1的最长公共子序列,取两者中较长者作为X和Y的最长公共子序列。 由此可见,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列,具有最优子结构性质。 3、令c[i][j]保存字符序列X i={x1,x2,……,x i}和Y j={y1,y2,……,y j}的最长公共子序列的长度,由上述分析可得如下递推式: 0 i=0或j=0 c[i][j]= c[i-1][j-1]+1 i,j>0且x i=y j max{c[i][j-1],c[i-1][j]} i,j>0且x i≠y j 由此可见,最长公共子序列的求解具有重叠子问题性质,如果采用递归算法实现,会得到一个指数时间算法,因此需要采用动态规划法自底向上求解,并保存子问题的解,这样可以避免重复计算子问题,在多项式时间内完成计算。 4、为了能由最优解值进一步得到最优解(即最长公共子序列),还需要一个二维数组s[][],数组中的元素s[i][j]记录c[i][j]的值是由三个子问题c[i-1][j-1]+1,c[i][j-1]和c[i-1][j]中的哪一个计算得到,从而可以得到最优解的当前解分量(即最长公共子序列中的当前字符),最终构造出最长公共子序列自身。

物体运动的方式实验报告

物体运动的方式实验报告 (文章一):实验报告四年级4课.小吊车活动1:做小吊车(分组实验)制作目的:做小吊车并研究小吊车原理制作材料及工具:小纸盒吊车臂吊臂支架线绳两个铁丝钩一个剪刀锥子胶水钩码制作过程: 1.小组分工合作 2.观察小吊车模型组装各部分①四个点要对称,固定牢固;②绳子要从前往后穿,不要穿反了; 3.调试小吊车分别拉动两根线,看看小吊车的臂能否灵活运动. 实验现象:小吊车能提起或放下钩码实验结论:放松上牵引绳,拉紧下牵引绳,吊臂向下运动;拉紧上牵引绳,放松下牵引绳,吊臂向上运动。活动2:收与放实验目的:推断动物与人的肢体运动原理(分组实验) 实验过程: 1. 弯曲手臂,感受上臂上下肌肉的长短松紧变化。 2.伸直手臂,感受上臂上下肌肉的长短松紧变化。 3.反复几次体会与小吊车的原理的联系。实验现象:手臂骨骼就像小吊车的吊臂,肌肉就像绳子,手臂运动时,当肱二头肌收缩,肱三头肌舒张时,肱二头肌牵动前臂向内收缩;当肱三头肌收缩,肱二头肌舒张时,肱三头肌牵动前臂向外伸展. 实验结论:前臂收缩类似小吊车抬起重物。前臂伸展类似小吊车放下重物。6课.做沙盘(分组实验)制作目的:通过制作校园沙盘模型培养学生的设计制作能力。制作材

料:硬纸板学校平面图橡皮泥潮湿的沙土废旧泡沫包装纸小木棍颜料盒剪刀制作步骤:对校园建筑的布局进行观测2.用大的硬纸板做底座。在纸板上画好学校平面图。(明确建筑物.树木等的位置) 3.用橡皮泥旧泡沫等材料做出立体的楼房等校园建筑物,根据平面图摆放好位置。(可以用长方体或正方体的泡沫做楼房,硬纸板做围墙,小木棍做旗杆等)。4.要注意建筑物的比例。(四年级的学生还不能很精确地计算出比例尺,教师适当指导。)8课.快与慢实验目的:研究小车运动的快慢(分组实验) 实验材料:秒表(或电子手表)、长尺、玩具车(学生自带),橡皮泥,马达、电池等(学生自带)实验过程: 1.小组做好分工:赛车手、计时员、测量员、记录员。 2.找好起点(必要时确定好终点); 3.秒表做好归零; 4.在相同时间内必须进行多次测量(不少于3次),并做好记录 5. .在相同距离内必须进行多次测量(不少于3次),并做好记录实验结论:1:相同时间内经过的距离越长,物体运动的速度越快2:相同距离下所用的时间越短,物体运动的速度越快活动2:玩小车实验目的:研究小车运动的快慢与载重物及路面光滑程度是否有关?(对比试验) 实验材料:秒表(或电子手表), 木板, 玩具车(学生自带),钩码, 毛巾. 实验方法:1做好小组分工:赛车手、计时员、记录员; 2先测量空车时小车在木板上运动时间; 3别的条件不变,向小车上加钩

算法与设计实验报告

算法与分析实验报告软件工程专业 安徽工业大学 指导老师:许精明

实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 一:实验目的 1:掌握动态规划算法的基本思想,学会用其解决实际问题。 2:通过几个基本的实验,提高算法分析与设计能力,提高动手操作能力和培养良好的编程习惯。 二:实验内容 1:杨辉三角 2:背包问题 3:汉诺塔问题 实验一:杨辉三角

问题分析: ①每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 ②第n行数之和为2^n。 ③下一行每个数字等于上一行的左右两个数字之和。 算法设计及相关源代码: public void yanghui(int n) { int[] a = new int[n]; if(n==1){ System.out.println(1); }else if(n==2) { System.out.print(1 + " " +1); }else{ a[1]=1; System.out.println(a[1]); a[2]=1;

System.out.println(a[1]+" "+a[2]); for(int i=3;i<=n;i++){ a[1]=a[i]=1; for(int j=i-1;j>1;j--){ a[j]=a[j]+a[j-1]; } for(int j=1;j<=i;j++){ System.out.print(a[j]+" "); } System.out.println(); } } } 实验结果:n=10 实验二:0-1背包问题 问题分析::令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就 j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数: (1) V(i,0)=V(0,j)=0 (2) V(i,j)=V(i-1,j) j

哈工大机电产品现代设计方法实验报告

1 实验目的 (1)掌握典型机电产品多学科协同优化设计软件环境组成,包括建模软件、分析软件、协同平台; (2)自主设计产品模型、分析过程、优化目标; (3) 对得到的优化结果进行定性分析,解释结果的合理性,编写上机实验报告。 2 实验内容 (1) 轴或负载台的有限元分析 (2) 基于Adams的运动学分析与仿真 3实验相关情况介绍(包含使用软件或实验设备等情况) 网络协同设计环境,如图1所示:包括产品CAD建模、有限元分析FEM、动力学仿真ADAMS和控制仿真MATLAB。计算机网络硬件环境和相应软件环境。图形工作站和路由器,安装协同设计仿真软件。 型 图1 协同设计仿真平台组成

典型机电产品协同设计仿真工作流程如下图2所示。 1)利用CAD建模工具,建立产品模型; 2)利用ADAMS建立产品运动学模型; 3)根据CAD和ADAMS传过来的结构模型和边界条件分析零件应力场和应变场;4)用ADAMS分析得到的运动参数(位移、速度)。 CAD模型 (STEP / IGES格式) 1.产品CAD建模 (CATIA) 3.CAE有限元分 析 (CATIA) FEM 分析结果 (应力、应变、模态) 2.动力学分析 (ADAMS) 驱动力、反应 时间 有限元输入载荷 4.控制仿真 (MATLAB) 运动参数:位 移、速度 动力参数:惯 量、载荷 图2 协同设计仿真平台组成 SysML语言是UML语言(Unified Modeling Language,统一建模语言,一种面向对象的标准建模语言,用于软件系统的可视化建模)在系统工程应用领域的延续和扩展,是近年提出的用于系统体系结构设计的多用途建模语言,用于对由软硬件、数据和人综合而成的复杂系统的集成体系结构进行可视化的说明、分析、设计及校验。 在这里我们绘制参数图如下。在下面的参数图中,我们确定了系统中各部件的相互约束情况。

算法设计与分析实验报告 统计数字问题

算法设计与分析实验报告 实验名称统计数字问题评分 实验日期年月日指导教师 姓名专业班级学号 一.实验要求 1、掌握算法的计算复杂性概念。 2、掌握算法渐近复杂性的数学表述。 3、掌握用C++语言描述算法的方法。 4.实现具体的编程与上机实验,验证算法的时间复杂性函数。 二.实验内容 统计数字问题 1、问题描述 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9) 2、编程任务 给定表示书的总页码的10 进制整数n (1≤n≤109) 。编程计算书的全部页码中分别用到多少次数字0,1,2, (9) 三.程序算法 将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。把这些结果统计起来即可。 四.程序代码 #include int s[10]; //记录0~9出现的次数 int a[10]; //a[i]记录n位数的规律 void sum(int n,int l,int m) { if(m==1) {

int zero=1; for(int i=0;i<=l;i++) //去除前缀0 { s[0]-=zero; zero*=10; } } if(n<10) { for(int i=0;i<=n;i++) { s[i]+=1; } return; }//位数为1位时,出现次数加1 //位数大于1时的出现次数 for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1) { m=1;int i; for(i=1;i

相关文档
最新文档