蒙特卡洛法
在实际过程中,有的算法不能保证每次都能的到正确的解.蒙特卡洛算法则是在一般情况下可以保证对问题的所有实例都以高概率给出正确解,但是通常无法判定一个具体解是否正确.
算法基本思想
设\(p\)是实数,且\(\frac{1}{2} < p < 1\).如果该算法对于问题的任一实例得到正确解的概率不小于\(p\),则称该蒙特卡洛算法是\(p\)正确的,且称\(p-\frac{1}{2}\)是该算法的优势.
在一般情况下,设\(\varepsilon\)和\(\delta\)是两个正实数,且\(\varepsilon+\delta<\frac{1}{2}\). 设\(MC(x)\)是\(\frac{1}{2}+\varepsilon\)正确的.且\(C_\varepsilon=-\frac{2}{log(1-4\varepsilon^2)}\).
如果调用算法至少\(C_\varepsilon log(\frac{1}{\delta})\)次,并返回各次调用出现频次最高的解,就可以得到一个\(1-\delta\)正确的蒙特卡洛算法.
由此可见,不论算法\(MC(x)\)的优势\(\varepsilon>0\)多么小,都可以通过反复调用来放大算法的优势,最终得到的算法具有可以接受的错误概率.
证明如下,设\(n>C_\varepsilon log(\frac{1}{\delta})\)是重复调用\(\frac{1}{2}+\varepsilon\)正确的蒙特卡洛算法次数,且\(p=\frac{1}{2}+\varepsilon\),\(q=1-p=\frac{1}{2}-\varepsilon,m=\lfloor \frac{n}{2} \rfloor+1\).即经过\(n\)次调用算法,问题的正确解至少应出现\(m\)次,其出现错误的概率最多为: \[\begin{aligned} & \sum^{m-1}_{i=0}Prob{\ n次调用出现i次正确解} \\ & \leq \sum^{m-1}_{i=0} \lgroup \begin{aligned} n \\ i \end{aligned} \rgroup p^i=q^{n-i}=(pq)^{\frac{n}{2}} \sum^{m-1}_{i=0} \lgroup \begin{aligned} n \\ i \end{aligned} \rgroup (\frac{q}{p})^{\frac{n}{2}-i} \\ & \leq (pq)^{\frac{n}{2}} \sum^{m-1}_{i=0} \lgroup \begin{aligned} n \\ i \end{aligned} \rgroup \ \ \ \ \ \ \ \ \ (\frac{q}{p}<1,\frac{n}{2}-i\geq0) \\ & \leq (pq)^{\frac{n}{2}} \sum^{m-1}_{i=0} \lgroup \begin{aligned} n \\ i \end{aligned} \rgroup = (pq)^{\frac{n}{2}}2^n=(4pq)^{\frac{n}{2}}=(1-4\varepsilon^2)^{\frac{n}{2}} \\ & \leq (1-4\varepsilon^2)^{\frac{c_\varepsilon}{2}}\log(1/\delta)\ \ \ \ \ \ \ \ \ (0<(1-4\varepsilon^2)<1) \\ & = 2^{-\log(\frac{1}{\delta})} \\ & = \delta \ \ \ \ \ \ \ \ \ (当\ x>0 \Rightarrow x^{\frac{1}{\log x}}=2) \end{aligned} \]
实例
主元素问题
设\(T[1:n]\)是一个含有\(n\)个元素的数组,当\(|\ \{i\ |\ T[i]=x\}\ |>\frac{n}{2}\)时,称元素\(x\)是数组\(T\)的主元素.
编写一个程序如下:
RandomNumber rnd; |
上述算法是一个偏真的\(\frac{1}{2}\)算法,因为当此数组里面没有主元时,必然返回False
,否则将以大于$
$的概率返回True
.
执行两次
执行两次上述程序:
template<class Type> bool Majority2(Type *T, int n) { |
如果\(T\)不含主元素 -
算法Majority2
肯定返回False
.
如果\(T\)含有主元素:
- 第一次算法
Majority
返回True
的概率大于$ $,此时算法Majority2
必然返回True
- 第一次算法
Majority
返回False
的概率为\(1-p\),第二次算法Majority
返回True
的概率为p
因此: \[ p+(1-p)p=1-(1-p)^2>\frac{3}{4} \]
执行\(\log(\frac{1}{\varepsilon})次\)
此时的算法错误概率小于\(\varepsilon\)
template<class Type> bool MajorityMC(Type *T, int n, double e) { |
算法的时间复杂度为:\(O(n\log(\frac{1}{\varepsilon}))\)
实例运行
#! python3 |
➜ gitio /usr/bin/python3 /media/zqh/文档1/Blog/gitio/source/_posts/monte-carlo/monte.py |