就一个实际问题讨论蒙特卡洛方法
** 蒙特卡罗(Monte Carlo)方法 **,又称随机抽样或统计试验方法,它诞生于上世纪四十年代,对于原子能的实验中很难接近真实的物理过程,所以诞生了蒙特卡洛方法。利用蒙特卡洛方法可以很好的模拟物理过程。这也是以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。
在本文中将对一个实际的机器维修方案做蒙特卡洛模拟来选出最优的维修方案。
问题:
现有一个长时间运行的机器,内有四个电子管属于易耗品,其使用寿命服从
[
1000
,
2000
]
[1000,2000]
[1000,2000](小时)的均匀分布,当机器停转时每小时损失20元,每支电子管的价格为10元,现有两种维修方案:
方案一:每次更换坏掉的电子管,需要时间1个小时。
方案二:每次坏掉的时候,更换四只电子管,需要时间2小时。
问题分析
电子管的寿命是完全随机且不可预测的,我们仅仅知道它的寿命服从一个均匀分布,我们可以假定一个函数来做决策,输入是四个电子管是随机的,我们可以用计算机模拟的方式来探讨,我们使用随机数函数来随机电子管寿命,这种模拟方式就是蒙特卡罗方法
代码
import random
import numpy as np
class tubes:
def __init__(self):
self.life = random.uniform(1000, 2000)
allTime = 5000 # 假设机器运行时间
tubeL = [tubes() for _ in range(4)] # 实例化机器上四个电子管
moneySum = 0
for i in range(allTime):
if tubeL[1].life > 0 and tubeL[2].life > 0 and tubeL[3].life > 0 and tubeL[0].life > 0:
for j in range(4):
tubeL[j].life -= 1
else:
if tubeL[1].life < 0:
moneySum -= 30
tubeL[1] = tubes()
continue
if tubeL[2].life < 0:
moneySum -= 30
tubeL[2] = tubes()
continue
if tubeL[3].life < 0:
moneySum -= 30
tubeL[3] = tubes()
continue
if tubeL[0].life < 0:
moneySum -= 30
tubeL[0] = tubes()
continue
print("PlanA:", moneySum)
tubeL1 = [tubes() for _ in range(4)] # 实例化机器上四个电子管
moneySum1 = 0
for i in range(allTime):
if tubeL1[1].life > 0 and tubeL1[2].life > 0 and tubeL1[3].life > 0 and tubeL1[0].life > 0:
for j in range(4):
tubeL1[j].life -= 1
else:
i = i + 2
for j in range(4):
tubeL1[j] = tubes()
moneySum1 -= 80
print("PlanB:",moneySum1)
最后在 a l l T i m e = 100000000 allTime = 100000000 allTime=100000000时计算得到方案一的损失为7975440,方案二的损失为6660240,综上我们可以知道方案二优于方案一。
分析
蒙特卡罗方法是一个适用性极广的方法,可以利用计算机来模拟各种情况,最后得到相似解。但蒙特卡罗模拟有一个危险的缺陷: 如果必须输入一个模式中的随机数并不像设想的那样是随机数, 而却构成一些微妙的非随机模式, 那么整个的模拟(及其预测结果)都可能是错的。