蒙特卡洛模拟(4)————书店买书问题(0-1规划)

news/2025/3/17 22:29:14/文章来源:https://www.cnblogs.com/dlmuwxw/p/18341993

目录
  • 一、问题提出
  • 二、模型建立
    • 1.符号建立
    • 2.规定约束
    • 3.获得目标函数
  • 三、代码求解
    • 1.预备知识
      • (1)unique函数
      • (2)randi函数
    • 2.变量设置与初始化
    • 3.输入循环进行模拟
  • 四、模型拓展

一、问题提出

二、模型建立

1.符号建立

在图表上,我们可以看见有六家商店和五本书,在代码中我们往往用矩阵来表示这个信息,因此我们需要规定一些符号来表示信息
i=1,2,.....6,表示A,B,.....,F这六家商店
j=1,2...5,表示这B1,B2....,B5五本书
自然,我们规定mij表示j书在i商店的售价,qi表示第i家店的运费
引入0-1变量xij,1表示在第i家店买第j本书,0表示没买。这样的话,用这些0-1数值直接去乘价格矩阵,相加后就可以得到最后的价格

2.规定约束

这个问题的约束相对简单,即每本书只买一本

3.获得目标函数

我们的目标函数就是使得费用最小,而费用有两部分,第一部分是书的价格,第二部分是运费。在代码求解的过程中,我们会介绍利用索引的方法来提取数据,计算运费

三、代码求解

我们如果用计算机模拟,并不需要规定那么多符号,但是计算机模拟也不是万能的。
在这里只有7776(6^5)种情况,我们只需要进行多次模拟即可找到最优解。但如果情况数目更多,只用计算机模拟会导致计算量过大,从而难以找到最优解,因此学会模型的建立也是必须的
下面我们来介绍这个问题的代码部分

1.预备知识

(1)unique函数

unique([1 2 5; 6 8 9;2 4 6])
ans=[1 2 4 5 6 8 9]'
unique函数可以剔除一个矩阵或者向量的重复值,并将结果按照从小到大的顺序排列

(2)randi函数

randi([a,b],m,n)
randi函数可在指定区间[a,b]内随机取出大小为m*n的整数矩阵

2.变量设置与初始化

min_money = +Inf;  % 初始化最小的花费为无穷大,后续只要找到比它小的就更新
min_result = randi([1, 6],1,5);  % 初始化五本书都在哪一家书店购买,后续我们不断对其更新
%若min_result = [5 3 6 2 3],则解释为:第1本书在第5家店买,第2本书在第3家店买,第3本书在第6家店买,第4本书在第2家店买,第5本书在第3家店买  
n = 100000;  % 蒙特卡罗模拟的次数
M = [18	 39	29	48	5924	45	23	54	4422	45	23	53	5328	47	17	57	4724	42	24	47	5927	48	20	55	53];  % m_ij  第j本书在第i家店的售价
freight = [10 15 15 10 10 15];  % 第i家店的运费

3.输入循环进行模拟

(1)进行循环后,我们首先得到了一个result,之后用unique函数将其排序后,得到了一个由小到大排序的索引向量,将这个向量带入到freight中,就可以得到对应的运费,对其求和得到总运费
(2)然后加上五本书的售价,这个过程需要进行五次循环,第i次循环找出第i列的某个数,而这个数处于result(i)行
(3)之后判断是否小于最小花费,如果小于就更新最小值与最小值结果

for k = 1:n  % 开始循环result = randi([1, 6],1,5); % 在1-6这些整数中随机抽取一个1*5的向量,表示这五本书分别在哪家书店购买index = unique(result);  % 在哪些商店购买了商品,因为我们等下要计算运费money = sum(freight(index)); % 计算买书花费的运费% 计算总花费:刚刚计算出来的运费 + 五本书的售价for i = 1:5   money = money + M(result(i),i);  endif money < min_money  % 判断刚刚随机生成的这组数据的花费是否小于最小花费,如果小于的话min_money = money  % 我们更新最小的花费min_result = result % 用这组数据更新最小花费的结果end
end
min_money   % 18+39+48+17+47+20
min_result

四、模型拓展

在此模型的基础上加上额外条件,例如:在同一家店买书的价格超过50元包邮或者打折等,这也是现实生活中常见的优惠
在此基础上,我们需要对循环的过程加上更多的限制条件

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

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

相关文章

KubeSphere 社区双周报| 2024.07.19-08.01

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.07.19-08.01。 贡献者名单新晋 KubeSphere co…

内核简介

Linux内核基础 楔子 这部分的内容首先要回忆一下计算机的基础知识,基本的计算机结构包括CPU(算数逻辑单元ALU、控制单元CU)、存储器、输入和输出。CPU和其它设备是通过总线连接的。CPU执行的基础被称为指令集,CPU执行存储器存取指令时:CPU发出存取信号,然后就从存储器存取…

logback下日志输出前处理操作——以日志脱敏为例

使用lockback 目前Java Spring服务在打印日志时一般使用slf4j和logback这种组合,其基本原理图如下具体的:大多数会先定义一个loackback-dev.xml文件,而后使用<appender>标签定义输出格式 <appender name="file" class="ch.qos.logback.core.rolling…

边分治维护强连通分量(CF1989F,P5163)

这里的边分治和树上的点分治边分治不一样,是维护强连通分量用的,每条边有一个出现时间,通过将每条边按连通关系分流重新排列,从而维护每个时间点整张图的连通性。具体的,这个算法是维护这样的一类问题: n 个点,m 条边按时间顺序依次加入,每加入一条边,你需要回答一些问…

使用 C# 和 ONNX 來玩转Phi-3 SLM

LLM 席卷世界刷新 AI 的认知之后,由于 LLM 需要的硬件要求实在太高,很难在普通设备上运行,因此 SLM 逐漸受到重視,Phi-3 SLM 是由 Microsoft 所开发的模型,可以在你的电脑、手机等设备来运行,小型语言模型 (SLM) 和 ONNX 的结合改变了 AI 互操作性的游戏规则。让我们展…

到底什么是@RestController

@RestController是Spring框架的一个注解,通常用于标识一个类是RESTful服务的Controller。 @RestController经常用来处理HTTP请求,是SpringMVC中用于构建RESTful Web服务的注解,是@Controller注解的变体 通过@RestController注解,SpringMVC可以识别出这个类是一个控制器这个…

【已解决】戴尔 Inspiron 5457 和 5557 启动报错:Invalid configuration information - please run SETUP program.

场景 我使用的是戴尔15-5557的笔记本电脑,在某次开机的时候系统提示:Invalid configuration information - please run SETUP program.虽然的点击Continue可以正常进入系统,但是每次开机都要来上这么一下真的很烦人,于是想着解决一下。 试错过程 1. BIOS调整刚开始以为是自…

6-3使用GPU训练模型

当参数迭代过程成为训练时间的主要瓶颈时,我们通常的方法是应用GPU来进行加速。深度学习的训练过程常常非常耗时,一个模型训练几个小时是家常便饭,训练几天也是常有的事情,有时候甚至要训练几十天。 训练过程的耗时主要来自于两个部分,一部分来自数据准备,另一部分来自参…

从 0 开始安装和运行 Cangjie (仓颉)

在 Windows 上运行你的第一个仓颉应用程序标准方法 参照 配置开发环境 的描述,下载 Cangjie for DevEco Studio 插件 DevEco Studio NEXT Developer Beta2-Cangjie Plugin(5.0.3.500)。然后在 DevEco Studio NEXT Developer Beta2 中从本地磁盘安装插件,选择下载好的 "d…

启动静态文件中间件

在启动项 Program.cs 文件中添加//app.UseStaticFiles(); // 启动静态文件中间件,默认访问wwwroot app.UseStaticFiles(new StaticFileOptions() {//修改默认访问地址为MyStaticFiles文件FileProvider = new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRoo…

变异系数在fNIRS数据分析中有效性讨论

问题变异系数又称CV,它是无量纲的,定义为概率分布离散程度的归一化程度。在概率论中常常用来作为比较两组数据离散程度的指标,其在fNIRS信号这类连续信号中常常用来检测通道的信号质量好坏,阈值包括0.1、0.15和0.25等,阈值越大越宽松,当某个通道的CV值超过设定的阈值时判…