0047算法笔记——【随机化算法】拉斯维加斯(Las Vegas)算法和n后问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、拉斯维加斯(Las Vegas)算法
拉斯维加斯算法不会得到不正确的解。一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。但有时用拉斯维加斯算法找不到解。与蒙特卡罗算法类似,拉斯维加斯算法找到正确解的概率随着它所用的计算时间的增加而提高。对于所求解问题的任一实例,用同一拉斯维加斯算法反复对该实例求解足够多次,可使求解失败的概率任意小。拉斯维加斯算法的一个显著特征是它所作的随机性决策有可能导致算法找不到所需的解。
[cpp]view plain copy
1.void obstinate(Object x, Object y)
2.{// 反复调用拉斯维加斯算法LV(x,y),直到找到问题的一个解y
3.bool success= false;
4.while (!success) success=lv(x,y);
5.}
设p(x)是对输入x调用拉斯维加斯算法获得问题的一个解的概率。一个正确的拉斯维加斯算法应该对所有输入x均有p(x)>0。设t(x)是算法obstinate找到具体实例x的一个解所需的平均时间,s(x)和e(x)分别是算法对于具体实例x求解成功或求解失败所需的平均时间,则有
。解此方程得:
2、n后问题
问题描速:在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的
棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
1)纯拉斯维加斯随机算法求解思路
对于n后问题的任何一个解而言,每一个皇后在棋盘上的位置无任何规律,不具有系统性,而更象是随机放置的。在棋盘上相继的各行中随机地放置皇后,并注意使新放置的皇后与已放置的皇后互不攻击,直至n个皇后均已相容地放置好,或已没有下一个皇后的可放置位置时为止。
具体实现代码如下:
1、RandomNumber.h
[cpp]view plain copy
1.#include"time.h"
2.//随机数类
3.const unsigned long maxshort = 65536L;
4.const unsigned long multiplier = 1194211693L;
5.const unsigned long adder = 12345L;
6.
7.class RandomNumber
8.{
9.private:
10.//当前种子
11. unsigned long randSeed;
12.public:
13. RandomNumber(unsigned long s = 0);//构造函数,默认值0表示由系统自动产生
种子
14. unsigned short Random(unsigned long n);//产生0:n-1之间的随机整数
15.double fRandom(void);//产生[0,1)之间的随机实数
16.};
17.
18.RandomNumber::RandomNumber(unsigned long s)//产生种子
19.{
20.if(s == 0)
21. {
22. randSeed = time(0);//用系统时间产生种子
23. }
24.else
25. {
26. randSeed = s;//由用户提供种子
27. }
28.}
29.
30.unsigned short RandomNumber::Random(unsigned long n)//产生0:n-1之间的随机整
数
31.{
32. randSeed = multiplier * randSeed + adder;//线性同余式
33.return (unsigned short)((randSeed>>16)%n);
34.}
35.
36.double RandomNumber::fRandom(void)//产生[0,1)之间的随机实数
37.{
38.return Random(maxshort)/double(maxshort);
39.}
2、7d4d1.cpp
[cpp]view plain copy
1.//随机化算法拉斯维加斯算法 n后问题
2.#include "stdafx.h"
3.#include "RandomNumber.h"
4.#include
5.#include
ing namespace std;
7.
8.class Queen
9.{
10.friend void nQueen(int);
11.private:
12.bool Place(int k); //测试皇后k置于第x[k]列的合法性
13.bool QueensLv(void); //随机放置n个皇后拉斯维加斯算法
14.int n; //皇后个数
15.int *x,*y; //解向量
16.};
17.
18.//测试皇后k置于第x[k]列的合法性
19.bool Queen::Place(int k)
20.{
21.for(int j=1; j 22. { 23.if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) 24. { 25.return false; 26. } 27. } 28.return true; 29.} 30. 31.//随机放置n个皇后的拉斯维加斯算法 32.bool Queen::QueensLv(void) 33.{ 34. RandomNumber rnd; //随机数产生器 35.int k = 1; //下一个皇后的编号 36.int count = 1; //在一列中,可以放置皇后的个数 37. 38.while((k<=n)&&(count>0)) 39. { 40. count = 0; 41.for(int i=1; i<=n; i++) 42. { 43. x[k] = i;//位置 44.if(Place(k)) 45. { 46. y[count++] = i; 47. } 48. } 49.if(count>0)