第7章+概率算法-2018-all
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
解非线性方程组
线性化方法
求函数极小值方法
( x) fi ( x)
2
注:一般而言,概率算法费时,但设计思 想简单,易实现。对于精度要求高的问题, 可以提供较好的初值。
12
解非线性方程组
在求根区域D内,选定随机点x0作为随机搜索的出发点。
1. 按照预先选定的分布(正态分布、均匀分布等),逐个 选取随机点xj,计算目标函数,满足精度要求的随机点就 是近似解。 2. 在算法的搜索过程中,假设第j步随机搜索得到的随机搜 索点为 xj 。在第 j+1 步,生成随机搜索方向和步长,计算 出下一步的增量xj。从当前点xj依xj得到第j+1步的随机 搜索点。当Φ(x)<时,取为所求非线性方程组的近似解。 否则进行下一步新的随机搜索过程。
18
设A是一个确定性算法,当它的输入实例为x时
所需的计算时间记为tA (x)。设Xn是算法A的输 入规模为n的实例全体,当问题的输入规模为n 时,算法A所需的平均时间为
t A ( n)
x X n
t
A
( x) / | X n |
19
这显然不能排除存在x∈Xn,使得 t A ( x) t A (n) 的 可能性。希望获得一个概率算法B,使得对问题 的输入规模为n的每一个实例均有
24
例如,对于确定性选择算法,可以用下面的洗 牌算法shuffle,将数组a中元素随机排列,然后 用确定性选择算法求解。这样做所收到的效果 与舍伍德型算法的效果是一样的。 假设输入实例为整型,下面的随机洗牌算法可 在线性时间实现对输入实例的随机排列。
template <class T> void shuffle(T a[ ], int n) { // 随机洗牌算法 for (int i=1;i<n;i++) { int j = random(n-i+1) + i; swap(a, i, j); } }
供算法进行随机选择的随机数序列;
概率算法在运行过程中,包括一处或若干处
随机选择,根据随机值来决定算法的运行;
概率算法的结果不能保证一定是正确的,但
可以限定其出错概率;
概率算法在不同的运行中,对于相同的输入
实例可以有不同的结果,因此,对于相同的 输入实例,概率算法的执行时间可能不同。
16
7.3 舍伍德(Sherwood)算法
地投掷n个点。设落入圆内的点数为k。由于所投入的点
在正方形上均匀分布,因而所投入的点落入圆内的概率
为
r 2
4r 2
4
。所以当n足够大时,k与n之比就逼近这一
n
概率,从而 4k 。
9
double darts(int n) {
// 用随机投点法计算值
int k=0; for (int i=1;i <=n;i++) { double x=random(100)/100.0; double y=random(100)/100.0; if ((x*x+y*y)<=1) k++; } return 4*k/(double)n; random(100)返回[0,99] 之间的整数,(x,y)位于 0..1之间
3
概率算法的基本出发点
将“对于所有合理的输入都必须给出
正确的输出”这个算法性质的条件放
宽,允许算法在执行过程中随机选择
下一步该如何进行,同时允许结果包
含较小的错误概率,并以此为代价, 获得算法运行时间的大幅度减少。
4
例如:判断表达式f(x1, x2, …, xn)是否恒等 于 0。 概率算法首先生成一个随机 n元向量(r1, r2, …, rn),并计算 f(r1, r2, …, rn) 的值:如果 f(r1, r2, …, rn)≠0,则f(x1, x2, …, xn)≠0;如 果f(r1, r2, …, rn)=0,则或者f(x1, x2, …, xn) 恒等于0,或者是(r1, r2, …, rn)比较特殊, 如果这样重复几次,继续得到f(r1, r2, …, rn) =0的结果,那么就可以得出f(x1, x2, …, xn) 恒等于0的结论,并且测试的随机向量越多 ,这个结果出错的可能性就越小。
7.2 数值概率算法
概率算法的一个基本特征是对所求解问
题的同一实例用同一概率算法求解两次
可能得到完全不同的效果。
数值概率算法常用于数值问题的求解。
这类算法所得到的是近似解,且近似解
的来自百度文库度随计算时间的增加不断提高。
8
举例:用随机投点法计算值
设有一半径为r的圆及其外切四边形。向该正方形随机
2
引言
本章将要介绍的概率算法包括: 数值随机化算法:求解数值问题的近似解,精度 随计算时间增加而不断提高。 舍伍德算法: 消除算法最坏情况行为与特定实 例之间的关联性,并不提高平均性能,也不是刻 意避免算法的最坏情况行为。 拉斯维加斯算法:求解问题的正确解,但可能找 不到解。 蒙特卡罗算法: 求解问题的准确解,但这个解 未必正确,且一般情况下无法有效判定正确性。
25
跳跃表(应用于数据结构中)
舍伍德算法的设计思想还可用于设计高效的 数据结构。 如果用有序链表来表示一个含有n个元素的
有序集S,则在最坏情况下,搜索S中一个元素
需要O(n)计算时间。
26
设无序序列T=(r1, r2, …, rn),T的第k(1≤k≤n) 小元素定义为 T 按升序排列后在第 k 个位置上的元素。 给定一个序列 T 和一个整数 k ,寻找 T 的第 k 小元 素的问题称为选择问题。特别地,将寻找第 n/2 小元 素的问题称为中值问题。
直接将算法修改为舍伍德算法
将快速排序算法的基准数选择改为随机 产生,就可消除快速排序的最坏情况(基
本有序),即属于舍伍德算法。
23
线性时间选择算法(预处理)
有时会遇到所给的确定性算法无法直接改造成 舍伍德算法。此时可借助于随机预处理技术, 即:不改变原有的确定性算法,仅对其输入进 行随机排列(称为洗牌),同样可收到舍伍德 算法的效果。
第 7章
概率算法
7.1 随机数 7.2 数值概率算法 7.3 舍伍德算法 7.4 拉斯维加斯算法 7.5 蒙特卡罗算法
1
引言
前面几章所讨论的分治、动态规划、贪心法、回 溯、分支限界等算法的每一计算步骤都是确定的 ,本章所讨论的概率算法允许执行过程中随机选 择下一计算步骤。 在多数情况下,当算法在执行过程中面临一个选 择时,随机性选择常比最优选择省时,因此概率 算法可在很大程度上降低算法复杂性。 概率算法的一个基本特征是对所求解问题的同一 实例用同一概率算法求解两次可能得到完全不同 的效果(所需时间或计算结果)。
17
7.3 舍伍德(Sherwood)算法
舍伍德算法总能求得问题的一个解,且所求解 总是正确的。 当一个确定性算法在最坏情况下的计算复杂性 与在平均情况下的计算复杂性相差较大时,可 在这个确定性算法中引入随机性将其改造成一 个舍伍德算法,消除或减少问题的好坏实例之 间的差别。 舍伍德算法的精髓不是避免算法的最坏情况行 为,而是设法消除这种最坏情况与特定实例之 间的关联性。
分析确定性算法在平均情况下的时间复杂 性时,通常假定算法的输入实例满足某一特定 的概率分布。 事实上,很多算法对于不同的输入实例, 其运行时间差别很大。
例如快速排序算法,若输入实例是等概率 均匀分布,其时间复杂性是 O(nlog2n),若输入 实例基本有序,其时间复杂度是O(n2)。 因此,可以采用舍伍德型概率算法来消除 算法的时间复杂性与输入实例间的这种联系。
14
解非线性方程组
//计算下一个搜索点 for(int i=1; i <= n; i++) x[i] += dx[i]]; //计算目标函数值 fx = f(x,n); } if (fx < epsilon) return true; else return false;
15
概率算法的基本特征
概率算法的输入包括两部分:原问题的输入、
10
}
解非线性方程组
求解下面的非线性方程组
f1 ( x1 , x 2 ,, x n ) 0 f ( x , x ,, x ) 0 2 1 2 n f n ( x1 , x 2 ,, x n ) 0
其中, x1,x2,…,xn 是实变量, fi 是未知量 x1,x2,…,xn 的非线性实函数。要求确定上述方程组在指定求 * * ,, xn 根范围内的一组解 x1* , x2
考虑快速排序中的划分过程,选定一个轴值将序 列ri~rj进行划分,使得比轴值小的元素都位于轴值的 左侧,比轴值大的元素都位于轴值的右侧,假定轴值 的最终位置是s,则: (1)若k=s,则rs就是第k小元素; (2)若k<s,则第k小元素一定在序列ri~rs-1中; (3)若k>s,则第k小元素一定在序列rs+1~rj中;
[ ri … rk … rs-1 ] rs [ rs+1 … … rj ] 均 ≤ rs 轴值 查找这里 均 ≥ rs
[ ri … … rs-1 ] rs [ rs+1 …rk … rj ]
均 ≤ rs 轴值 均 ≥ rs 查找这里
(a) 若k<s,则rk在轴值的前面
(b) 若k>s,则rk在轴值的后面
a0 d a n (ban1 c) modm n 1,2,
其中b0,c0,dm。d称为该随机序列的种子。如何选择b、 c和m直接关系到所产生的随机序列的随机性能,一般情况下m 应选择的大些。 当b、c和m的值确定后,给定一个随机种子,由式产生的随 机数序列也就确定了。 7
13
解非线性方程组
While((min > epsilon)&&(j < Steps)){ //计算随机搜索步长因子 if (fx < min){//搜索成功,增大步长因子 min = fx; a* = k; success = true;} else{//搜索失败,减少步长因子 mm++; if (mm > M) a/= k; success = false;} for (int i = 1; i < n; i++) //计算随机搜索方向和增量 r[i] = 2.0 * rnd.fRandom() – 1; if (success) for(int i=1; i <= n; i++) dx[i] = a * r[i]; else for(int i=1; i <= n; i++) dx[i] = a * r[i];
6[13 19 23 31 35 58]
(a) 以最小值6为轴值,划分不均衡
初始键值序列 6 13 19 23 31 35 58
随机选择一个 记录与6交换
23 13 19 6 31 35 58
一次划分结果 [6 13 19]23[31 35 28] (b) 随机选择轴值,划分均衡 图 一次划分引入随机选择的示例
5
概率算法的适用场合
如果一个问题没有有效的确定性算法可 以在一个合理的时间内给出解答,但可 以接受小概率的错误,就应该采用概率 算法以较快的速度找到问题的解。
6
7.1 随机数
随机数在概率算法设计中扮演着十分重要的角色。实
际上,计算机无法产生真正的随机数,因此在概率算 法中使用的随机数是伪随机数。 线性同余法是产生伪随机数的最常用的方法。由线性 同余法产生的随机序列a0,a1,…,an满足
舍伍德型概率算法在一次划分之前,根据随机数在待划 分序列中随机确定一个记录作为轴值,并把它与第一个记录 交换,则一次划分后得到期望均衡的两个子序列,使得选择 问题在最坏情况下的时间性能趋近于平均情况的时间性能。
算法——选择问题
int Select(int r[ ], int low, int high, int k) { if (high-low<=k) return r[high]; //数组长度小于k else { i=Random(low, high); //在区间[low, high]中随机选取一个元素 r[low]←→r[i]; //交换元素 s=Partition(r, low, high); //进行一次划分,得到轴值的位置s if (k= =s) return r[s]; //元素r[s]就是第k小元素 else if (k>s) return Select(r, low, s-1, k); //在前半部分继续查找 else return Select(r, s+1, high, k); //在后半部分继续查找 }
t B ( x) t A (n) s(n)
这就是舍伍德算法设计的基本思想。当s(n)与 tA(n)相比可忽略时,舍伍德算法可获得很好的
平均性能。
20
舍伍德(Sherwood)算法
举例:
快速排序算法 线性选择时间算法
21
初始键值序列
一次划分结果
6 13 19 23 31 35 58
解非线性方程组
线性化方法
求函数极小值方法
( x) fi ( x)
2
注:一般而言,概率算法费时,但设计思 想简单,易实现。对于精度要求高的问题, 可以提供较好的初值。
12
解非线性方程组
在求根区域D内,选定随机点x0作为随机搜索的出发点。
1. 按照预先选定的分布(正态分布、均匀分布等),逐个 选取随机点xj,计算目标函数,满足精度要求的随机点就 是近似解。 2. 在算法的搜索过程中,假设第j步随机搜索得到的随机搜 索点为 xj 。在第 j+1 步,生成随机搜索方向和步长,计算 出下一步的增量xj。从当前点xj依xj得到第j+1步的随机 搜索点。当Φ(x)<时,取为所求非线性方程组的近似解。 否则进行下一步新的随机搜索过程。
18
设A是一个确定性算法,当它的输入实例为x时
所需的计算时间记为tA (x)。设Xn是算法A的输 入规模为n的实例全体,当问题的输入规模为n 时,算法A所需的平均时间为
t A ( n)
x X n
t
A
( x) / | X n |
19
这显然不能排除存在x∈Xn,使得 t A ( x) t A (n) 的 可能性。希望获得一个概率算法B,使得对问题 的输入规模为n的每一个实例均有
24
例如,对于确定性选择算法,可以用下面的洗 牌算法shuffle,将数组a中元素随机排列,然后 用确定性选择算法求解。这样做所收到的效果 与舍伍德型算法的效果是一样的。 假设输入实例为整型,下面的随机洗牌算法可 在线性时间实现对输入实例的随机排列。
template <class T> void shuffle(T a[ ], int n) { // 随机洗牌算法 for (int i=1;i<n;i++) { int j = random(n-i+1) + i; swap(a, i, j); } }
供算法进行随机选择的随机数序列;
概率算法在运行过程中,包括一处或若干处
随机选择,根据随机值来决定算法的运行;
概率算法的结果不能保证一定是正确的,但
可以限定其出错概率;
概率算法在不同的运行中,对于相同的输入
实例可以有不同的结果,因此,对于相同的 输入实例,概率算法的执行时间可能不同。
16
7.3 舍伍德(Sherwood)算法
地投掷n个点。设落入圆内的点数为k。由于所投入的点
在正方形上均匀分布,因而所投入的点落入圆内的概率
为
r 2
4r 2
4
。所以当n足够大时,k与n之比就逼近这一
n
概率,从而 4k 。
9
double darts(int n) {
// 用随机投点法计算值
int k=0; for (int i=1;i <=n;i++) { double x=random(100)/100.0; double y=random(100)/100.0; if ((x*x+y*y)<=1) k++; } return 4*k/(double)n; random(100)返回[0,99] 之间的整数,(x,y)位于 0..1之间
3
概率算法的基本出发点
将“对于所有合理的输入都必须给出
正确的输出”这个算法性质的条件放
宽,允许算法在执行过程中随机选择
下一步该如何进行,同时允许结果包
含较小的错误概率,并以此为代价, 获得算法运行时间的大幅度减少。
4
例如:判断表达式f(x1, x2, …, xn)是否恒等 于 0。 概率算法首先生成一个随机 n元向量(r1, r2, …, rn),并计算 f(r1, r2, …, rn) 的值:如果 f(r1, r2, …, rn)≠0,则f(x1, x2, …, xn)≠0;如 果f(r1, r2, …, rn)=0,则或者f(x1, x2, …, xn) 恒等于0,或者是(r1, r2, …, rn)比较特殊, 如果这样重复几次,继续得到f(r1, r2, …, rn) =0的结果,那么就可以得出f(x1, x2, …, xn) 恒等于0的结论,并且测试的随机向量越多 ,这个结果出错的可能性就越小。
7.2 数值概率算法
概率算法的一个基本特征是对所求解问
题的同一实例用同一概率算法求解两次
可能得到完全不同的效果。
数值概率算法常用于数值问题的求解。
这类算法所得到的是近似解,且近似解
的来自百度文库度随计算时间的增加不断提高。
8
举例:用随机投点法计算值
设有一半径为r的圆及其外切四边形。向该正方形随机
2
引言
本章将要介绍的概率算法包括: 数值随机化算法:求解数值问题的近似解,精度 随计算时间增加而不断提高。 舍伍德算法: 消除算法最坏情况行为与特定实 例之间的关联性,并不提高平均性能,也不是刻 意避免算法的最坏情况行为。 拉斯维加斯算法:求解问题的正确解,但可能找 不到解。 蒙特卡罗算法: 求解问题的准确解,但这个解 未必正确,且一般情况下无法有效判定正确性。
25
跳跃表(应用于数据结构中)
舍伍德算法的设计思想还可用于设计高效的 数据结构。 如果用有序链表来表示一个含有n个元素的
有序集S,则在最坏情况下,搜索S中一个元素
需要O(n)计算时间。
26
设无序序列T=(r1, r2, …, rn),T的第k(1≤k≤n) 小元素定义为 T 按升序排列后在第 k 个位置上的元素。 给定一个序列 T 和一个整数 k ,寻找 T 的第 k 小元 素的问题称为选择问题。特别地,将寻找第 n/2 小元 素的问题称为中值问题。
直接将算法修改为舍伍德算法
将快速排序算法的基准数选择改为随机 产生,就可消除快速排序的最坏情况(基
本有序),即属于舍伍德算法。
23
线性时间选择算法(预处理)
有时会遇到所给的确定性算法无法直接改造成 舍伍德算法。此时可借助于随机预处理技术, 即:不改变原有的确定性算法,仅对其输入进 行随机排列(称为洗牌),同样可收到舍伍德 算法的效果。
第 7章
概率算法
7.1 随机数 7.2 数值概率算法 7.3 舍伍德算法 7.4 拉斯维加斯算法 7.5 蒙特卡罗算法
1
引言
前面几章所讨论的分治、动态规划、贪心法、回 溯、分支限界等算法的每一计算步骤都是确定的 ,本章所讨论的概率算法允许执行过程中随机选 择下一计算步骤。 在多数情况下,当算法在执行过程中面临一个选 择时,随机性选择常比最优选择省时,因此概率 算法可在很大程度上降低算法复杂性。 概率算法的一个基本特征是对所求解问题的同一 实例用同一概率算法求解两次可能得到完全不同 的效果(所需时间或计算结果)。
17
7.3 舍伍德(Sherwood)算法
舍伍德算法总能求得问题的一个解,且所求解 总是正确的。 当一个确定性算法在最坏情况下的计算复杂性 与在平均情况下的计算复杂性相差较大时,可 在这个确定性算法中引入随机性将其改造成一 个舍伍德算法,消除或减少问题的好坏实例之 间的差别。 舍伍德算法的精髓不是避免算法的最坏情况行 为,而是设法消除这种最坏情况与特定实例之 间的关联性。
分析确定性算法在平均情况下的时间复杂 性时,通常假定算法的输入实例满足某一特定 的概率分布。 事实上,很多算法对于不同的输入实例, 其运行时间差别很大。
例如快速排序算法,若输入实例是等概率 均匀分布,其时间复杂性是 O(nlog2n),若输入 实例基本有序,其时间复杂度是O(n2)。 因此,可以采用舍伍德型概率算法来消除 算法的时间复杂性与输入实例间的这种联系。
14
解非线性方程组
//计算下一个搜索点 for(int i=1; i <= n; i++) x[i] += dx[i]]; //计算目标函数值 fx = f(x,n); } if (fx < epsilon) return true; else return false;
15
概率算法的基本特征
概率算法的输入包括两部分:原问题的输入、
10
}
解非线性方程组
求解下面的非线性方程组
f1 ( x1 , x 2 ,, x n ) 0 f ( x , x ,, x ) 0 2 1 2 n f n ( x1 , x 2 ,, x n ) 0
其中, x1,x2,…,xn 是实变量, fi 是未知量 x1,x2,…,xn 的非线性实函数。要求确定上述方程组在指定求 * * ,, xn 根范围内的一组解 x1* , x2
考虑快速排序中的划分过程,选定一个轴值将序 列ri~rj进行划分,使得比轴值小的元素都位于轴值的 左侧,比轴值大的元素都位于轴值的右侧,假定轴值 的最终位置是s,则: (1)若k=s,则rs就是第k小元素; (2)若k<s,则第k小元素一定在序列ri~rs-1中; (3)若k>s,则第k小元素一定在序列rs+1~rj中;
[ ri … rk … rs-1 ] rs [ rs+1 … … rj ] 均 ≤ rs 轴值 查找这里 均 ≥ rs
[ ri … … rs-1 ] rs [ rs+1 …rk … rj ]
均 ≤ rs 轴值 均 ≥ rs 查找这里
(a) 若k<s,则rk在轴值的前面
(b) 若k>s,则rk在轴值的后面
a0 d a n (ban1 c) modm n 1,2,
其中b0,c0,dm。d称为该随机序列的种子。如何选择b、 c和m直接关系到所产生的随机序列的随机性能,一般情况下m 应选择的大些。 当b、c和m的值确定后,给定一个随机种子,由式产生的随 机数序列也就确定了。 7
13
解非线性方程组
While((min > epsilon)&&(j < Steps)){ //计算随机搜索步长因子 if (fx < min){//搜索成功,增大步长因子 min = fx; a* = k; success = true;} else{//搜索失败,减少步长因子 mm++; if (mm > M) a/= k; success = false;} for (int i = 1; i < n; i++) //计算随机搜索方向和增量 r[i] = 2.0 * rnd.fRandom() – 1; if (success) for(int i=1; i <= n; i++) dx[i] = a * r[i]; else for(int i=1; i <= n; i++) dx[i] = a * r[i];
6[13 19 23 31 35 58]
(a) 以最小值6为轴值,划分不均衡
初始键值序列 6 13 19 23 31 35 58
随机选择一个 记录与6交换
23 13 19 6 31 35 58
一次划分结果 [6 13 19]23[31 35 28] (b) 随机选择轴值,划分均衡 图 一次划分引入随机选择的示例
5
概率算法的适用场合
如果一个问题没有有效的确定性算法可 以在一个合理的时间内给出解答,但可 以接受小概率的错误,就应该采用概率 算法以较快的速度找到问题的解。
6
7.1 随机数
随机数在概率算法设计中扮演着十分重要的角色。实
际上,计算机无法产生真正的随机数,因此在概率算 法中使用的随机数是伪随机数。 线性同余法是产生伪随机数的最常用的方法。由线性 同余法产生的随机序列a0,a1,…,an满足
舍伍德型概率算法在一次划分之前,根据随机数在待划 分序列中随机确定一个记录作为轴值,并把它与第一个记录 交换,则一次划分后得到期望均衡的两个子序列,使得选择 问题在最坏情况下的时间性能趋近于平均情况的时间性能。
算法——选择问题
int Select(int r[ ], int low, int high, int k) { if (high-low<=k) return r[high]; //数组长度小于k else { i=Random(low, high); //在区间[low, high]中随机选取一个元素 r[low]←→r[i]; //交换元素 s=Partition(r, low, high); //进行一次划分,得到轴值的位置s if (k= =s) return r[s]; //元素r[s]就是第k小元素 else if (k>s) return Select(r, low, s-1, k); //在前半部分继续查找 else return Select(r, s+1, high, k); //在后半部分继续查找 }
t B ( x) t A (n) s(n)
这就是舍伍德算法设计的基本思想。当s(n)与 tA(n)相比可忽略时,舍伍德算法可获得很好的
平均性能。
20
舍伍德(Sherwood)算法
举例:
快速排序算法 线性选择时间算法
21
初始键值序列
一次划分结果
6 13 19 23 31 35 58