实验6 概率算法Probabilistic algorithm.docx
- 文档编号:29623264
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:19
- 大小:47.02KB
实验6 概率算法Probabilistic algorithm.docx
《实验6 概率算法Probabilistic algorithm.docx》由会员分享,可在线阅读,更多相关《实验6 概率算法Probabilistic algorithm.docx(19页珍藏版)》请在冰豆网上搜索。
实验6概率算法Probabilisticalgorithm
实验6.概率算法Probabilisticalgorithm
一、实验目的
1.理解概率算法的基本思想。
2.掌握概率算法的简单应用。
二、实验环境与地点
1.实验环境:
Windows7,Eclipse
2.实验地点:
网络工程实验室
三、实验内容与步骤
编写程序完成下列题目,上机调试并运行成功。
1.用随机投点法计算π值。
设有一半径为r的圆及其外切四边形。
向该正方形随机地投掷n个点。
设落入圆内的点数为k。
由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为
。
所以当n足够大时,k与n之比就逼近这一概率
。
从而
.在具体实现时,只要在第一象限计算.
算法:
publicstaticdoubledarts(intn){//用随机投点法计算π值
longk=0;
for(inti=1;i<=n;i++){
doublex=dart.fRandom();
doubley=dart.fRandom();
if((x*x+y*y)<=1)
k++;
}
return4*k/(double)n;
}
算法用到的随机数类:
classRandom{
privatelongseed;//当前种子
privatefinalstaticlongmultiplier=0x5DEECE66DL;
privatefinalstaticlongadder=0xBL;
privatefinalstaticlongmask=(1L<<48)-1;
//构造方法,自动产生种子
publicRandom(){
this.seed=System.currentTimeMillis();
}
//构造方法,缺省值0表示由系统自动产生种子
publicRandom(longseed){
if(seed==0)
this.seed=System.currentTimeMillis();
else
this.seed=seed;
}
//产生[0,n-1]之间的随机整数
publicintrandom(intn){
if(n<=0)
thrownewIllegalArgumentException("nmustbepositive");
seed=(seed*multiplier+adder)&mask;
return((int)(seed>>>17)%n);
}
//产生[0,1]之间的随机实数
publicdoublefRandom(){
returnrandom(Integer.MAX_VALUE)/(double)(Integer.MAX_VALUE);
}
}
要求:
编写main方法,计算π值,观察当n=1千万、n=1亿、n=10亿时,π的精确度。
2.用随机投点法计算定积分:
设f(x)是[0,1]上的连续函数,且0f(x)1。
需要计算的积分为
积分I等于图中的面积G。
在图所示单位正方形内均匀地作投点试验,则随机点落在曲线下面的概率为
假设向单位正方形内随机地投入n个点(xi,yi)。
如果有k个点落入G内,则随机点落入G内的概率
由此可设计出计算积分
的数值概率算法。
publicstaticdoubledarts1(intn){//用随机投点法计算定积分
longk=0;
for(inti=1;i<=n;i++){
doublex=dart.fRandom();
doubley=dart.fRandom();
if(y<=f(x))
k++;
}
returnk*4/(double)n;
}
要求:
编写main方法,计算
值。
,观察当n=1千万、n=1亿、n=10亿时,π的精确度。
3.用拉斯维加斯算法求解八皇后问题的一个解。
对于8后问题的任何一个解而言,每一个皇后在棋盘上的位置无任何规律,不具有系统性,而更象是随机放置的。
由此容易想到下面的拉斯维加斯算法。
在棋盘上相继的各行中随机地放置皇后,并注意使新放置的皇后与已放置的皇后互不攻击,直至n个皇后均已相容地放置好,或已没有下一个皇后的可放置位置时为止。
具体算法可描述如下。
类LVQueen的数据成员n表示皇后个数,数组x存储n后问题的解。
publicclassLVQueen{
staticRandomrnd;//随机数产生器
staticintn=8;//皇后个数
staticint[]x;//解向量
}
方法
用于测试将皇后
置于第
列的合法性。
privatestaticbooleanplace(intk){
//测试皇后k置于第x[k]列的合法性
for(intj=1;j if((Math.abs(k-j)==Math.abs(x[j]-x[k]))||(x[j]==x[k])) returnfalse; returntrue; } 方法queensLV()实现在棋盘上随机放置 个皇后的拉斯维加斯算法。 privatestaticbooleanqueensLV(){ //随机放置n个皇后的拉斯维加斯算法 rnd=newRandom();//初始化随机数 intk=1;//下一个放置的皇后编号 intcount=1; while((k<=n)&&(count>0)){ count=0; intj=0; for(inti=1;i<=n;i++){ x[k]=i; if(place(k)) if(rnd.random(++count)==0) j=i;//随机位置 } if(count>0) x[k++]=j; } return(count>0);//count>0表示放置成功 } 可以通过反复调用随机放置 个皇后的拉斯维加斯算法queensLV(),直至找到 后问题的一个解。 publicstaticvoidnQueen(){ //解n后问题的拉斯维加斯算法 //初始化x x=newint[n+1]; for(inti=0;i<=n;i++) x[i]=0; //反复调用随机放置n个皇后的拉斯维加斯算法,直至放置成功 while(! queensLV()); } 上述算法一旦发现无法再放置下一个皇后,就全部重新开始,这似乎过于悲观。 如果将上述随机放置策略与回溯法相结合,可能会获得更好的效果。 可以先在棋盘的若干行中随机地放置皇后,然后在后继行中用回溯法继续放置,直至找到一个解或宣告失败。 随机放置的皇后越多,后继回溯搜索所需的时间就越少,但失败的概率也就越大。 与回溯法相结合的解n后问题的拉斯维加斯算法描述如下: publicclassLVQueen1{ staticRandomrnd; staticintn; staticint[]x; staticint[]y; } 方法 用于测试将皇后 置于第 列的合法性。 方法 是解 后问题的回溯法。 privatestaticbooleanplace(intk){ //测试皇后k置于第x[k]列的合法性 for(intj=1;j if((Math.abs(k-j)==Math.abs(x[j]-x[k]))||(x[j]==x[k])) returnfalse; returntrue; } privatestaticvoidbacktrack(intt){//解n后问题的回溯法 if(t>n){ for(inti=1;i<=n;i++) y[i]=x[i]; return; }else for(inti=1;i<=n;i++){ x[t]=i; if(place(t)) backtrack(t+1); } } 方法queensLV(stopVegas)实现在棋盘上随机放置若干个皇后的拉斯维加斯算法。 其中, 表示随机放置的皇后数。 privatestaticbooleanqueensLV(intstopVegas){ //随机放置n个皇后拉斯维加斯算法 rnd=newRandom();//初始化随机数 intk=1;//下一个放置的皇后编号 intcount=1; //1<=stopVegas<=n表示允许随机放置的皇后数 while((k<=stopVegas)&&(count>0)){ count=0; intj=0; for(inti=1;i<=n;i++){ x[k]=i; if(place(k)) if(rnd.random(++count)==0) j=i;//随机位置 } if(count>0) x[k++]=j; } return(count>0);//count>0表示放置成功 } 算法的回溯搜索部分与解 后问题的回溯法是类似的,所不同的是这里只要找到一个解就可以了。 publicstaticvoidnQueen(intstop){ //与回溯法相结合的解n后问题的拉斯维加斯算法 x=newint[n+1]; y=newint[n+1]; for(inti=0;i<=n;i++){ x[i]=0; y[i]=0; } while(! queensLV(stop)); //算法的回溯搜索部分 backtrack(stop+1); } 要求: 编写main方法,完成求解8皇后问题的一个解。 观察运行结果,比较两种方法的优劣。 四、实验总结与分析 参考代码: 1.-2 publicclassRandomPi{ staticRandomdart=newRandom(); publicstaticdoubledarts(intn){//用随机投点法计算π值 longk=0; for(inti=1;i<=n;i++){ doublex=dart.fRandom(); doubley=dart.fRandom(); if((x*x+y*y)<=1) k++; } return4*k/(double)n; } publicstaticdoubledarts1(intn){//用随机投点法计算定积分 longk=0; for(inti=1;i<=n;i++){ doublex=dart.fRandom(); doubley=dart.fRandom(); if(y<=f(x)) k++; } returnk*4/(double)n; } privatestaticdoublef(doublex){ //TODOAuto-generatedmethodstub returnMath.sqrt(1-x*x); } publicstaticvoidmain(String[]args){ System.out.println(darts(10_0000_0000)); System.out.println(darts1(10_0000_0000)); } } classRandom{ privatelongseed;//当前种子 privatefinalstaticlongmultiplier=0x5DEECE66DL; privatefinalstaticlongadder=0xBL; privatefinalstaticlongmask=(1L<<48)-1; //构造方法,自动产生种子 publicRandom(){ this.seed=System.currentTimeMillis(); } //构造方法,缺省值0表示由系统自动产生种子 publicRandom(longseed){ if(seed==0) this.seed=System.currentTimeMillis(); else this.seed=seed; } //产生[0,n-1]之间的随机整数 publicintrandom(intn){ if(n<=0) thrownewIllegalArgumentException("nmustbepositive"); seed=(seed*multiplier+adder)&mask; return((int)(seed>>>17)%n); } //产生[0,1]之间的随机实数 publicdoublefRandom(){ returnrandom(Integer.MAX_VALUE)/(double)(Integer.MAX_VALUE); } } 3. publicclassLVQueen{ staticRandomrnd;//随机数产生器 staticintn=8;//皇后个数 staticint[]x;//解向量 privatestaticbooleanplace(intk){//测试皇后置于第x[k]列的合法性 for(intj=1;j if((Math.abs(k-j)==Math.abs(x[j]-x[k]))||(x[j]==x[k])) returnfalse; returntrue; } privatestaticbooleanqueensLV(){//随机放置n个皇后的拉斯维加斯算法 rnd=newRandom();//初始化随机数 intk=1;//下一个放置的皇后编号 intcount=1; while((k<=n)&&(count>0)){ count=0; intj=0; for(inti=1;i<=n;i++){ x[k]=i; if(place(k)){ intkk=rnd.random(++count); System.out.print(""+kk); if(kk==0) j=i;//随机位置 } } System.out.println(); if(count>0) x[k++]=j; } return(count>0);//count>0表示放置成功 } publicstaticvoidnQueen(){//解n后问题的拉斯维加斯算法 //初始化x x=newint[n+1]; for(inti=0;i<=n;i++) x[i]=0; //反复调用随机放置n个皇后的拉斯维加斯算法,直至放置成功 while(! queensLV()); } publicstaticvoidmain(String[]args){ longa=System.currentTimeMillis(); nQueen(); for(inti=1;i System.out.print(x[i]+""); } longb=System.currentTimeMillis(); System.out.println("\n"+(b-a)); } } classRandom{ privatelongseed;//当前种子 privatefinalstaticlongmultiplier=0x5DEECE66DL; privatefinalstaticlongadder=0xBL; privatefinalstaticlongmask=(1L<<48)-1; //构造方法,自动产生种子 publicRandom(){ this.seed=System.currentTimeMillis(); } //构造方法,缺省值0表示由系统自动产生种子 publicRandom(longseed){ if(seed==0) this.seed=System.currentTimeMillis(); else this.seed=seed; } //产生[0,n-1]之间的随机整数 publicintrandom(intn){ if(n<=0) thrownewIllegalArgumentException("nmustbepositive"); seed=(seed*multiplier+adder)&mask; return((int)(seed>>>17)%n); } //产生[0,1]之间的随机实数 publicdoublefRandom(){ returnrandom(Integer.MAX_VALUE)/(double)(Integer.MAX_VALUE); } } publicclassLVQueen1{ staticRandomrnd; staticintn=8; staticint[]x; staticint[]y; privatestaticbooleanplace(intk){//测试皇后k置于第x[k]列的合法性 for(intj=1;j if((Math.abs(k-j)==Math.abs(x[j]-x[k]))||(x[j]==x[k])) returnfalse; returntrue; } privatestaticvoidoutput(int[]x){ //TODOAuto-generatedmethodstub //System.out.print(sum+": "); for(inti=1;i System.out.print(x[i]+""); } System.out.println(); } privatestaticvoidbacktrack(intt){//解n后问题的回溯法 if(t>n){ for(inti=1;i<=n;i++) y[i]=x[i]; output(y); return; }else for(inti=1;i<=n;i++){ x[t]=i; if(place(t)) backtrack(t+1); } } privatestaticbooleanqueensLV(intstopVegas){ //随机放置n个皇后拉斯维加斯算法 rnd=newRandom();//初始化随机数 intk=1;//下一个放置的皇后编号 intcount=1; //1<=stopVegas<=n表示允许随机放置的皇后数 while((k<=stopVegas)&&(count>0)){ count=0; intj=0; for(inti=1;i<=n;i++){ x[k]=i; if(place(k)) if(rnd.random(++count)==0) j=i;//随机位置 } if(count>0) x[k++]=j; } return(count>0);//count>0表示放置成功 } publicstaticvoidnQueen(intstop){ //与回溯法相结合的解n后问题的拉斯维加斯算法 x=newint[n+1]; y=newint[n+1]; for(inti=0;i<=n;i++){ x[i]=0; y[i]=0; } while(! queensLV(stop)); //算法的回溯搜索部分 backtrack(stop+1); } publicstaticvoidmain(String[]args){ nQueen (2); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验6 概率算法Probabilistic algorithm 实验 概率 算法 Probabilistic