首页 > 其他分享 >蒙特卡洛模拟(3)————求解有约束的非线性规划问题

蒙特卡洛模拟(3)————求解有约束的非线性规划问题

时间:2024-08-04 16:27:56浏览次数:13  
标签:10 求解 非线性 随机数 x2 x3 蒙特卡洛 x1 模拟

目录

前言

在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支--数学规划
如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。一般说来,解非线性规划要比解线性规划问题困难得多,也不像线性规划有单纯形法这一通用方法,非线性规划目前还没有适于各种问题的一般算法,各个方法都有自己特定的适用范围。
本章来介绍用计算机生成随机数的方法来求解非线性规划问题

一、问题提出

二、蒙特卡罗模拟的大体思路

1.求出每个变量的大致范围

2.生成随机数进行模拟试验

在试验中,由于我们求的只是一个大致范围,因此我们需要先判断随机数是否满足精确的约束。
在满足的前提下,再将这个随机数带入表达式,判断其是否是最大的

三、手动计算每个变量的大致范围

1.处理等式问题————进行降维

由x1-x2=10,得到x2=x1-10,那么原函数就可以转化为f(x)=x1(x1-10)x3,相当于降了一维。但是在代码部分,这一步的降维体现在不用再生成一个新的随机数

2.处理不等式问题————得到大致范围

(1)先处理简单的约束,得到变量范围

因为 10<=x2<=20,则20<=x1<=30(由x1-x2=10)

(2)对复杂的约束进行放缩,得到变量范围

四、代码求解————进行计算机模拟

1.设置数字格式

format long g
matlab默认会将数字保留四位小数,若太大会用科学计数法来表示,但是在我们的规划问题中,我们想要得到具体的数值,因此输入此命令可以将Matlab的计算结果显示为一般的长数字格式

2.生成随机数与变量初始化

n=10000000; %生成的随机数组数
x1=unifrnd(20,30,n,1);  % 生成在[20,30]之间均匀分布的随机数组成的n行1列的向量构成x1
x2=x1 - 10;
x3=unifrnd(-10,16,n,1);  % 生成在[-10,16]之间均匀分布的随机数组成的n行1列的向量构成x3
fmax=-inf; % 初始化函数f的最大值为负无穷(后续只要找到一个比它大的我们就对其更新)

3.输入循环进行模拟

在此步中,我们将x1,x2,x3的数值构造乘了一个新的x向量,这样每次循环都可以生成一个3个数的向量,代表这一次循环的x1,x2,x3
然后,判断是否满足条件,如果满足条件就计算函数值,进行迭代最大值

for i=1:n
    x = [x1(i), x2(i), x3(i)];  %构造x向量, 这里千万别写成了:x =[x1, x2, x3]
    if (-x(1)+2*x(2)+2*x(3)>=0)  &  (x(1)+2*x(2)+2*x(3)<=72)     % 判断是否满足条件
        result = x(1)*x(2)*x(3);  % 如果满足条件就计算函数值
        if  result  > fmax  % 如果这个函数值大于我们之前计算出来的最大值
            fmax = result;  % 那么就更新这个函数值为新的最大值
            X = x;  % 并且将此时的x1 x2 x3保存到一个变量中
        end
    end
end

4.输出结果

disp(strcat('蒙特卡罗模拟得到的最大值为',num2str(fmax)))
disp('最大值处x1 x2 x3的取值为:')
disp(X)

五、缩小范围重新模拟得到更加精确的取值

我们上一步得到了最大值处x1 x2 x3的取值为:22.5897459433039 12.5897459433039 12.1153738601129
因此我们可以将x1的下界从20提高到22,x3的确界从[-10,16],缩小到[11,13],然后进行再次进行循环与模拟

x1=unifrnd(22,23,n,1);  % 生成在[22,23]之间均匀分布的随机数组成的n行1列的向量构成x1
x2=x1 - 10;
x3=unifrnd(11,13,n,1);  % 生成在[11,13]之间均匀分布的随机数组成的n行1列的向量构成x3

标签:10,求解,非线性,随机数,x2,x3,蒙特卡洛,x1,模拟
From: https://www.cnblogs.com/dlmuwxw/p/18341834

相关文章

  • 蒙特卡洛模拟(2)————排队问题
    目录一、基础知识补充1.normrnd(MU,SIGMA)2.exprnd(M)3.tic与toc二、问题提出三、模型建立1.引入符号2.引入符号后,我们可以由题目得到一些递推关系,由这个递推关系做出一个循环进行我们的模拟四、第一问代码求解1.字符初始化2.带入模型进行循环3.输出结果五、第二问代码求解一、基......
  • 利用琼斯矩阵求解一般偏振问题
           ......
  • 关于C语言中素数的求解
    什么是素数?一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数。(素数=质数)在C语言中求解素数的几种方法。方法一:直接试数法(从1开始逐一试数)例:求解100到200之间的素数。#include<stdio.h>intmain(){ inti=0; intcount=0; for(i=100;i<=......
  • 【智能算法应用】基于球形矢量的灰狼算法求解UAV路径规划问题
    目录1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】灰狼算法(GWO)原理及实现2.数学模型路径最优性为了实现UAV的高效运行,计划的路径需要在某一特定标准上达到最优。UAV飞行路径Xi表示为UAV需要飞过的一系列n个航路点,每个航路点对应搜......
  • 【智能算法应用】A*和改进A*求解大规模栅格地图路径规划问题
    目录1.算法原理2.二值图像构建大规模栅格地图3.结果展示4.代码获取1.算法原理精准导航:用A*算法优化栅格地图的路径规划【附Matlab代码】改进A*算法通过删除必要的拐点或简化路径来减少路径长度,使得路径更为直观和高效。2.二值图像构建大规模栅格地图给定一幅二......
  • 提高 z3 优化问题的求解器速度
    我正在尝试使用Z3(Python)解决包含线性整数模理论的SMT问题。该问题类似于Knuth的可满足性书第14f页上的“学习布尔函数”示例。我的问题有一组布尔值公式(数百个),每个公式包含要求解的同一组未知整数和布尔变量(数十个),优化目标是最大化真实公式的数量作为这些公式的函数未......
  • 蒙特卡洛模拟(1)————三门问题
    目录前言一、基础知识————matlab随机函数1.rand(m,n)2.unifrnd(a,b,m,n)3.randi([a,b],m,n)二、问题提出三、考虑必定成功的条件下的概率————代码实现1.初始化变量2.生成随机数,进行循环3.输出结果四、无条件概率(考虑失败)————代码实现1.初始化变量2.生成随机数,进行循环......
  • 使用合适的维度拆分来求解问题
    合理地分解问题,往往能让问题迎刃而解。问题工作中遇到一个问题。有一些IP,有一些主机H,需要对这些主机进行IP封禁,IP封禁还有对应的端口(Port)和入站出站方向(Direction)。端口需要累加。比如第一次封禁了(h1,ip1,port1-portN,in),第二次又封禁了(h1,ip1,portJ-portM,in),则封禁结......
  • R语言分布滞后非线性模型(DLNM)研究发病率,死亡率和空气污染示例|附代码数据
    全文下载链接:http://tecdat.cn/?p=21317最近我们被客户要求撰写关于分布滞后非线性模型(DLNM)的研究报告,包括一些图形和统计输出。本文提供了运行分布滞后非线性模型的示例,同时描述了预测变量和结果之间的非线性和滞后效应,这种相互关系被定义为暴露-滞后-反应关联数据集包含1987-......
  • 最优化(11):信赖域算法、非线性最小问题二乘算法
    4.6信赖域算法——第一小节给出了信赖域算法的框架,第二小节讨论了信赖域子问题的求解方法(迭代法、截断共轭梯度法),第三小节主要介绍算法收敛性;4.7非线性最小二乘问题算法——第一小节给出了非线性最小二乘问题的一般形式,第二小节主要介绍高斯-牛顿算法,第三小节主要介绍Leve......