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

上传人:b****6 文档编号:7275086 上传时间:2023-01-22 格式:DOCX 页数:14 大小:65.13KB
下载 相关 举报
《算法分析与设计》实验指导.docx_第1页
第1页 / 共14页
《算法分析与设计》实验指导.docx_第2页
第2页 / 共14页
《算法分析与设计》实验指导.docx_第3页
第3页 / 共14页
《算法分析与设计》实验指导.docx_第4页
第4页 / 共14页
《算法分析与设计》实验指导.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

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

《《算法分析与设计》实验指导.docx》由会员分享,可在线阅读,更多相关《《算法分析与设计》实验指导.docx(14页珍藏版)》请在冰豆网上搜索。

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

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

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

何敏编著

计算机综合实验中心

目录

实验一分治法2

实验二贪心方法5

实验三动态规划9

实验四回溯法14

 

实验一分治法

一、实验目的

1.掌握分治法思想;

2.熟练运用分治法解决相应的问题。

二、实验内容

分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

如果原问题可分割成k个子问题,1

为了解决一个大的问题,可以:

1)把它分成两个或多个更小的问题;

2)分别解决每个小问题;

3)把各小问题的解答组合起来,即可得到原问题的解答。

小问题通常与原问题相似,可以递归地使用分而治之策略来解决。

1.归并分类

如果用分治策略来设计分类算法,则可使最坏情况时间变为O(nlogn)。

这样的算法称为归并分类算法。

算法的基本思想时,将A

(1),…,A(n)分成两个集合A

(1),…,A(

)和A(

+1),…,A(n)。

对每个集合单独分类,然后将已分类的两个序列归并成一个含n个元素的分好类的序列。

这种思想是典型的分治设计思想。

过程MERGESORT通过使用地规和调用把两个已分类集合归并在一起的子过程MERGE非常简洁地刻画了这一处理过程。

算法1.1归并分类

procedureMERGESORT(low,high)

//A(low:

high)是一个全程数组,它含有high-low+1≥0个待分类的元素//

integerlow,high;

iflow

thenmid

//求这个集合的分割点//

callMERGESORT(low,mid)//将一个子集合分类//

callMERGESORT(mid+1,high)//将另一个子集合分类//

callMERGE(low,mid,high)//归并两个已分类的子集合//

endif

endMERGESORT

2.快速分类

实现的基本思想:

选取A(1:

n)的某个元素,譬如说t=A(s),然后将其他元素重新排列,使A(1:

n)中所有在t以前出现的元素都小于或等于t,而所有在t后面出现的元素都大于或等于t。

文件的这种重新整理叫做划分,元素t称为划分元素。

因此,所谓快速分类就是通过反复对产生的文件进行划分来实现的。

下列算法描述了这种分类的全过程。

算法1.2快速分类

procedureQUICKSORT(p,q)

//将全程数组A(1:

n)中的元素A(p),…,A(q)按递增的方式分类。

认为A(n+1)已被定义,且大于或等于A(p:

q)的所有元素;即A(n+1)=+

//

integerp,q;globaln,A(1:

n);

ifp

thenj

callPARTITION(p,j)//j是划分元素的位置//

callQUICKSORT(p,j-1)

callQUICKSORT(j+1,q)

endif

endQUICKSORT

3.选择问题

对于给定的n个元素的数组A(1:

n),要求从中找出第k小的元素。

如果划分元素v测定在A(j)的位置上,则有j-1个元素小于或等于A(j),且有n-j个元素大于或等于A(j)。

因此,若k

j-1)中;若k=j,则A(j)就是第k小元素;若k>j,则第k小元素是A(j+1:

n)中第(k-j)小元素。

所导出的算法如果成SELECT。

此过程把第k小元素放在A(k),并划分剩余的元素,使得A(i)≤A(k),1≤i

算法1.3找第k小元素

procedureSELECT(A,n,k)

//在数组A

(1),…,A(n)中找第k小元素s并把它放在位置k,假设1≤k≤n。

将剩下的元素按如下方式重新排列,使A(k)=t,对于1≤m

A(n+1)=+

//

integern,k,m,r,j;

m

;r

n+1;A(n+1)

+

;

loop//每当进入这一循环时,1≤m≤k≤n+1//

j

r//将剩余元素的最大下标加1后置给j//

callPARTITION(m,j)//返回j,它使得A(j)是第j小的值//

case

k=j:

return

k

r

j//j是新的上界//

else:

m

j+1//j+1是新的下界//

endcase

repeat

endSELECT

三、实验任务

1.写一个“由底向上”的归并分类排序算法。

2.用快速分类算法对10个数(键盘输入)进行从大到小或从小到大的排列并输出结果。

四、实验报告

实验报告应包括以下内容:

(1)题目;

(2)写出算法设计思想;

(3)程序清单;

(4)运行的结果;

(5)所得图形;

(6)对运行情况所作的分析以及本次调试程序所取的经验。

如果程序未通过,应分析其原因。

实验二贪心方法

一、实验目的

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

2.能用贪心算法的思想进行简单的程序设计。

二、实验内容

贪心方法是一种改进了的分级处理方法。

它首先根据题意,选取一种量度标准。

然后按这种量度标准对这n个输入排序,并按排序一次输入一个量。

如果这个输入和当前已构成在这种量度意义下的部分最优解加在一起不能产生一个可行解,则不把此解输入加到这部分解中。

这种能够得到某种度量意义下的最优解的分级处理方法称为贪心方法。

1.背包问题

(1)背包问题的描述:

已知有n种物品和一个可容纳M重量的背包,每种物品i的重量为

假定将物品i的一部分

放入背包就会得到

的效益,这里,

显然,由于背包容量是M,因此,要求所有选中要装入背包的物品总重量不得超过M.。

如果这n件物品的总重量不超过M,则把所有物品装入背包自然获得最大效益。

现需解决的问题是,这些物品重量的和大于M,该如何装包。

由以上叙述,可将这个问题形式表述如下:

极大化

约束条件

(2)用贪心策略求解背包问题

首先需选出最优的量度标准。

不妨先取目标函数作为量度标准,即每装入一件物品就使背包获得最大可能的效益值增量。

在这种量度标准下的贪心方法就是按效益值的非增次序将物品一件件放到背包中去。

如果正在考虑中的物品放不进去,则可只取其一部分来装满背包。

但这最后一次的方法可能不符合使背包每次获得最大效益增量的量度标准,这可以换一种能获得最大增量的物品,将它(或它的一部分)放入背包,从而使最后一次装包也符合量度标准的要求。

算法如下所示。

算法2.1背包问题的贪心算法

procedureGREEDY-KNAPSACK(P,W,M,X,n)

//P(1:

n)和W(1:

n)分别含有按P(i)/W(i)≥P(i+1)/W(i+1)排序的n件物品的效益值和重量。

M是背包的容量大笑,而X(1:

n)是解向量。

//

realP(1:

n),W(1:

n),X(1:

n),M,cu;

integeri,n;

X

0//将解向量初始化为零

cu

M//cu是背包剩余容量

fori

1tondo

ifW(i)>cuthenexitendif

X(i)

1

cu

cu-W(i)

repeat

ifi≤nthenX(i)

cu/W(i)

endif

endGREEDY-KNAPSACK

2.最短路径

(1)最短路径的描述:

(1)问题描述

给出有向图G,它的每条边都有一个非负的长度(耗费)a[i][j],路径的长度即为此路径所经过的边的长度之和。

对于给定的源顶点s,需找出从它到图中其他任意顶点(称为目的)的最短路径。

(2)用贪心策略求解最短路径问题

利用E.Dijkstra发明的贪心算法可以解决最短路径问题,它通过分步方法求出最短路径。

每一步产生一个到达新的目的顶点的最短路径。

下一步所能达到的目的顶点通过如下贪心准则选取:

在还未产生最短路径的顶点中,选择路径长度最短的目的顶点。

也就是说,Dijkstra的方法按路径长度顺序产生最短路径。

首先最初产生从s到它自身的路径,这条路径没有边,其长度为0。

在贪婪算法的每一步中,产生下一个最短路径。

方法是在目前产生的每一条最短路径中,考虑加入一条最短的边,再从所有这些边中先选择最短的,这种策略即是Dijkstra算法。

算法2.2生成最短路径的贪心算法

procedureSHORTEST-PATHS(v,COST,DIST,n)

//G是一个n结点有向图,他由其成本领接矩阵COST(n,n)表示DIST(j)被置以节电v到节电j的最短路径长度,这里1≤j≤n。

DIST(v)被置成零。

//

booleanS(1:

n);realCOST(1:

n;1:

n),DIST(1:

n)

integeru,v,n,num,i,w

fori

1tondo//将集合S初始化为空//

S(i)

0;DIST(i)

COST(v,i)

repeat

S(v)

1;DIST(v)

0//结点v计入S//

fornum

2ton-1do//确定由结点v出发的n-1条路//

选取结点u,它使得DIST(u)=

S(u)

1//结点u计入S//

for所有S(w)=0的结点wdo//修改距离//

DIST(w)

min(DIST(w),DIST(u)+COST(u,w))

repeat

repeat

endSHORTEST-PATHS

三、实验任务

1.

(1)求以下情况背包问题的最优解:

n=7,M=15,(

)=(10,5,15,7,6,18,3)和(

)=(2,3,5,7,1,4,1)。

(2)将以上数据情况的背包问题记为I。

设FG(I)是物品按

的非增次序输入时由GREEDY-KNAPSACK所生成的解,FO(I)是一个最优解。

问FO(I)/FG(I)是多少?

(3)当物品按

的非降次序输入时,重复

(2)的讨论。

2.在下图的有向图中,利用算法SHORTEST-PATHS获取按长度非降次序排列的由结点1到其余结点最短路径长度。

 

四、实验报告

实验报告应包括以下内容:

(1)题目;

(2)写出算法设计思想;

(3)程序清单;

(4)运行的结果;

(5)所得图形;

(6)对运行情况所作的分析以及本次调试程序所取的经验。

如果程序未通过,应分析其原因。

 

实验三动态规划

一、实验目的

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

2.运用动态规划算法的思想解决一些简化的实际问题。

二、实验内容

动态规划(dynamicprogramming)是运筹学的一个分支,是求解决策过程(decisionprocess)最优化的数学方法。

20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistepdecisionprocess)的优化问题时,提出了著名的最优化原理(principleofoptimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。

1.动态规划的基本思想

动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。

2.动态规划模型的基本要素

一个多阶段决策过程最优化问题的动态规划模型通常包含以下要素:

⏹1.阶段

阶段(step)是对整个过程的自然划分。

通常根据时间顺序或空间特征来划分阶段,以便按阶段的次序解优化问题。

阶段变量一般用k=1,2,..,n表示。

⏹2.状态

状态(state)表示每个阶段开始时过程所处的自然状况。

它应该能够描述过程的特征并且具有无后向性,即当某阶段的状态给定时,这个阶段以后过程的演变与该阶段以前各阶段的状态无关,即每个状态都是过去历史的一个完整总结。

通常还要求状态是直接或间接可以观测的。

描述状态的变量称状态变量(statevariable)。

变量允许取值的范围称允许状态集合(setofadmissiblestates)。

用xk表示第k阶段的状态变量,它可以是一个数或一个向量。

用Xk表示第k阶段的允许状态集合。

⏹3.决策

当一个阶段的状态确定后,可以作出各种选择从而演变到下一阶段的某个状态,这种选择手段称为决策(decision),在最优控制问题中也称为控制(control)。

描述决策的变量称决策变量(decisionvariable)。

变量允许取值的范围称允许决策集合(setofadmissibledecisions)。

用uk(xk)表示第k阶段处于状态xk时的决策变量,它是xk的函数,用Uk(xk)表示了xk的允许决策集合。

⏹4.策略

决策组成的序列称为策略(policy)。

由初始状态x1开始的全过程的策略记作p1n(x1),即p1n(x1)={u1(x1),u2(x2),...,un(xn)}。

由第k阶段的状态xk开始到终止状态的后部子过程的策略记作pkn(xk),

pkn(xk)={uk(xk),uk+1(xk+1),...,un(xn)}

类似地,由第k到第j阶段的子过程的策略记作

pkj(xk)={uk(xk),uk+1(xk+1),...,uj(xj)}

对于每一个阶段k的某一给定的状态xk,可供选择的策略pkj(xk)有一定的范围,称为允许策略集合(setofadmissiblepolicies),

用P1n(x1),Pkn(xk),Pkj(xk)表示。

⏹5.状态转移方程

在确定性过程中,一旦某阶段的状态和决策为已知,下阶段的状态便完全确定。

用状态转移方程(equationofstate)表示这种演变规律,写作

⏹6.指标函数和最优值函数

指标函数(objectivefunction)是衡量过程优劣的数量指标,它是关于策略的数量函数,从阶段k到阶段n的指标函数用Vkn(xk,pkn(xk))表示,k=1,2,...,n。

能够用动态规划解决的问题的指标函数应具有可分离性,即Vkn可表为xk,uk,Vk+1n的函数,记为

其中函数

是一个关于变量Vk+1n单调递增的函数。

这一性质保证了最优化原理(principleofoptimality)的成立,是动态规划的适用前提。

⏹7.最优策略和最优轨线

使指标函数Vkn达到最优值的策略是从k开始的后部子过程的最优策略,记作pkn*={uk*,..un*},p1n*又是全过程的最优策略,简称最优策略(optimalpolicy)。

从初始状态x1(=x1*)出发,过程按照p1n*和状态转移方程演变所经历的状态序列{x1*,x2*,..,xn+1*}称最优轨线(optimaltrajectory)。

3.动态规划算法的基本步骤

⏹划分阶段:

按照问题的时间或空间特征,把问题分为若干个阶段。

注意这若干个阶段一定要是有序的或者是可排序的(即无后向性),否则问题就无法用动态规划求解

⏹选择状态:

将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。

当然,状态的选择要满足无后效性。

⏹确定决策并写出状态转移方程:

之所以把这两步放在一起,是因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。

所以,如果我们确定了决策,状态转移方程也就写出来了。

但事实上,我们常常是反过来做,根据相邻两段的各状态之间的关系来确定决策。

⏹写出规划方程(包括边界条件):

动态规划的基本方程是规划方程的通用形式化表达式。

一般说来,只要阶段、状态、决策和状态转移确定了,这一步还是比较简单的。

4.标准动态规划的基本框架

1.对fn+1(xn+1)初始化;{边界条件}

2.fork:

=ndownto1do

3.for每一个xk∈Xkdo

4.for每一个uk∈Uk(xk)do

begin

5.fk(xk):

=一个极值;{∞或-∞}

6.xk+1:

=Tk(xk,uk);{状态转移方程}

7.t:

=φ(fk+1(xk+1),vk(xk,uk));{基本方程(9)式}

8.ift比fk(xk)更优thenfk(xk):

=t;{计算fk(xk)的最优值}

end;

9.t:

=一个极值;{∞或-∞}

10.for每一个x1∈X1do

11.iff1(x1)比t更优thent:

=f1(x1);{按照10式求出最优指标}

12.输出t;

三、实验任务

已知图G(V,E)的距离矩阵如下,求其任意两点间的最短距离

四、实验报告

实验报告应包括以下内容:

(1)题目;

(2)写出算法设计思想;

(3)程序清单;

(4)运行的结果;

(5)所得图形;

(6)对运行情况所作的分析以及本次调试程序所取的经验。

如果程序未通过,应分析其原因。

 

实验四回溯法

一、实验目的

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

2.运用回溯算法的思想解决一些简化的实际问题。

二、实验内容

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

用它可以求解问题的所有解或任一解。

概括地说,回溯法是一个既带有系统性又带有跳跃性的搜索法。

它在包含问题所有解的一棵状态空间树中,按照深度优先的策略,从根出发进行搜索,搜索每到达状态空间数的一个结点,总是先判断以该结点为根的子树是否肯定不包括问题的解。

如果肯定不包括,则跳过对该子树的系统搜索,一层一层地向它的父结点回溯,直到遇上一个还有未被搜索过的子结点,才转向该子结点继续搜索;否则,进入子树,继续按深度优先的策略进行搜索。

回溯法在用来求问题的所有解时,要回溯到根,且根的所有子结点都已被搜索过才结束;而在用来求问题的任一解时,只是搜索到问题的一个解就可以结束。

1.回溯法的基本思想:

确定了解空间组织结构后,回溯法就从根结点出发,以深度优先的方式搜索整个空间。

这个开始结点就成为一个活结点,同时也成为当前的扩展结点。

在当前的结点往下搜索,直到找完为止。

2.回溯算法的步骤:

(1)定义一个解空间,它包括问题的解。

(2)用适于搜索的方式组织该空间。

(3)用深度优先法搜索该空间,利用限界函数避免移动到不可能产生解的子空间。

3.回溯的一般方法

procedureBACKTRACK(n)

//这是对回溯法控制流程的抽象描述。

每个解都在X(1:

n)中生成,一个解一经确定就立即印出。

在X

(1),…,X(k-1)已被选定的情况下,T(X

(1),…,X(k-1))给出X(k)的所有可能的取值。

限界函数B(X

(1),…,X(k))判断哪些元素X(k)满足隐式约束条件。

Integerk,n;localX(1:

n)

k

1

whilek>0do

if还剩有没检验过的X(k)使得

X(k)

T(X

(1),…,X(k-1)andB(X

(1),…,X(k))=true

thenif(X

(1),…,X(k))是一条已抵达一答案结点的路径

thenprint(X

(1),…,X(k))endif

k

k+1//考虑下一个集合//

elsek

k-1//回溯到先前的集合

endif

repeat

endBACKTRACK

三、实验任务

已知有n种物品和一个可容纳M重量的背包,每种物品i的重量为w(i)。

假定将物品i放入背包就会得到i的价值v(i)。

算法要实现的就是采用回溯法使装入背包物品的总效益最大。

四、实验报告

实验报告应包括以下内容:

(1)题目;

(2)写出算法设计思想;

(3)程序清单;

(4)运行的结果;

(5)所得图形;

(6)对运行情况所作的分析以及本次调试程序所取的经验。

如果程序未通过,应分析其原因。

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

当前位置:首页 > 表格模板 > 合同协议

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

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