题目

如下图所示,在一个正方体的铁丝骨架上有只小虫在爬行。小虫从A点出发想要爬到G点,但是由于铁丝非常细,而小虫又看不清楚路,所以小虫的爬行有两个特点:

  • 从铁丝架上的一点到另一点时的过程中不会掉头返回。如从A点至B点,在到达B点前不会掉头;
  • 在某一点向其他方向出发时,选择的方向完全是随机的。如在A点有BDE三个方向,每个方向选择的概率都是三分之一。

问题:小虫平均要经过几个点才能到达点G?

分析

如果直接使用数学计算,我们大概可以使用以下的公式进行计算:

EN=lim⁡n→+∞∑3n(13)nnpn=lim⁡n→+∞∑3nn3npnE_N = \lim_{n \rightarrow +\infty} \sum^{n}_{3} (\frac{1}{3})^nnp_n = \lim_{n \rightarrow +\infty} \sum^{n}_{3} \frac{n}{3^n}p_n EN​=n→+∞lim​3∑n​(31​)nnpn​=n→+∞lim​3∑n​3nn​pn​
其中,ENE_NEN​ 表示平均步数的期望值,nnn表示步长,pnp_npn​表示步长为n 的组合。由于至少要3步才能到达G,所以nnn的下限为3。由于每长一步,概率会变为原来的 13\frac{1}{3}31​,所以系数为 (13)3(\frac{1}{3})^3(31​)3。举例来说,当 n=3n = 3n=3时,系数为 127\frac{1}{27}271​,而所有的组合有6种:[ABCG, ABFG, ADCG, ADHG, AEFG, AEHG],所以步长为 (13)3∗3∗8=89(\frac{1}{3})^3*3*8 = \frac{8}{9}(31​)3∗3∗8=98​。

由于 由于 pnp_npn​ 是常数,而 3n3^n3n 是比 nnn 高阶的无穷大,所以极限收敛。所以结果只可以计算,ENE_NEN​为一个定值。然而,由于无法进行pnp_npn​,即所有的 nnn 的组合的计算,所以很难使用数学方法进行直接计算。因此,我们利用计算机的高速计算能力进行模拟测试,则可以得出大概次数。

算计设计

  • 总体思路
    设计一个选择函数,模拟小虫的一次路径的选择,接着模拟一次小虫子走过的路径,最后进行大量的实验,求出平均值。
  • 具体实现
    首先,使用一个二维数组表示连接关系,使用0-7分别对应A-G,我们可以得到以下的二维数组。
 static int[][] directions = { { 1, 3, 4 }, { 0, 2, 5 }, { 1, 6, 3 },{ 0, 2, 7 }, { 0, 5, 7 }, { 1, 4, 6 },{ 2, 5, 7 }, { 3, 4, 6 } };

这样, directions[0] 表示所对应的一维数组在A点可以选择的三个方向为1,3,4,即A,D,E。以此类推,然后使用随机函数,从三个中选择一个即可。详细代码见附录。

测试

我们使用StringBuilder记录中间的过程,通过在主函数中调用 test(10) ,我们可以得到一个结果如下所示。

Steps: 15    Path: ADHEAEFEAEAEFEFG
Steps: 7    Path: ABABCDHG
Steps: 3    Path: ABFG
Steps: 25   Path: ABAEHDCBCBABADCDADHDHDHDHG
Steps: 3    Path: AEHG
Steps: 15   Path: ABABFEADCBFEHEFG
Steps: 7    Path: ABABFBCG
Steps: 5    Path: AEFBCG
Steps: 3    Path: AEFG
Steps: 3    Path: ABFG

结果与预期的一致。

结论

现在执行附录中的源代码中的主函数,可以得到最终结果:Average steps: 10.0164
即,平均的步数是10步,去除A点和G点,平均要经过的点是8个。

附录:源代码


public class WormSimulation {// 方向选择数组static int[][] directions = { { 1, 3, 4 }, { 0, 2, 5 }, { 1, 6, 3 },{ 0, 2, 7 }, { 0, 5, 7 }, { 1, 4, 6 },{ 2, 5, 7 }, { 3, 4, 6 } };public static void main(String[] args) {int totalSteps = 0;   // 小虫总步长。int totalTimes = 10000; // 测试10000次。for(int i = 0; i < totalTimes; i++)totalSteps+= runOnce(); // 累加每次测试爬过的步数。System.out.println("Average steps: " + (1.0*totalSteps/totalTimes));}// 模拟一次小虫从A到G的过程,返回总用步长。static int runOnce() {int p = 0;int steps = 0;while (p != 6) {p = directions[p][(int) (Math.random() * 3)];steps++;}return steps; }static void test(int times) {for (int i = 0; i < times; i++) {int p = 0;int steps = 0;StringBuilder sb = new StringBuilder();sb.append("A");while (p != 6) {p = directions[p][(int) (Math.random() * 3)];sb.append((char) (p + 65));steps++;}System.out.println("Steps: " + steps + "\tPath: " + sb.toString());}}
}

使用蒙特卡洛技术解决一个小虫爬铁丝问题。相关推荐

  1. 蒙特卡洛能解决啥_用蒙特卡洛方法解决“无法解决”的问题

    蒙特卡洛能解决啥 How do you solve an 'unsolvable' problem? 您如何解决"无法解决"的问题? The worlds of data scie ...

  2. 百度正用谷歌AlphaGo,解决一个比围棋更难的问题 | 300块GPU在燃烧

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 9102年,人类依然不断回想起围棋技艺被AlphaGo所碾压的恐怖. 却也有不以为然的声音:只会下棋的AI,再厉害也还是个运动员啊! 百度 ...

  3. 【机器学习】KNN算法及其用KNN解决字体反爬

    KNN算法及其用KNN解决字体反爬 关于KNN算法 概要 简介 原理 KNN算法Python实现 KNN解决字体反爬 web-font介绍 例子 最后 关于KNN算法 概要 K最近邻(kNN,k-Ne ...

  4. NAT技术解决了IPv4地址短缺的问题,假设内网的地址数是m,而外网地址数n,若mn,则这种技术叫做(66),若mn,且n=1,则这种技术这叫做(67)。【答案】A C

    NAT技术解决了IPv4地址短缺的问题,假设内网的地址数是m,而外网地址数n,若m>n,则这种技术叫做(66),若m>n,且n=1,则这种技术这叫做(67). (66)A.动态地址翻译 B ...

  5. 白话Elasticsearch16-深度探秘搜索技术之使用原生cross-fiedls技术解决搜索弊端

    文章目录 概述 例子 概述 继续跟中华石杉老师学习ES,第15篇 课程地址: https://www.roncoo.com/view/55 白话Elasticsearch14-基于multi_matc ...

  6. 通信网络安全分层及关键技术解决

    通信网络安全分层及关键技术解决 作者: 魏亮 要实现信息化,就必须重视信息网络安全.信息网络安全绝不仅是IT行业的问题,而是一个社会问题,是一个包括多学科的系统安全工程问题,并直接关系到国家安全.因此 ...

  7. 高性能网络开发框架vpp,让你的技术提高一个level

    高性能网络开发框架vpp,让你的技术提高一个level|dpdk解决网卡问题.vpp解决协议栈问题.与k8s集成.tcp, udp,arp,nat协议定制 专注后台服务器开发,包括C/C++,Linu ...

  8. 三屏合一技术 html5,HTML5的跨屏台技术解决了HTML5游戏那些问题!

    原标题: HTML5的跨屏台技术解决了HTML5游戏那些问题! HTML5的跨屏台三屏互动技术解决了HTML5的那些问题!如今,手机页游已经成为了人们娱乐生活的一部分,不管是在大街上还是地铁上我们总能 ...

  9. 应对焦虑的时候,需要学会一次只解决一个问题

    科比说他见过洛杉矶凌晨4点的样子,我没见过,但我见过上海凌晨4点的样子,因为那时候我还没睡. 不是因为在工作,而是因为我焦虑,睡不着. 毕业那年,在没有任何实习经历的情况下找工作,所以第一份工作找得不 ...

最新文章

  1. Java开发人员 2019 生态系统信息图
  2. win下打包成tar.gz
  3. 音频管理_人力资源管理师考试历年真题试卷+视频教程+音频讲义合集分享
  4. DVWA--Brute Force(暴力破解)--四个等级
  5. 从小害怕数学的他,却成为了科普数学教育的数学家
  6. 前端学习(1874)vue之电商管理系统电商系统之修改element-ui组件的按需导入
  7. Java集合容器面试题
  8. 【BZOJ2243】 [SDOI2011]染色
  9. oracle重建orainventory,数据库重建oraInventory
  10. 双11数据过于完美涉嫌造假?天猫:造谣要负法律责任的哦
  11. 前端—每天5道面试题(十)
  12. python程序打包exe
  13. ps、ai、cdr2021平面设计三大软件的区别有哪些?
  14. [Zer0pts2020]ROR1
  15. 哨兵1号数据、精密轨道数据、DEM数据下载
  16. c++实现串口功能之termios.h头文件研读<一>
  17. PHP写评论模块,uchome2.0 日志评论模块分析(php代码及js代码分析)
  18. 解决0xc00d5212
  19. 一种video视频兼容IE的模式
  20. win10网络共享打印机设置

热门文章

  1. 那些花儿!吉他简谱~
  2. 学校计算机教室报损登记本,平阴县中小学功能室管理基本要求
  3. 解决Ubuntu apt安装时连接超时Connection timed out [IP: 2001:67c:1562::16 80]
  4. 上海高考物理能不能用计算机,上海高考再放大招!选物理再也不会吃亏了
  5. 诺贝尔奖得主罗伯特·莫顿—唯有信任,方得科技创新
  6. Quartz中Triggers介绍
  7. 为知所见即所得MarkDown插件
  8. javascript 获取网页地址(url)
  9. 实习纪实——1.31记
  10. 微信公众平台开发教程第2篇-----微信开发者接入