算法实验报告文档格式.docx

上传人:b****6 文档编号:21977540 上传时间:2023-02-02 格式:DOCX 页数:12 大小:154.56KB
下载 相关 举报
算法实验报告文档格式.docx_第1页
第1页 / 共12页
算法实验报告文档格式.docx_第2页
第2页 / 共12页
算法实验报告文档格式.docx_第3页
第3页 / 共12页
算法实验报告文档格式.docx_第4页
第4页 / 共12页
算法实验报告文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

算法实验报告文档格式.docx

《算法实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《算法实验报告文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

算法实验报告文档格式.docx

usingnamespacestd;

classSortableList{

private:

intLength;

inta[100];

public:

SortableList(inta[],intl){

Length=l;

inti;

for(i=0;

i<

Length;

i++)

*(this->

a+i)=*(a+i);

}

SortableList(intl){

voidMerge(intleft,intmid,intright){

inttemp[50+1];

inti=left,j=mid+1,k=0;

while((i<

=mid)&

&

(j<

=right))

if(a[i]<

=a[j])

temp[k++]=a[i++];

else

temp[k++]=a[j++];

while(i<

=mid)

temp[k++]=a[i++];

while(j<

=right)

temp[k++]=a[j++];

for(i=0,k=left;

k<

=right;

a[k++]=temp[i++];

voidMergeSort(){

MergeSort(0,Length-1);

voidMergeSort(intleft,intright){

if(left<

right){

intmid=(left+right)/2;

MergeSort(left,mid);

MergeSort(mid+1,right);

Merge(left,mid,right);

}

voidshowList(){

for(inti=0;

cout<

<

a[i]<

"

\t"

;

};

intmain(){

intlength=50;

inta[50];

inti=0;

for(i;

length;

a[i]=random(50);

cout<

未排序前的数组为:

"

<

endl;

for(i=0;

cout<

SortableListList(a,length);

List.MergeSort();

endl<

排序后的数组为:

List.showList();

return0;

}

5、实验结果截图

六、实验总结

归并排序算法是用分治法实现对规模为n的记录的序列进行排序。

很久没有用C++的我有点儿生疏,刚开始写起来有点慢,但是还是很好得完成了任务。

通过本次实验我既加深了对于C++的熟悉程度,也了解到了很多关于归并排序的知识,这些知识对于我以后的程序开发会有比较大的作用,所以我觉得这次实验对我的作用是比较大的。

实验二贪心法作业调度问题

1掌握贪心算法的基本思想

2掌握贪心算法的典型问题求解

3进一步多级调度的基本思想和算法设计方法

4学会用贪心法分析和解决实际问题

2、实验内容

设计贪心算法实现作业调度,要求按作业调度顺序输出作业序列。

如已知n=8,效益p=(35, 

30, 

25, 

20, 

15, 

10, 

5, 

1),时间期限 

d=(4, 

2, 

4, 

6, 

7),求该条件下的最大效益。

4、方法描述和程序代码

constintWork[8]={35,30,25,20,15,10,5,1};

//所有作业按收益从大到小排序

constintmaxTime[8]={4,2,4,5,6,4,5,7};

classHomeWork{

intres[8];

boolflag[8];

intmaxReap;

voiddealWith(){

//遍历所有作业:

8;

i++){

intTime=maxTime[i]-1;

if(!

flag[Time]){

//如果最大期限那一天还未安排作业,则将当前作业安排在所允许的最大期限那天

res[Time]=Work[i];

flag[Time]=true;

}

else{

//如果当前作业所允许的最大期限那一天已经安排的其他作业,就向前搜索空位,将该作业安排进去

for(intj=Time-1;

j>

=0;

j--)

if(!

flag[j]){

res[j]=Work[i];

flag[j]=true;

break;

}

作业完成顺序为:

for(i=0;

7;

res[i]<

最佳效益为:

maxReap+=res[i];

maxReap<

HomeWork(){

for(inti=0;

i<

i++){

flag[i]=false;

maxReap=0;

HomeWorka=HomeWork();

a.dealWith();

getchar();

六、实验总结

贪心算法是算法的重要内容之一,可以高效地解决许多问题。

这次实验解决的是多机调度的最优方案为题。

采用贪心算法会比动态规划高效方便,如果都能解决某个问题的话。

现在我学习贪心算法的时间还不长,理解还很浅显,以后要多加练习,这样才能做到熟练运用。

实验三动态规划法求多段图问题

1掌握动态规划算法的基本思想

2掌握多段图的动态规划算法

3选择邻接表或邻接矩阵方式来存储图

4分析算法求解的复杂度。

设G=(V,E)是一个带权有向图,其顶点的集合V被划分成k>

2个不相交的子集Vi,1<

=k,其中V1和Vk分别只有一个顶点s(源)和一个顶点t(汇)。

图中所有边的始点和终点都在相邻的两个子集Vi和Vi+1中。

求一条s到t的最短路线。

参考讲义p136图5-24中的多段图,试选择使用向前递推算法或向后递推算法求解多段图问题。

4、算法描述和程序代码

#include<

using 

namespace 

std;

#define 

MAX 

100 

12 

//结点数

//阶段数

void 

main()

{

int 

i, 

j, 

min, 

r, 

temp;

V[n][n];

cost[n], 

d[n], 

path[n];

for 

(i 

0;

12;

i++)

(j 

j++)

V[i][j] 

MAX;

V[0][1] 

9;

//对边的权值进行初始化

V[0][2] 

V[0][3] 

3;

V[0][4] 

2;

V[1][3] 

V[1][5] 

4;

V[1][6] 

V[2][5] 

V[2][6] 

V[3][7] 

11;

V[4][7] 

V[5][8] 

6;

V[5][9] 

5;

V[6][9] 

V[7][9] 

V[7][10] 

V[8][11] 

V[9][11] 

V[10][11] 

cout 

用动态规划法向前递推多段图的最短路径;

endl;

n;

cost[j] 

//设置向前递推的初值 

>

j--) 

//按从2到0的次序计算cost和d

temp 

min 

V[j][temp] 

cost[temp];

(r 

r++)

if 

(V[j][r] 

!

MAX)

((V[j][r] 

cost[r]) 

min)

V[j][r] 

cost[r];

r;

//按式计算最小值cost[j]

d[j] 

//temp是j在最短子路径上的后继结点

path[1] 

//p[1]是源点

path[k] 

1;

//p[k]是汇点

k;

path[j] 

d[path[j 

1]];

//path[j]是最短路径上第阶段的结点?

从到t的一条长度最短的路径为:

path[i];

5)

-->

最短路径长度为:

cost[0];

通过实现动态规划的这个题目,对动态规划算法有了进一步的了解。

先分析问题,判断是否具有最优子结果和重叠字问题的性质。

对于多段图问题,一个阶段的决策与后面所有求解的子问题相关,所以不能在某个阶段直接作出决定。

实验四回溯法求n皇后问题

1掌握回溯算法的基本思想

2通过n皇后问题求解熟悉回溯法

3使用蒙特卡洛方法分析算法的复杂度

要求在一个8*8的棋盘上放置8个皇后,使得它们彼此不受“攻击”。

两个皇后位于棋盘上的同一行、同一列或同一对角线上,则称它们在互相攻击。

现在要找出使得棋盘上8个皇后互不攻击的布局。

#defineN8

intsum=0;

int*x=newint[N+1];

boolplace(intk)

{

inti;

for(i=1;

i++)

{

if(x[i]==x[k]||abs(i-k)==abs(x[i]-x[k]))

returnfalse;

}

returntrue;

}

voidbacktrack(intt)

if(t>

N)

=N;

cout<

x[i]<

sum++;

else

x[t]=i;

if(place(t))

backtrack(t+1);

voidmain()

backtrack

(1);

sum<

五、实验结果截图

回溯法有“通用解题法”之称。

用它可以系统地搜索一个问题的所有解或任一解。

回溯

法在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。

算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解。

如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。

否则,进入该子树,继续按深度优先策略搜索。

它适合于解组合数较大的问题。

回溯法是一种满足某约束条件的穷举式搜索技术,是一种逐步试探求出问题的方法。

N皇后问题是在寻找nxn格的棋盘上放置n个皇后的方案,使得任何2个皇后不放在同一行或者同一列或者同一斜线上。

回溯法有“通用解题法”之称。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

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

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