蒙特卡罗法 (又称统计试验法)是描述装备运用过程中各种随机现象的基本方法,而且它特别适用于一些解析法难以求解甚至不可能求解的问题。
用蒙特卡罗法 来描述装备运用过程是1950年美国人约翰逊首先提出的。这种方法能充分体现随机因素对装备运用过程的影响和作用。更确切地反映运用活动的动态过程。在装备效能评估中,常用蒙特卡罗法来确定含有随机因素的效率指标,如发现概率,平均毁伤目标数等;模拟随机系统中的随机现象并计算其数字特征;对一些复杂的装备运用行动,通过合理的分解,将其简化成一系列前后相连的事件,再对每一事件用随机抽样方法进行模拟,最后达到模拟装备运用活动或运用过程的目的。
优点与缺点:
优点:
1.方法的误差与问题的维数无关。
2.对于具有统计性质问题可以直接进行解决。
3.对于连续性的问题不必进行离散化处理
缺点:
1.对于确定性问题需要转化成随机性问题。
2.误差是概率误差。
3.通常需要较多的计算步数N.
在建模时,如遇到以下约束条件下求解最优值的时候,可以用到蒙特卡洛随机法:
在一般的做法中可以使用枚举法,即100的5次方次,将所有可能都遍历一遍,求取最优的结果,这也也是可行的。但是我们可以使用随机法来寻找一个较优的结果,同时减少计算量,提升计算速度。
定义目标函数:
def f(x: list) -> int:
return x[0] ** 2 + x[1] ** 2 + 3 * x[2] ** 2 + 4 * x[3] ** 2 + 2 * x[4] ** 2 - 8 * x[0] - 2 * x[1] - 3 * x[2]-x[3]-2 * x[4]
定义约束函数向量:将其转换一下,当向量中的数小于0时,即约束条件成立。
def g(x: list) -> list:
res = []
res.append(sum(x) - 400)
res.append(x[0] + 2 * x[1] + 2 * x[2] + x[3] + 6 * x[4] - 800)
res.append(2 * x[0] + x[1] + 6 * x[2] - 200)
res.append(x[2] + x[3] + 5 * x[4] - 200)
return res
生成随机数,并保存最优值。可以设置随机种子,保证结果可复现。
max = 0
xlist = []
random.seed(1)
for i in range(10 ** 6):
x = [random.randint(0, 99) for i in range(5)] # 产生一行五列的区间[0, 99] 上的随机整数
rf = f(x)
rg = g(x)
if all((a < 0 for a in rg)): # 若 rg 中所有元素都小于 0
if max <rf:
xlist= x
max = rf
print(xlist, max)
结果如下: