“肥皂泡”问题来源于Reinforcement Learning: An Introduction(2017). Exercise 5.2,大致的描述如下:

用一个铁丝首尾相连组成闭合曲线,浸入肥皂泡液,拿起后,可以发现肥皂泡液以这个闭合曲线为边界形成了一个曲面。如何将这个曲面描述出来,便是肥皂泡问题的核心。

若想使得肥皂泡液形成一个稳固的曲面,肥皂泡上的每一个点所受到的合力均为0,所以这意味着该点所处的位置是周边所有点位置的均值(在这里忽略重力的影响,肥皂泡的密度量级与空气相当)。所以在计算曲面时,可以先将闭合曲线投影到x-y平面上,然后用一个点的高度(坐标z)来表示曲面上该点周边所有点位置的均值(该点位置的x,y值是不变的)。

常用的方法是迭代法,依次迭代求解投影到x-y平面上的闭合曲线包围的点的高度值。不过当计算某一个或某几个点的高度时可以使用Monte Carlo Method提高计算效率。

先来尝试一下迭代法求解,这里直接给出算法流程:

  1. 投影闭合曲线到x-y平面
  2. 从闭合曲线内的第一个点开始迭代
  3. 当前被迭代的点在x-y平面上的位置为(x, y),则高度hight,$ H(x, y) $可用该公式计算:$$ H(x, y) = \frac{1}{4}(H(x + 1, y) + H(x - 1, y) + H(x, y + 1) + H(x, y - 1)) $$
  4. 到达闭合曲线内的最后一个点,判断高度$ H $是否收敛,如未收敛继续迭代。

我们用这个闭合曲线作为实验对象:

计算得到的曲面图形如下:

迭代法有一个缺陷在于,如果需要计算某一点的高度,则必须计算曲面上所有点的高度。对于只是计算某一点的情况,这个方法无疑是效率低下的。在这种情况下,Monte Carlo Method提供了一种非常高效的计算方案。这里可以运用Monte Carlo方法前提是,曲面上某个点的高度可以等效为边界所有点的高度相关于与之距离的加权平均。所以使用Monte Carlo的关键在于,以需要计算的那一点为起始点,开始随机游走,碰到边界上某个点的概率与起始点和该点的距离相关,距离近则概率高,距离远则概率低。在随机游走的过程中,将所碰到的边界点的高度取平均数,即为起始点高度的估计。Monte Carlo Method的算法流程如下:

  1. 投影闭合曲线到x-y平面
  2. 确定起始点(x, y),开始迭代
  3. 随机选择动作开始游走
  4. 判断是否碰到边界,如碰到边界,记录边界高度值$ H_b $。未碰到则继续游走。
  5. 判断是否收敛,未收敛则回到第三步重新开始。
  6. 起始点高度值的估计可以计算为(Num为迭代次数):$$ H(x, y) = \frac{\sum H_b}{Num} $$

可以比较一下两种方法的高度值收敛曲线,以坐标(10, 10)为例:

可以发现在计算坐标(10, 10)的高度值时,Monte Carlo Method的收敛速度比Iteration Method快很多,但准确度却要差一些。

【RL系列】蒙特卡罗方法——Soap Bubble的更多相关文章

  1. 【RL系列】从蒙特卡罗方法步入真正的强化学习

    蒙特卡罗方法给我的感觉是和Reinforcement Learning: An Introduction的第二章中Bandit问题的解法比较相似,两者皆是通过大量的实验然后估计每个状态动作的平均收益. ...

  2. 【RL系列】马尔可夫决策过程——状态价值评价与动作价值评价

    请先阅读上两篇文章: [RL系列]马尔可夫决策过程中状态价值函数的一般形式 [RL系列]马尔可夫决策过程与动态编程 状态价值函数,顾名思义,就是用于状态价值评价(SVE)的.典型的问题有“格子世界(G ...

  3. 【RL系列】马尔可夫决策过程中状态价值函数的一般形式

    请先阅读上一篇文章:[RL系列]马尔可夫决策过程与动态编程 在上一篇文章里,主要讨论了马尔可夫决策过程模型的来源和基本思想,并以MAB问题为例简单的介绍了动态编程的基本方法.虽然上一篇文章中的马尔可夫 ...

  4. 【RL系列】Multi-Armed Bandit笔记——UCB策略与Gradient策略

    本篇主要是为了记录UCB策略与Gradient策略在解决Multi-Armed Bandit问题时的实现方法,涉及理论部分较少,所以请先阅读Reinforcement Learning: An Int ...

  5. 增强学习(四) ----- 蒙特卡罗方法(Monte Carlo Methods)

    1. 蒙特卡罗方法的基本思想 蒙特卡罗方法又叫统计模拟方法,它使用随机数(或伪随机数)来解决计算的问题,是一类重要的数值计算方法.该方法的名字来源于世界著名的赌城蒙特卡罗,而蒙特卡罗方法正是以概率为基 ...

  6. VMware Workstation 精致汉化系列 使用方法

    http://kuai.xunlei.com/d/QqGABAKChQBwMzxR983   迅雷快传 XP系统之家-温馨提示: VMware Workstation 精致汉化系列 使用方法:1.安装 ...

  7. MCMC(一)蒙特卡罗方法

    MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链(待填坑) MCMC(三)M-H采样和Gibbs采样(待填坑) 作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Ca ...

  8. 蒙特卡罗方法 python 实现2

    如果不考虑作图,这里的两个例子可以改写成下面的样子: 求圆周率 import random ''' 蒙特卡罗模拟 投点法计算圆周率 ''' # 投点游戏 def play_game(): # 圆 r ...

  9. 蒙特卡罗方法 python 实现

    蒙特卡罗(Monte Carlo)方法的精髓:用统计结果去计算频率,从而得到真实值的近似值. 一.求圆周率的近似值,采用 投点法 import numpy as np import matplotli ...

随机推荐

  1. React Native获取组件位置和大小

    RN页面中定位或滚动操作时,需要获取元素的大小和位置信息,有几种常用的方法 获取设备屏幕的宽高 import {Dimensions} from 'react-native'; var {height ...

  2. package-lock.json 作用

    package.json里面定义的是版本范围(比如^1.0.0),具体跑npm install的时候安的什么版本,要解析后才能决定,这里面定义的依赖关系树,可以称之为逻辑树(logical tree) ...

  3. activeMQ的高级特性:嵌入activemq

    activemq的高级特性之嵌入式activemq 1:编写activeMQ服务 import org.apache.activemq.broker.BrokerService; import org ...

  4. 偏前端 - div+mui+vue.js 制作问卷调查单页 ——题目答案由后台随机给出10道

    封装的ajax获取数据.代码可能有些是多余的,没做处理!!点击提交后有弹框,在这里我没有贴出来.第一次写博客,这些也是别人教我的,经理解后,贴出来于大家分享 ——html—— <script t ...

  5. vue bus方式解决非父子组件间的传值

    对于非父子组件之间的传值 通常使用VUEX 和总线等方式解决 这里我聊聊发布订阅模式(总线) <body> <div class="app"> <ch ...

  6. php计算上个月是几月份

    PHP计算上个月的时间, $date = date("Y-m-d"); $arr = explode('-',$date); foreach ($arr as $key=>$ ...

  7. BigData:值得了解的十大数据发展趋势

    当今,世界无时无刻不在发生着变化.对于技术领域而言,普遍存在的一个巨大变化就是为大数据(Big data)打开了大门,并应用大数据技相关技术来改善各行业的业务并促进经济的发展.目前,大数据的作用已经上 ...

  8. python-类(1)

    ·类(Class) 笔记: Python是一种面向对象(Object Oriented)的编程语言,类(Class)是Python的核心概念.在Python中,不管是列表.字符串.函数和类都是对象. ...

  9. Asp.Net实现在线人数统计 (转)

    原文件:http://blog.csdn.net/wxd_860825/article/details/4589292 利用Application对象和Session对象可以统计当前在线用户数量. 注 ...

  10. Kali linux更新源

    1.更新软件源: 修改sources.list文件: leafpad /etc/apt/sources.list 然后选择添加以下适合自己较快的源(可自由选择,不一定要全部): #官方源deb htt ...