最优化问题的计算方法是很重要的,因为很多最优化的问题难于解析地解出来,对于动态模拟,通常人们能够解析地确定定常态的行为,但是关于瞬态行为的研究则需要计算机模拟,概率模型更加复杂,不具有时间动态特性的模拟有时能够解析地求解出来,且对于简单的随机模型,定常态的结果通常是可用的,但是对于许多情况,概率模型是用模拟的方法解出的。下面我们将讨论概率模型中一些最常用的模拟方法。
随机过程中包含有瞬时或时变的行为的问题通常是很难解析地解出的。蒙特卡罗模拟是有效地解决这一类问题的一般建模技术。模型直观且易于解释,同时也是对许多复杂的随机系统进行建模的仅有的办法。它是基于诸如抛硬币这类简单的随机化处理的办法,但通常使用了计算机的伪随机发生器。由于包含随机元素,所以每次重复会得到不同的结果。
例:假期即将到来,气象局预报假期中每天的降雨概率是50%,请问连续3天都下雨的概率是多少?
使用五步分析法。
第一步提出问题。在这个过程中我们选定一些重要的变量,同时明确我们关于这些变量的假设。第一步的结果列于下图。
第二步选择建模方法,我们使用蒙特卡罗模拟的方法。蒙特卡罗模拟是可以用于任何概率模型的技术。一个概率模型包含有若干个随机变量,必须明确每一个随机变量的概率分布。蒙特卡罗模拟使用随机化的设备按照?的概率分布给出每个随机变量的值。因为模拟的结果依赖于随机元素,所以接连重复同样的模拟会产生不同的结果,通常蒙特卡罗模拟会被重复若干次,以便于确定平均数或期望的结果。第三步,推导模型的数学表达式。下面给出雨天问题的蒙特卡罗模拟的算法伪代码。
第四步求解问题,我们在计算机上运行上述程序,令参数p=0.5,n=100.看输出结果。结果显示100周中有63周下雨超过连续的3天。第五步,你的长达一周的假期到了,你发现气象台预报每天的降雨概率为0.5,则假期中降雨超过连续3天的概率为60%左右。因此,你要做好不能出去浪的心理准备!最后进行灵敏性分析。对降雨概率p进行分析。对p=0.3,0.4,0.5,0.6,0.7的每一种情况分别进行模拟。结果汇总在下表。
p | 0.3 |
0.4 |
0.5 |
0.6 |
0.7 |
S | 16 |
36 |
62 |
78 |
79 |
可见降雨的周数是随p的增加而单调递增的。提高第t天的降雨概率就意味提高了连续3天降雨的概率。我们的模型关于p是相当稳健和灵敏的。
注意:本模型算法的实现是通过C++来编程实现的,由于C++没有专门的随机数生成器,而是通过rand()生成伪随机数,与真正的随机数有差别。因此结果会有所出入。
C++实现代码:
#include
#include
#include
#include
using namespace std;
int main()
{
float p,g;
int k,t, n,m=1, X,S=0,C=0, Y;
cout << "Please enter the value of p:" << endl;
cin >> p;
cout << "Please enter the value of n:" << endl;
cin >> n;
double a[705];
srand((unsigned)time(NULL));
for (int i = 0;
i < 705;
i++)
{
a[i] = rand() / (RAND_MAX + 1.0);
}
for (k = 1;
k <= n;
k++)
{
for (t = 1;
t <= 7;
t++)
{
if (a[m++] < p)
X = 1;
else
X = 0;
if (X == 1)
C += X;
else
C = 0;
if (C >= 3)
break;
}
if (t > 7 && C < 3)
Y = 0;
else
Y = 1;
S += Y;
}
cout << n << " 周模拟实验中有" << S << " 周连续降雨超过等于3天" << endl;
cin >> p;
return 0;
}
【蒙特卡罗模拟】