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

news/2025/3/18 8:58:35/文章来源:https://www.cnblogs.com/dlmuwxw/p/18341834

目录
  • 前言
  • 一、问题提出
  • 二、蒙特卡罗模拟的大体思路
    • 1.求出每个变量的大致范围
    • 2.生成随机数进行模拟试验
  • 三、手动计算每个变量的大致范围
    • 1.处理等式问题————进行降维
    • 2.处理不等式问题————得到大致范围
      • (1)先处理简单的约束,得到变量范围
      • (2)对复杂的约束进行放缩,得到变量范围
  • 四、代码求解————进行计算机模拟
    • 1.设置数字格式
    • 2.生成随机数与变量初始化
    • 3.输入循环进行模拟
    • 4.输出结果
  • 五、缩小范围重新模拟得到更加精确的取值

前言

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

一、问题提出

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

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:nx = [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保存到一个变量中endend
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/777761.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Aspire优雅的进行全栈开发——WinUI使用Semantic Kernel调用智普清言LLM总结Asp.Net Core通过Playwright解析的网页内容

前言 这算是一篇学习记录博客了,主要是学习语义内核(Semantic Kernel)的实践,以及Aspire进行全栈开发的上手体验,我是采用Aspire同时启动API服务,Blazor前端服务以及WinUI的桌面端项目,同时进行三个项目的代码修改,整体感觉很方便,如果代码都修改了只需要启动Aspire项…

微信小程序3

1.样式文件1.小程序中不需要主动来引入样式文件2.px是写死的像素,不会变的,需要把页面中某些元素的单位由 px 变为 rpx1.设计稿 750px750px=750rpx 1px=1rpx2.把屏幕宽度变为375px375px=750rpx 1px=2rpx 1rpx=0.5px3.存在一个设计稿 宽度不和750成比例或者未知,…

Java流程控制02:顺序结构

JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。 顺序结构是最简单的算法结构。语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的, 它是任何一个算法都离不开的一种基本算法结构。 顺序结构在程序流程图中…

6-2训练模型的三种方法

Pytorch通常需要用户编写自定义训练循环,训练循环的代码风格因人而异。Pytorch通常需要用户编写自定义训练循环,训练循环的代码风格因人而异。 有三类典型的训练循环代码风格:脚本形式训练循环,函数形式训练循环,类型是训练循环。 下面以minis数据集的多分类模型的训练为例…

kibana报错:Your basic license does not support watcher. Please upgrade your license.

kibana突然遇到以下错误,特地记录下:错误内容如下:   解决方法:删除,然后启动:

Python逆向

参考链接: https://www.bilibili.com/video/BV1JL4y1p7Tt/?spm_id_from=333.999.0.0 https://bbs.kanxue.com/thread-282542.htm https://blog.csdn.net/weixin_35967330/article/details/114390031?spm=1001.2014.3001.5501 https://0xd13a.github.io/ctfs/0ctf2017/py/前言…

浏览器插件监听元素变动-用于直播自动回复

直播获取评论区的原理 MutationObserver 是一个强大的浏览器API,它可以监听DOM的变化,包括元素的添加、删除、属性的更改等。 开发需求可联系vx:llike620 步骤:创建一个MutationObserver实例,并提供一个回调函数。 使用observe方法指定要监控的DOM节点和具体的变动类型。 …

redis+xxl-job初步设计点赞功能

一般情况下点赞业务涉及以下下几个方面: 1.我们肯定要知道一个题目被多少人点过赞,还要知道,每个人他点赞了哪些题目。 2.点赞的业务特性,频繁。用户一多,时时刻刻都在进行点赞,收藏等等处理,如果说我们采取传统的数据库的模式啊,这个交互量是非常大的,很难去抗住这个…

易优CMS友情链接列表标签

{eyou:flink type=all row=30 titlelen=15} <!--type:image图片类型--> <a href={$field.url} {$field.target}><img src={$field.logo} /></a> <!--type:text文本类型--> <a href={$field.url} {$field.target}>{$field.title}</a>…

如何选择PHP和MySQL的版本?

建议优先使用 php5.6 + MySQL5.7 的组合。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理、二次开发、PSD转HTML、网站被黑、网站漏洞修复等。…

易优cms获取栏目id的方法,调用栏目id实现不同栏目banner图替换

直接{$eyou.field.typeid}.jpg{$eyou.field.typeid}调用当前栏目ID , 可以在前面加上路径如 /skin/images/{$eyou.field.typeid}.jpg。 效果: 图片上传 images文件夹, 根据不同ID, 图片命名为1.jpg/2.jpg扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟…

帝国cms忘记后台登陆密码怎么办?

使用MySQL数据库管理软件phpmyadmin,修改数据库中的phome_enewsuser数据表进行密码重置操作: 修改phome_enewsuser表里的记录:将password字段的内容改为:“322d3fef02fc39251436cb4522d29a71”;将salt字段的内容改为:“abc”. 密码就重置为:123456扫码添加技术【解决问题…