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)对运行情况所作的分析以及本次调试程序所取的经验。
如果程序未通过,应分析其原因。