python数学建模之用随机法解决非线性规划问题

        蒙特卡罗法  (又称统计试验法)是描述装备运用过程中各种随机现象的基本方法,而且它特别适用于一些解析法难以求解甚至不可能求解的问题。

        用蒙特卡罗法 来描述装备运用过程是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)

结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值