- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
这个近似解并非最优解,但由于Prim()、DFS算法的时间复杂度都是多项式级,所以该算法的时间复杂度也是多项式级。 实际上,可以从每个顶点出发这样求解,通过比较求出近似最优解,其时间复杂度仍然是多项式级的。 本例的算法恰好找到的是最优解,在很多情况下不一定会找到问题的最优解。 可以通过近似比(approximate ratio)来刻画,若一个最优化问题的最优解为c*,求解该问题的一个近似最优值为c,则该近似算法的近似比定义如下: 实际上近似算法并非适合所有问题求解,一些问题求近似解和求最优解一样难!!! 12.1.1 什么是概率算法 1. 概率算法的特点 概率算法也叫随机化算法,允许算法在执行过程中随机地选择下一个计算步骤。 在很多情况下,算法在执行过程中面临选择时,随机性选择比最优选择省时,因此概率算法可以在很大程度上降低算法的复杂度。 2. 概率算法的分类 数值概率算法。常用于数值问题的求解,这类算法所得到的往往是近似解,而且近似解的精度随计算时间的增加不断提高。 蒙特卡罗(Monte Carlo)算法。用蒙特卡罗算法能够求得问题的一个解,但这个解未必是正确的。 拉斯维加斯(Las Vegas)算法。一旦用拉斯维加斯算法找到一个解,那么这个解肯定是正确的,但有时用拉斯维加斯算法可能找不到解。 舍伍德(Sherwood)算法。总能求得问题的一个解,且所求得的解总是正确的。 对概率算法通常讨论如下两种期望时间: 平均的期望时间:所有输入实例上平均的期望执行时间。 最坏的期望时间:最坏的输入实例上的期望执行时间。 3. 随机数发生器 在概率算法中需要由一个随机数发生器产生随机数序列,以便在算法执行中按照这个随机数序列进行随机选择。可以采用线性同余法产生随机数序列a0,a1,…,an: a0=d an=(ban-1+c) mod m n=1,2,… 其中,b≥0,c≥0,d≤m,d称为随机数发生器的随机种子。 以下算法产生n个[a,b)的随机整数: void randa(int x[],int n,int a,int b) //产生n个[a,b]的随机数 { int i; for (i=0;in;i++) x[i]=rand()%(b-a+1)+a; } 12.1.2 蒙特卡罗类型概率算法 蒙特卡罗(Monte Carlo) 方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。 其基本思想很早以前就被人们所发现和利用,在7世纪人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定π。高速计算机的出现,使得用数学方法在计算机上大量模拟这样的试验成为可能。 【例12.1】设计一个求π(圆周率)的蒙特卡罗型概率算法。 解:在边长为2的正方形内有一半径为1的内切圆,如下图所示。向该正方形中投掷n次飞镖,假设飞镖击中正方形中任何位置的概率相同,设飞镖的位置为(x,y),如果有x2+y2≤1,则落在内切圆中。 这里,圆面积为π,正方形面积为4,圆面积与正方形面积比为π/4。若n次投掷中有m次落在内切圆中,则圆面积与正方形面积比可近似为m/n,即π/4≈m/n,或者π≈4m/n。 1 -1 x y #include stdio.h #include stdlib.h //包含产生随机数的库函数 #include time.h int randa(int a,int b) //产生一个[a,b]的随机数 { return rand()%(b-a+1)+a; } double rand01() //产生一个[0,1]的随机数 { return randa(0,100)*1.0/100; } double solve() //求π的蒙特卡罗算法 { int n=10000; int m=0; double x,y; for (int i=1;i=n;i++) { x=rand01(); y=rand01(); if (x*x+y*y=1.0) m++; } return 4.0*m/n; } void main() { srand((unsigned)time(NULL)); //随机种子 printf(PI=%g\n,solve()); //输出π } 12.1.3 拉斯维加斯类型概率算法 拉斯维加斯型概率算法的一个显著特征是,它所做的随机性选择有可能导致算法找不到问题的解,即算法运行一次,或者得到一个正确的解,或者无解。 因此,需要对同一输入实例反复多次运行算法
文档评论(0)