随机算法(数值概率舍伍德).ppt_第1页
随机算法(数值概率舍伍德).ppt_第2页
随机算法(数值概率舍伍德).ppt_第3页
随机算法(数值概率舍伍德).ppt_第4页
随机算法(数值概率舍伍德).ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章 随机算法,学习要点 了解随机算法的基本特征 理解产生伪随机数的算法 掌握数值随机化算法的设计思想 掌握舍伍德算法的设计思想 掌握拉斯维加斯算法的设计思想 掌握蒙特卡罗算法的设计思想,随机算法的基本特征,前面各章讨论的算法的每一个步骤都是确定的,而本章讨论的随机算法允许算法在执行过程中随机地选择一下计算步骤。,在许多情况下,一般算法比较复杂,性能较差,很多具有很好平均运行时间的算法,在最坏的情况下,却具有很坏的性能。由于随机性选择比最优选择省时间,因此引入随机化算法可以在很大程度上降低算法的复杂度。,随机算法的基本特征,随机算法对所求解问题的同一个实例用同一随机算法求解两次可能得到完全不同的效果。这两次求解所需要的时间,甚至所得到的结果都可能会有相当大的差别。 包括 数值概率算法 蒙特卡罗(Monte Carlo)算法 拉斯维加斯(Las Vegas)算法 舍伍德(Sherwood)算法,数值概率算法常用于数值问题的求解。将一个问题的计算与某个概率分布已经确定的事件联系起来,求问题的近似解。这类算法所得到的往往是近似解,且近似解的精度随计算时间的增加而不断提高。在许多情况下,要计算出问题的精确解是不可能或没有必要的,因此可以用数值随机化算法得到相当满意的解。,蒙特卡罗算法用于求问题的准确解,但得到的解未必是正确的。蒙特卡罗算法以正的概率给出正解,求得正确解的概率依赖于算法所用的时间。算法所用的时间越多,得到正确解的概率就越高。一般给定执行步骤的上界,给定一个输入,算法都是在一个固定的步数内停止的。,随机算法的分类,舍伍德算法总能求得问题的一个解,且所求得的解总是正确的。当一个确定性算法在最坏情况下的计算复杂性与其在平均情况下的计算复杂性有较大差别时,可在这个确定性算法中引入随机性将它改造成一个舍伍德算法,消除或减少问题的好坏实例间的这种差别(精髓所在)。,拉斯维加斯算法不会得到不正确的解。一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。但有时可能找不到解。拉斯维加斯算法找到正确解的概率随着它所用的计算时间的增加而提高。对于所求解问题的任意实例,用同一拉斯维加斯算法反复对它求解,可以使求解失效的概率任意小。,随机算法的分类,7.1随机数,7.1随机数,随机数在随机化算法设计中扮演着十分重要的角色。在现实计算机上无法产生真正的随机数,因此在随机化算法中使用的随机数都是一定程度上随机的,即伪随机数。 线性同余法是产生伪随机数的最常用的方法。由线性同余法产生的随机序列a0,a1,an,满足: 其中b0,c0,dm。d称为该随机序列的种子。如何选取该方法中的常数b、c和m直接关系到所产生的随机序列的随机性能。这是随机性理论研究的内容,已超出本书讨论的范围。从直观上看,m应取得充分大,因此可取m为机器大数。,为了在设计概率算法时便于产生所需的随机数,建立一个随机数类RandomNumber。该类包含一个需有用户初始化的种子randseed。给定初始种子后,即可产生与之相应的随机序列。种子seed 是一个无符号长整型数,可由用户选定也可用系统时间自动产生。函数Random的输入参数n65536是一个无符号整形数,返回0,n-1范围内的一个随机整数。函数fRandom()返回0,1内的一个随机实数。,/随机数类 Const unsigned long maxshort = 64436L; Const unsigned long multiplier = 1194211693L; Const unsigned long adder = 12345L; class RandomNumber private: /当前种子 unsigned long randSeed; public: /构造函数,默认值0表示由系统自动产生种子 RandomNumber (unsigned long s = 0); /产生0到n-1之间的随机整数 unsigned short Random (unsigned long n); /产生0,1)之间的随机实数 double fRandom (void); ,函数Random在每次计算时,用线性同余式计算新的种子randSeed。它的高16位的随机性较好。将randSeed右移16位得到一个065535间的随机整数,然后再将此随机整数映射到0(n-1)范围内。,对于函数fRandom,先用函数Random(maxshort)产生一个0(maxshort-1)之间的整形随机序列,将每个整型随机数除以maxshort,就得到0,1)区间中的随机实数。,/产生种子 RandomNumber: RandomNumber(unsigned long s) if (s = 0) randSeed = time (0); /用系统时间产生种子 else randSeed = s; /由用户提供种子 ,/产生0n-1之间的随机数 Unsigned short RandomNumber: Random (unsigned long n) randSeed = multiplier * randSeed + adder; return (unsigned short) ( (randSeed 16) % n ); ,/产生0,1)之间的随机实数 Double RandomNumber: fRandom (void) return Random (maxshort) / double (maxshort);,下面用计算机产生的伪随机数来模拟抛硬币实验。假设抛10次硬币构成一个事件。调用Random(2)返回一个二值结果。返回0表示抛硬币得到反面,返回1表示得到正面。下面的算法TossCoins模拟抛10次硬币这一事件50000次。用headi (0 i 10)记录这50000此模拟恰好得到i次正面的次数。最终输出模拟抛硬币事件得到正面事件的频率图,如下图所示:,0 * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 *,模拟抛硬币得到的正面事件频率图,void main (void) / 模拟随机抛硬币事件 const int NCOINS = 10; const long NTOSSES = 50000L; / headsi是得到i次正面的次数 long i, headsNCOINS+1; int j, position; / 初始化数组heads for (j=0;j NCOIN+1; j+) headsj = 0; / 重复50000次模拟事件 for (i=0;i NTOSSES; i+) headsTossCoins(NCOINS)+; / 输出频率图 for (i=0;i=NCOINS; i+) position = int (float (headsi)/NTOSSES*72); coutsetw(6)i“ “; for (j=0;jposition-1;j+) cout“ “; cout“*“endl; ,int TossCoins (int numberCoins) /随机抛硬币 static RandomNumber coinToss; int i, tosses = 0; for (i = 0; i numberCoins; i+) / Random (2) = 1 表示正面 tosses += coinToss.Random (2); return tosses; ,int TossCoins (int numberCoins) /随机抛硬币 static RandomNumber coinToss; int i, tosses = 0; for (i = 0; i numberCoins; i+) / Random (2) = 1 表示正面 tosses += coinToss.Random (2); return tosses; ,7.2 数值随机化算法,7.2 数值随机化算法,7.2.1 用随机投点法计算值 设有一半径为r的圆及其外切四边形。向该正方形随机地投掷n个点。设落入圆内的点数为k。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为 。,所以当n足够大时,k与n之比就逼近这一概率。从而 。,在具体实现时,只要在第一象限计算即可: double Darts (int n) / 用随机投点法计算值 static RandomNumber dart; int k=0; for (int i=1;i =n;i+) double x=dart.fRandom(); double y=dart.fRandom(); if (x*x+y*y)=1) k+; return 4*k/double(n); ,7.2.2 计算定积分,(1)用随机投点法计算定积分 设f(x)是0,1上的连续函数,且0f(x)1。需要计算的积分 为 , 积分 I 等于图中的面积G。,在图所示单位正方形内均匀地作投点试 验,则随机点落在曲线下面的概率为:,假设向单位正方形内随机地投入n个 点(xi,yi),i = 1,2,n。随机点(xi,yi)落入G内,则yi f(xi)。 如果有m个点落入G内,则随机点落入G内的概率,即,double Darts (int n) / 用随机投点法计算定积分 static RandomNumber dart; int k=0; for (int i=1;i=n;i+) double x=dart.fRandom(); double y=dart.fRandom(); if (y=f(x) k+; return k/double(n) ,如果所遇到的积分形式为:,其中,a和b为有限值,被积函数f(x)在区间a,b中有界,并用M,L分别表示其最大值和最小值。此时可做变量代换x=a+(b-a)z,将所求积分变为:,式中:,(2)用平均值法计算定积分 任取一组相互独立、同分布的随机变量i,i在a,b 中服从分布律f(x), 令 ,则g*(i)也是一组互独立、同分布的随机变量,而且,由强大数定律:,若选 ,则 依概率1收敛于I,平均值法就是用 作为I的近似值。,假设设要计算的积分形式为: ,可以任选一个有简便方法可以进行抽样的概率密度函数f(x),使其满足:,(1),(2),如果记,则所求积分可以写为:,由于a和b为有限值,可取f(x)为均值分布:,此时所求积分变为:,在a,b区间上随机抽取一个点xi(i =1,2, ,n),则均值,可作为所求积分I的近似值。,可设计如下程序:,double Integration(double a, double b, int n) /用平均值法计算定积分 static RandomNumber rnd; double y=0; for(int i=1; i=n; i+) double x=(b-a)*rnd.fRandom()+a; y+=g(x); return (b-a)*y/double(n); ,7.3 舍伍德算法,7.3 舍伍德算法,设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x)。设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为,这显然不能排除存在xXn使得 的可能性。希望获得一个随机化算法B,使得对问题的输入规模为n的每一个实例均有,这就是舍伍德算法设计的基本思想。当s(n)与 相比可忽略时,舍伍德算法可获得很好的平均性能。,7.3.1 随机快速算法 7.3.2 随机选择算法 7.3.2 搜索有序表,7.3.1 随机快速排序算法,随机快速排序算法 快速排序算法 算法的核心在于选择合适的划分基准 改变快速排序算法性能不稳定,即输入相关的问题,template void quicksort_random(Type A,int low,int high) random_seed(0); /* 选择系统当前时间作为随机数种子 */ r_quicksort(A,low,high); /* 递归调用随机快速排序算法 */ ,void r_quicksort(Type A,int low,int high) int k; if (lowhigh) k = random(low,high); /* 产生low到high之间的随机数k */ swap(Alow,Ak); /* 把元素Ak交换到数组的第一个位置*/ k = split(A,low,high); /* 按元素Alow把数组划分为两个 */ r_quicksort(A,low,k-1); /* 排序第一个子数组 */ r_quicksort(A,k+1,high); /* 排序第二个子数组 */ ,随机快速排序算法,最坏时间复杂度仍是:O(n2) 最坏情况:当随机数发生器第i次随机产生的枢点元素恰恰就是数组中第i大或第i小的元素时造成最坏情况 与输入无关 情况是微乎其微的 输入元素的任何排列顺序,都不可能使算法行为处于最坏的情况 期望运行时间是O(nlogn),7.3.2 随机选择算法,选择问题 给定线性序集中n个元素和一个整数1kn,要求找出这n个元素中第k小的元素,对选择问题而言,用中位数作为划分基准可以保证在最坏情况下用线性时间完成选择。如果只简单地用待划分数组的第一个元素作为划分基准,则算法的平均性能较好,而在最坏的情况下需要O(n2)计算时间。 舍伍德型选择算法则随机地一个数组元素作为划分基准。这样既能保证算法的线性时间平均性能又避免了计算拟中位数的麻烦。,template Type select(Type a,int l,int k) /计算al:r中第k小元素 static RandomNumber rnd; while (true) if( l =r) return al; int i = l, j=l + rnd.Random(r- l+1); /随机选择划分基准 swap(ai,aj); j=r+1; Type pivot=al; /以划分基准为轴作元素交换 while (true) while (a+ipivot); if (i=j) break; Swap (ai,aj); ,if (j-l+1=k) return pivot; al=aj; aj=pivot; /对子数组重复划分过程 if (j-l+1k) k=k-j+l-1; l=j+1; else r=j-1; ,由于算法select使用随机数产生器随机地产生1和r之间的随机整数。因此,算法select所产生的划分基准是随机的。在这个条件下,可以证明,当用算法select对含有n个元素的数组进行划分时,划分出的低区子数组中含有1个元素的概率为2/n;含有i个元素的概率为1/n,i=2,3,n-1。设T(n)是算法select作用于一个含有n个元素的输入数组上所需的期望时间的一个上界,且T(n)是单调递增的。在最坏情况下,第k小元素总是被划分在较大的子数组中。由此,可以得到关于T(n)的递归式:,在上面的推导中,从第一行到第二行是因为max(1,n-1)=n-1,并且当n是齐数时,T(n/2),T(n/2+1),T(n-1)在和式中均出现2次;n 是偶数时, T(n/2+1),T(n/2+2),T(n-1)均出现两次,T(n/2)只出现一次。因此,第二行中的和式是第一行中和式的一个上界。从第2行到第3行是因为在最坏情况下T(n-1)=O(n2),故可将T(n-1)/n包含在O(n)中。由此可知,非递归的舍伍德型选择算法可以在O(n)平均时间内实现。,上述舍伍德选择算法对确定性选择算法所做的修改非常简单且容易实现。但有时所给的确定性算法无法直接改造成舍伍德算法。此时可借助随机预处理技术,不改变原有的确定性算法仅对其输入进行随机洗牌,同样可收到舍伍德算法的效果。例如,对于确定性选择算法,可以用下面的洗牌算法Shuffle将数组a中的元素随机排列,然后用确定性选择算法求解。这样做的效果与舍伍德型算法是一样的。,template void Shuffle (Type a, int n) /随机洗牌算法 static RandomNumber rnd; for (int i=0; i n; i+) int j=rnd.Random(n-i)+i; Swap (ai,aj); ,7.3.3 搜索有序表,用两个数组来表示所给的含有n个元素的有序集S。用value0:n存储有序集中的元素,link0:n存储有序集中元素在数组value中位置的指针。Link0指向有序集中第1个元素,即valuelink0是集合中的最小元素。一般地,如果valuei是所给有序集S中的第k个元素,则valuelinki是S中的第k+1个元素。S中元素的有序性表现为,对于任意1 i n有valuei valuelinki。对集合S中的最大元素valuek有,linkk=0且value0是一个大数例如,有序集S=1,2,3,5,8,13,21的一种表示方式如下图:,在此例中,link0=4指向S中最小元素value4=1。显而易见,这种表示有序集的方法实际上是用数组来模拟有序链表。对于有序链表,可采用顺序搜索的方式在所给的有序集S中搜索链值为x的元素。如果有序集S中含有n个元素,则在最坏情

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论