0047算法笔记——【随机化算法】拉斯维加斯(Las Vegas)算法和n后问题.docx_第1页
0047算法笔记——【随机化算法】拉斯维加斯(Las Vegas)算法和n后问题.docx_第2页
0047算法笔记——【随机化算法】拉斯维加斯(Las Vegas)算法和n后问题.docx_第3页
0047算法笔记——【随机化算法】拉斯维加斯(Las Vegas)算法和n后问题.docx_第4页
0047算法笔记——【随机化算法】拉斯维加斯(Las Vegas)算法和n后问题.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、拉斯维加斯(Las Vegas)算法 拉斯维加斯算法不会得到不正确的解。一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。但有时用拉斯维加斯算法找不到解。与蒙特卡罗算法类似,拉斯维加斯算法找到正确解的概率随着它所用的计算时间的增加而提高。对于所求解问题的任一实例,用同一拉斯维加斯算法反复对该实例求解足够多次,可使求解失败的概率任意小。拉斯维加斯算法的一个显著特征是它所作的随机性决策有可能导致算法找不到所需的解。cppview plaincopy1. voidobstinate(Objectx,Objecty)2. /反复调用拉斯维加斯算法LV(x,y),直到找到问题的一个解y3. boolsuccess=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后问题 问题描速:在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 1)纯拉斯维加斯随机算法求解思路 对于n后问题的任何一个解而言,每一个皇后在棋盘上的位置无任何规律,不具有系统性,而更象是随机放置的。在棋盘上相继的各行中随机地放置皇后,并注意使新放置的皇后与已放置的皇后互不攻击,直至n个皇后均已相容地放置好,或已没有下一个皇后的可放置位置时为止。 具体实现代码如下: 1、RandomNumber.hcppview plaincopy1. #includetime.h2. /随机数类3. constunsignedlongmaxshort=65536L;4. constunsignedlongmultiplier=1194211693L;5. constunsignedlongadder=12345L;6. 7. classRandomNumber8. 9. private:10. /当前种子11. unsignedlongrandSeed;12. public:13. RandomNumber(unsignedlongs=0);/构造函数,默认值0表示由系统自动产生种子14. unsignedshortRandom(unsignedlongn);/产生0:n-1之间的随机整数15. doublefRandom(void);/产生0,1)之间的随机实数16. ;17. 18. RandomNumber:RandomNumber(unsignedlongs)/产生种子19. 20. if(s=0)21. 22. randSeed=time(0);/用系统时间产生种子23. 24. else25. 26. randSeed=s;/由用户提供种子27. 28. 29. 30. unsignedshortRandomNumber:Random(unsignedlongn)/产生0:n-1之间的随机整数31. 32. randSeed=multiplier*randSeed+adder;/线性同余式33. return(unsignedshort)(randSeed16)%n);34. 35. 36. doubleRandomNumber:fRandom(void)/产生0,1)之间的随机实数37. 38. returnRandom(maxshort)/double(maxshort);39. 2、7d4d1.cppcppview plaincopy1. /随机化算法拉斯维加斯算法n后问题2. #includestdafx.h3. #includeRandomNumber.h4. #include5. #include6. usingnamespacestd;7. 8. classQueen9. 10. friendvoidnQueen(int);11. private:12. boolPlace(intk);/测试皇后k置于第xk列的合法性13. boolQueensLv(void);/随机放置n个皇后拉斯维加斯算法14. intn;/皇后个数15. int*x,*y;/解向量16. ;17. 18. /测试皇后k置于第xk列的合法性19. boolQueen:Place(intk)20. 21. for(intj=1;jk;j+)22. 23. if(abs(k-j)=abs(xj-xk)|(xj=xk)24. 25. returnfalse;26. 27. 28. returntrue;29. 30. 31. /随机放置n个皇后的拉斯维加斯算法32. boolQueen:QueensLv(void)33. 34. RandomNumberrnd;/随机数产生器35. intk=1;/下一个皇后的编号36. intcount=1;/在一列中,可以放置皇后的个数37. 38. while(k0)39. 40. count=0;41. for(inti=1;i0)50. 51. xk+=yrnd.Random(count);/随机位置52. 53. 54. 55. return(count0);/count0表示放置成功56. 57. 58. /解n后问题的拉斯维加斯算法59. voidnQueen(intn)60. 61. QueenX;62. X.n=n;63. 64. int*p=newintn+1;65. for(inti=0;i=n;i+)66. 67. pi=0;68. 69. X.x=p;70. X.y=newintn+1;71. 72. /反复调用随机放置n个皇后的拉斯维加斯算法,直到放置成功73. while(!X.QueensLv();74. 75. for(inti=1;i=n;i+)76. 77. coutpi;78. 79. coutendl;80. deletep;81. 82. 83. intmain()84. 85. intn=8;86. coutn皇后问题的解为:endl;87. nQueen(n);88. return0;89. 程序运行结果如下: 2)与回溯法结合的拉斯维加斯随机算法求解思路 如果将上述随机放置策略与回溯法相结合,可能会获得更好的效果。可以先在棋盘的若干行中随机地放置皇后,然后在后继行中用回溯法继续放置,直至找到一个解或宣告失败。随机放置的皇后越多,后继回溯搜索所需的时间就越少,但失败的概率也就越大。 算法具体代码如下: 1、RandomNumber.h如上 2、7d4d1-2.cppcppview plaincopy1. /随机化算法拉斯维加斯算法n后问题2. #includestdafx.h3. #includeRandomNumber.h4. #include5. #include6. usingnamespacestd;7. 8. classQueen9. 10. friendboolnQueen(int);11. private:12. boolPlace(intk);/测试皇后k置于第xk的合法性13. boolBacktrack(intt);/解n后问题的回溯法14. boolQueensLV(intstopVegas);/随机放置n个皇后拉斯维加斯算法15. intn,*x,*y;16. ;17. 18. /测试皇后k置于第xk列的合法性19. boolQueen:Place(intk)20. 21. for(intj=1;jn)35. 36. for(inti=1;i=n;i+)37. 38. yi=xi;/问题的解39. 40. returntrue;41. 42. else43. 44. for(inti=1;i=n;i+)45. 46. xt=i;47. if(Place(t)&Backtrack(t+1)48. 49. returntrue;50. 51. 52. 53. returnfalse;54. 55. 56. 57. /随机放置n个皇后拉斯维加斯算法58. boolQueen:QueensLV(intstopVegas)59. 60. RandomNumberrnd;/随机数产生器61. intk=1;62. intcount=1;63. 64. /1=stopVegas=n65. while(k0)66. 67. count=0;68. for(inti=1;i0)78. 79. xk+=yrnd.Random(count);/随机位置80. 81. 82. return(count0);/count0表示放置成功83. 84. 85. /与回溯法相结合的解n后问题的拉斯维加斯算法86. boolnQueen(intn)87. 88. QueenX;89. 90. /初始化X91. X.n=n;92. 93. int*p=newintn+1;94. int*q=newintn+1;95. 96. for(inti=0;i15)107. 108. stop=n-15;109. 110. 111. boolfound=false;112. while(!X.QueensLV(stop);113. 114. /算法的回溯搜索部分115. if(X.Backtrack(stop+1)116. 117. for(inti=1;i=n;i+)118.

温馨提示

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

评论

0/150

提交评论