随笔分类 - analysis of algorithms
Algorithm + Data Structures = Programs
摘要:matlab有遗传算法工具箱。 核心函数: (1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数 【输出参数】 pop--生成的初始种群 【输入参数】 num--种群中的个体数目 bounds--
阅读全文
摘要:line void LC(tree T,float cost) {//为找一个答案结点检索T0 if(T是答案结点) {输出T;return;}1 E=T; //E-结点2 将活结点表初始化为空;3 while(1) {4 for(E的每个子结点X) {5 if(X是答案结点) {输出从X到T的路径;6 return;7 };//endif8 Add(X); //X是新的活结点9 Parent(X)=E; //指示到根的路径10 };//for11 if(不再有活结点) { print(‘no answer node’);12 stop;13 };//if14 Least(E) ;15 } /
阅读全文
摘要:问题:检索4-皇后问题的状态空间树如下图的基本过程。(4-皇后问题解空间的树结构,结点按深度优先检索编号) 如果按序扩展这些结点,则下一个E-结点就是结点2。扩展结点2后生成结点3,8和13。利用限界函数(同行、列、对角线上只能放置1个皇后),结点3(放在第二列)立即被杀死。于是,仅将结点8和13加到活结点队列。结点18变成下一个E-结点,生成结点19(放在第一列),24(放在第三列)和29(放在第四列),限界函数杀死结点19和24,结点29被加到活结点队列。下一个E-结点是34,…。 下图显示了由FIFO分枝_限界检索生成图7.1所示的树的一部分(由FIFO分枝-限界法生成的4-皇后问题..
阅读全文
摘要:定义:分支定界 (branch and bound) 算法是一种在问题的解空间树上搜索问题的解的方法。但与回溯算法不同,分支定界算法采用广度优先或最小耗费优先的方法搜索解空间树,并且,在分支定界算法中,每一个活结点只有一次机会成为扩展结点。利用分支定界算法对问题的解空间树进行搜索,它的搜索策略是: 1 .产生当前扩展结点的所有孩子结点; 2 .在产生的孩子结点中,抛弃那些不可能产生可行解(或最优解)的结点; 3 .将其余的孩子结点加入活结点表; 4 .从活结点表中选择下一个活结点作为新的扩展结点。如此循环,直到找到问题的可行解(最优解)或活结点表为空。分支限界法的思想是:首先确定目标值...
阅读全文
摘要:设G=(V,E)是一个n结点的连通图。一个哈密顿环是一条沿着图G的n条边环行的路径,它访问每个结点一次并且返回到它的开始位置。换言之,如果一个哈密顿环在某个结点v1∈V处开始,且G中结点按照v1,v2,…,Vn+l的次序被访问,则边(Vi,Vi+1),1≤i≤n,均在图G中,且除了v1和vn+l是同
阅读全文
摘要:已知一个图G和m>0种颜色,在只准使用这m种颜色对G的结点着色的情况下,是否能使图中任何相邻的两个结点都具有不同的颜色呢?这个问题称为m-着色判定问题。在m-着色最优化问题中,则是求可对图G着色的最小整数m。称m为图G的色数。 4种颜色足以对任何地图着色,如图,对一平面图的4-着色判定问题(平面图是一个能画于平面上而边无任何交叉的图)。将地图的每个区域变成一个结点,若两个区域相邻,则相应的结点用一条边连接起来。 假定用图的邻接矩阵Graph(1:n,1:n)来表示一个图G,其中若(i,j)是G的一条边,则Graph(i,j)=true,否则Graph(i,j)=false。。颜色用整...
阅读全文
摘要:子集和数问题是假定有n个不同的正数(通常称为权),要求找出这些数中所有使得某和数为M的组合。子集和数问题的递归回溯算法,代码如下:void SumOfSub(s,k,r) {//找w(1:n)中和数为M的所有子集。进入此过程时x(1),…,X(k-1)的值已确定。k-1 n//s=ΣW(i)X(i)且r=ΣW(j)。W(j)按非递减排列。假定w(1)≤M,ΣW(i)≥Mj=1 j=kl int M,n;float W[n];bool X[n]; //M、W[n]、X[n]定义成全局变量2 float r,s;int k,j;//生成左子结点。注意,由于Bk-1=true,因此s + w[k..
阅读全文
摘要:回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。 回溯法的一般流程和技术在用回溯法...
阅读全文
摘要:假定要设计一个系统,这个系统由若干个以串联方式连接在一起的不同设备所组成(图6.1所示)。设ri是设备Di的可靠性(即ri是Di正常运转的概率),则整个系统的可靠性就是Πri。即便这些单个设备是非常可靠的(每个ri都非常接近于1),该系统的可靠性也不一定很高。 为了提高系统可靠性,最好是增加一些重复设备,并通过开关线路把数个同类设备并联在一起(见图6.2)。由开关线路来判明其中的设备的运行情况,并将能正常运行的某台投入使用. 若第i级的设备Di的台数为mi,那么这mi台设备同时出现故障的概率为(1-ri)mi。从而第i级的可靠性就变成1-(1-ri)mi。在任何实际系统中,每一级的可靠...
阅读全文
摘要:对于0/1背包问题,可以通过作出变量x1,x2,…,xi的一个决策序列来得到它的解。而对变量x的决策就是决定它是取0值还是取1值。假定决策这些x的次序为xn,xn-1,…,x1。在对xn作出决策之后,问题处于下列两种状态之一: 背包的剩余容量是M,则没有产生任何效益; 剩余容量是M-w,则效益值增长了P。显然,对xn-l,xn-2,…,x1的决策相对于决策x所产生的问题状态应该是最优的,否则xn,xn-1,…,x1就不可能是最优决策序列。如果设fj(x)是Knap(1,j,X)最优解的值,那么fn(M)就可表示为: fn(M) = max {fn-1(M), fn-1(M-wn)+p...
阅读全文
摘要:前面给出了二分检索树的定义,下图给出了关于保留字的一个子集的两棵二分检索树。 为了确定标识符x是否在一棵二分检索树中出现,将x先与根比较,如果X比根中标识符小,则检索在左子树中继续;如果x等于根中标识符,则检索成功地终止;否则检索在右子树中继续下去。上述步骤可以形式化为过程Search。Line void Search (BinaryTree T,elemType x,int i) {//在二分检索树T上查找x,树的每个结点有三个信息段:LChild,IDent//和RChild。如果x不在T中,则置i=0,否则将i置成使得IDent(i)=x1 i = T;2 while(i!=0) ...
阅读全文
摘要:COST(i,j)=min{c(j,v) + COST(i+1,v)} (v∈Vk+1,∈E)COST(3,6) = min{6+COST(4,9), 5+COST(4,10)} = 7 (已知COST(4,9)=4,COST(4,10)=2)COST(3,7) = min{4+COST(4,9), 3+COST(4,10)}= 5COST(3,8) = 7COST(2,2) = min{4+COST(3,6), 2+COST(3,7), 1+COST(3,8)}= 7COST(2,3) = 9COST(2,4) = 18COST(2,5) = 15COST(1,1) = min{9+CO..
阅读全文
摘要:在学习动态规划法之前,我们先来了解动态规划的几个概念1、 阶段:把问题分成几个相互联系的有顺序的几个环节,这些环节即称为阶段。2、 状态:某一阶段的出发位置称为状态。3、 决策:从某阶段的一个状态演变到下一个阶段某状态的选择。4、 状态转移方程:前一阶段的终点就是后一阶段的起点,前一阶段的决策选择导出了后一阶段的状态,这种关系描述了由k阶段到k+1阶段状态的演变规律,称为状态转 移方程。动态规划法的定义:在求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃那些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解,这种求解方法...
阅读全文
摘要:Kruskal最小生成树算法的概略描述:1 T=Φ;2 while(T的边少于n-1条) {3 从E中选取一条最小成本的边(v,w);4 从E中删去(v,w);5 if((v,w)在T中不生成环) {6 将(v,w)加到T中;7 else{舍弃(v,w);}8 };//if9 }//for 为了有效地执行第5和第6步,G中的结点的组合方式应该是易于确定结点v和w是否已由早先选择的边所连通的那种。在已连通的情况下,则将边(v,w)舍弃;若不连通,则把(v,w) 加人到T。一种可能的组合方法是把T的同一连通分图中所有结点放到一个集合中(T的各个连通分图都是树)。那么,T中的两个结点是连通的,当且.
阅读全文
摘要:定义:设G=(V,E)是一个无向连通图。如果G的生成子图T=(V,E’)是一棵树,则称T是G的一棵生成树(Spanning Tree)。 应用生成树可以得到关于一个电网的一组独立的回路方程。第一步是要得到这个电网的一棵生成树。设B是那些不在生成树中的电网的边的集合,从B中取出一条边添加到这生成树上就生成一个环。从B中取出不同的边就生成不同的环。把克希霍夫(Kirchoff)第二定律用到每一个环上,就得到一个回路方程。用这种方法所得到的环是独立的(即这些环中没有一个可以用那些剩下的环的线性组合来得到),这是因为每一个环包含一条从B中取来的边(生成树固定的情况下),而这条边不包含在任何其它的...
阅读全文
摘要:背包问题的描述如下: 已知有n种物品和一个可容纳m重量的背包,每种物品i的重量为wi。假定将物品i的一部分xi放人背包就会得到pixi的效益,0≤xi≤1,pi>0。采用怎样的装包方法才会使装入背包物品的总效益最大呢?显然,由于背包容量是m,因此,要求所有选中要装入背包的物品总重量不超过m。如果这n件物品的总重量不超过m,则把所有物品装入背包自然获得最大效益。如果这些物品重量的和大于m,则在这种情况下该如何装包呢?这是本节所要解决的问题。根据以上讨论,可将问题形式描述如下:极 大 化: Σpixi (4.1)1≤i≤n约束条件:Σ wixi ≤m (4.2)1≤i≤n0≤xi≤1,pi>0,.
阅读全文
摘要:在现实世界中,有这样一类问题:它有n个输入,而它的解就由这n个输入的某个子集组成,不过这个子集必须满足某些事先给定的条件。把那些必须满足的条件称为约束条件;而把满足约束条件的子集称为该问题的可行解。问题的简单描述:In={n个输入}; 显然,满足约束条件的子Ina是In的子集; 集可能不止一个,一般来说Ina满足约定的条件; 可行解不是唯一的。Ina构成问题的解。 贪心方法是一种改进了的分级处理方法,选择能产生问题最优解的最优量度标准是使用贪心法设计求解的核心问题。但是,要选出最优量度标准并不是一件容易的事,不过,一旦能...
阅读全文
摘要:实现的基本思想如下: 选取A的某个元素t,然后将A的其它元素重新排列,使 得在t以前出现的所有元素都小于或等于t,而所有在t后面出现的所有元素都大于t。称这种重新整理为划分(Partitioning),元素t称为划分元素(Partition element)。快速分类就是通过不断地对产生的文件进行划分来实现元素的重新排列。例如: 用A(m)划分集合A(m:P-1)void Partition(m,p)//在集合A(m),A(m+1),…,A(p-1)中的元素按如下方式重新排列://若最初t=A(m),则在重排完成之后,对于m和p-l之间的某个q,有A(q)=t,//并使得对于m≤k<q,有..
阅读全文
摘要:基本方法: 给定一个含有n个元素(又叫关键字)的集合,如果要把它们按一定的次序分类(本节中自始至终假定按非递减分类),最直接的方法就是插入法。对A(1:n)中元素作插入分类的基本思想是:for(j=2;n;++j){将A[j]放到已分类集合A[1:j-1]的正确位置上};从中可以看出,为了插入A(j),有可能移动A(1:j-1)中的所有元素,因此可以预计该算法在时间特性上不会太好,算法具体描述如下:void InsertionSort(elemType a[],int n) {//将A(l:n)中的元素按非递减分类。n≥1int i;for(j=2;n;++j) { //A(l:j-l)已分.
阅读全文
摘要:现在理论的还是少说些,例子更能理解吧,来个例子用二分检索算法设计与分析,下面算法函数过程bin_search有n+2个输入:a,n 和 x,一个输出j。只要待检索的元素存在,while循环就继续下去。case语句根据compare(x,a[mid])的结果的三种情况进行选择运行。函数过程结束时,如果x不在表a中,则j=0,否则 a(j)=x。void bin_search(elemType a[],int n,elemType x,int &j) {//给定一个按非递减排列的元素数组a(1:n),n>1,判断x是否出现。//若是,则置j,使得x=a(j),若非,则j=0。函数返回
阅读全文