随机化

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
back
创造新物种
有些物种无论如何进化,都无法达到最优 解。面对这种情况,我们选择创造新物种: 重新随机产生一种状态,然后继续进行牛 顿爬山和基因突变。
也许你们会பைடு நூலகம்疑。。。。。这么弱 的算法真的有效吗?
随机化的光荣战绩: 姜啸,2006年NOI金牌成绩。在day1的比 赛中,面对一道复杂树型dp题:网络收费, 使用随机化算法获得80分的高分。
谢谢!!
简单说:运气不是随机化的关键!!!
随机化算法的关键
由于随机化算法的随机种子不同,每次运 行的正确性、时间效率都有可能不同,而 一个好的随机算法应该保证算法的稳定性。 算法的稳定性是评价一个随机化算法的重 要指标。
如果一个算法是随机化算法,则它执行的流程或结 果就会受其中用的随机函数的影响。我们按影响的 性质和程度分三种情况:
启发式随机化
很多情况下,单纯的随机化算法会显得比 较盲目,此时,我们需要给算法加入有利 的启发信息。 这于启发式搜索相类似,拿这道例题来说, 随机寻找下一个点时,可以让剩余度较大 的点被选择的概率大一些,这样有利于更 快找到解。
back
牛顿爬山法
y T
P x
上图为牛顿爬山法的原理。设爬山者在P 点,为了爬上山 峰,他可以向左或向右移动。爬山法要求每次移动之前计 算新位置与当前位置的差(即改进量),一般选择改进量 大的方向前进。由于有了这样的启发信息,一般很快就可 以找到一个最值。
常见随机化算法
• 纯随机化算法
• 牛顿爬山法 • 遗传算法
单纯的随机化算法
例题:给出一张有n个节点的图,每个点的 度不小于n/2,要求出图中的一个哈密尔顿 回路。 由于题目中给出的有利条件:每个点的度 都较大,所以哈密尔顿回路的可行方案较 多,采用随机化算法:每次随机的找一个 可以到达且未访问过的节点进行深度优先 遍历。
大家可以发现,当a数组本来就为递增序列时, 快排的时间复杂度可以达到o(n^2)!!!
我们对程序进行如下修改: Procedure qsort(a:arr;l,r:int); x,I,j:int; { x=a[random(l,r)];i=l;j=r; repeat while a[i]<x do i=i+1; while a[j]>x do j=j-1; if not(i>j) then { change(a[i],a[j]); i=i+1; j=j-1; } until i>j; if l<j then qsort(a,l,j); if i<r then qsort(a,I,r); }
这个算法会产生一种错误,即选取的s个a 值均满足a^(n-1)1 (mod n),而n是合数时, 算法会认为n是合数的证据不足,判其为素 数。 但当s=50时,此算法的正确率就可以到达 99%以上。选取适当的s,此算法的时间效 率远高于朴素的判定方法。
back
随机影响执行结果的优劣
随机影响执行结果的优劣。这时,随机的 效应表现为实际执行结果与理论上的最优 解或期望结果的差异。 在此要向大家介绍3种常见的随机化算法。
用随机化判断素数
若n是素数,对于a=1,2...n-1,有a^(n-1)1 (mod n)。所以,若存在整数a[1,n-1],使得a^(n-1)1 (mod n),则a必为合数。我们考虑以下算法: ISPRIME_R(n, s:int); i,a:int; { for i=1 to s do { a=random(1,n-1); if a^(n-1) mod n1 then return false; } return true; }
随机化算法介绍
rs
什么是随机化?
随机化算法是这样一种算法:在算法中使 用了随机函数,且随机函数的返回值直接 或间接地影响了算法的执行流程或执行结 果。
那么随机化算法和“运气”的关系如何呢? 根据著名的:RP守恒定律!!! RP不会自己产生,也不会自己消亡,只会 从一种形式转化为另一种形式,从一个个 体转移到另一个个体,从一个个体的一个 部分转移到另一部分。
在快速排序时使用随机化,可以有效避免时 间复杂度的退化!
Back
随机影响执行结果的正确性
随机影响执行结果的正确性。在这种情况 中,原问题要求我们求出某个可行解,或 者原问题为判定性问题,随机的效应表现 为执行得到正确解的概率。 举例说明:用随机化判断素数。
朴素的判断素数方法
对于较小的n,我们可以用“筛数法”判定 n是否为素数。对于稍大一点的n,我们可 以先求出[2,sqrt(n)]内的所有素数,再用 这些素数试除n。这两种方法都要借助于大 数组,如果n足够大,就不再适用了。这时, 我们只能用2,3,..., sqrt(n)试除n,一旦除 尽,n必然是合数,否则为素数。 当遇到较大的素数n时,朴素算法会显得十 分慢的。其最坏情况时间复杂度为o(n^½)。
back
遗传算法
遗传算法在一定程度上对牛顿爬山法的缺 陷进行了弥补,主要采取两种方法: 基因突变
创造新物种
基因突变
当陷入局部最优解并无法进行更新时,我们需要 用到输入一些新鲜血液。 随机地对状态进行改变,产生的这个新状态虽然 解可能没有祖先优,但继承了祖先大部分的优秀 基因,更中要的是,由于基因的突变,新的状态 拥有祖先所不具备的进化潜力,可以通过牛顿爬 山法继续寻找更优解。 举例来说,可以随机把一个人从原来的组别放到 另一个组,然后。。。。。。继续爬山。
随机化的精髓
之前介绍的随机化算法,思路简单,编程 复杂度也很低,因此,算法随机化。 随机化的精髓在于:随机化思想!!!! 在赛场中想不到标准算法时,需要让思路 敏锐地转向随机化。
不过,随机化并不是万能的,尤 其是在一些级别较高的比赛中, 出题者会对数据进行精心地设计, 防止随机化获得高分。 因此,认真学习算法是永远的真 理!!!!
随机不影响执行结果。 随机影响执行结果的正确性。 随机影响执行结果的优劣。
随机不影响执行结果
随机不影响执行结果。这时,随机必然影 响了执行的流程,其效应多表现为算法的 时间效率的波动。 举例说明:下面大家来看一段快速排序的 代码
Procedure qsort(a:arr;l,r:int); x,I,j:int; { x=a[l];i=l;j=r; repeat while a[i]<x do i=i+1; while a[j]>x do j=j-1; if not(i>j) then { change(a[i],a[j]); i=i+1; j=j-1; } until i>j; if l<j then qsort(a,l,j); if i<r then qsort(a,I,r); }
例题:
有n个人,已知每个人的体重,要将此n个 人分成m组,使得方差最小。 随机化算法:将n个人随机分配到m组,然 后随机调整(调整包括交换和转移),如果调 整后能使解变优,则进行调整,并不断重 复,直到无法找到能使解变优的调整为止。
牛顿爬山法的缺陷
y
T T1
P
x
如上图所示,牛顿爬上法的缺陷就是会陷入局部 最优解,图中,处于P点时,不断向上攀爬,到 达T1后,就无法继续对解进行更新,错误的认为 T1就是最优解,而实际上的顶峰在T。
相关文档
最新文档