2024年MathorCup数模竞赛C题超详细解题思路

妈妈杯本次比赛报名队伍号高达12500,这也就意味着大概一万只队伍参加报名,仅仅在报名人数这一项,妈妈杯已经成为美赛国赛之后的第三大竞赛。C题作为本次竞赛最简单也最容易获奖的题目,本文将给大家带来手把手超详细解题思路。

注释:最容易获奖是因为,数模竞赛获奖是按着百分比获奖的,并分指定ABCD每一道题目只有400队能获得国奖,而是每道题目选择的50%都可以获奖;选择人数少,一是题目难,二是选择的人都是数学建模的变态。如果选择这种题目,我们需要打败50%的数模老手以及数模变态才可以获奖。

      反之,选择选题人数最多的。选择人主要是萌新、小白,都是不太懂数模的。我们只需要淘汰50%的小白即可,加上我们的资料可以保证大家一定可以获奖。

首先,正式解题之前我们需要做数据预处理。数据预处理是所有数据类数模竞赛所必须的步骤,百分制的评审大概可以占到10-15分的分值。对于该题目主要的数据预处理工作在于异常值的判定。例如,对于附件一存在很大的值10万+,也存在很小的数据。对于这种的边缘值我们需要使用一些方式进行判定。比较合理高大上的方式就是首先判定数据分布方式,对于正态分布数据使用3西格玛原则判定异常值,对于非正态分布数据使用箱型图判定异常值。

处理完之后,我们就发现极端数据11000是由于双十一,因此对于判定的异常值,我们需要结合实际情况在进行后续处理。

问题一,建立货量预测模型,对57 个分拣中心未来 30 天每天及每小时的货量进行预测,将预测结果写入结果表1和表2中。

问题一本质就是预测模型,需要对两个主体进行预测,分别是日货量预测模型、小时货量预测模型。对于预测模型,在数学建模没有对错之分,因此可以随意地选择模型。但是预测结果精度越好的模型,得分也会稍微的高一些。这里给大家一些建议:

对于日货量预测模型,我们需要对每一个地区的货量分别进行一个月的预测,选择合适的时间序列预测模型,例如SARIMA(季节性自回归综合移动平均模型),ARIMA、prohet或使用机器学习模型如随机森林、XGBoost。其中,想拿国一可以适当的了解一下prohet(去年国赛指定答案模型,两万七千只队伍仅有一个做出来了)

对于小时货量预测模型,这里有两种思路。其一,将24小时作为一个周期,直接建立时间序列预测,用三万个数据进行预测即可。其二,将每一个地区每天同一时间的数据单独拿出来,一共30组。对这三十组进行预测。这样预测数据量减小,但是还需要进行30步预测,可能预测精度存在一定问题。

对于模型的选择,大家可以根据自己队伍的实力进行选择即可。想要单纯的追求模型复杂度,可以考虑我之前保奖课讲过的加权平均预测,使用多种预测模型,进行加权。以误差最小为目标函数,权重和为1为约束条件,将多种预测模型进行加权起来。类似于下面这种方式。

问题二,过去 90 天各分拣中心之问的各运输线路平均货量如附件3所示。若未来 30 天分拣中心之问的运输线路发生了变化,具体如附件4所示。根据附件 1-4,请对57个分拣中心未来 30 天每天及每小时的货量进行预测,并将预测结果写入结果表3和表4中。

其本质还是预测模型,与问题一相对来讲。问题一是y和t进行建模,问题二就是引入几个x,建立 y和x,t的预测模型。即引入一些新的指标。因此,我们需要基于附件三四的数据引入指标进行预测即可。预测模型的选择可以选择与问题一相同,这样可以保证论文模型的整体性;也可以换一个新的模型,这样可以增加模型的复杂度,但是整体性会下降。

另类思路:

选择新指标为运输线路货量变动【计算每个运输线路在未来的变化情况,这可能包括新的线路增加或现有线路的变化。】,历史货量信息【使用附件3提供的历史平均货量来预估新线路或变更线路的货量影响】

数据整合:整合附件3的货量数据和附件4的线路变化数据。对于新出现的线路,如果没有历史数据,可能需要估计其货量或使用类似线路的平均货量作为预估。

特征构建:将运输线路作为特征加入模型,每个线路可以是一个特征,其值为货量或变化量。

 

路线:由始发分拣中心和到达分拣中心组成的标识。

货量:该线路的历史平均货量,对于无历史记录的线路为0。

接下来,我们可以创建以下特征:

是否新线路:如果货量为0,则认为这是新线路。

历史货量:已有的货量数据,将直接用作预测模型的输入。

预测模型更新:根据整合后的数据集更新货量预测模型,可能需要使用多元回归、随机森林或神经网络等方法。使用这些特征,我们可以准备适合于预测的数据集,并选择适合的预测模型,例如随机森林、XGBoost或神经网络等。为了进一步处理,我们需要确定数据的最终形式,并考虑如何将这些数据输入到模型中。具体结果如下所示

 

利用该结果进行,对问题一预测结果进行等比放缩即可。

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# 加载数据
attachment3 = pd.read_csv('附件3.csv', encoding='GBK')
attachment4 = pd.read_csv('附件4.csv', encoding='GBK')

# 创建路线列便于合并
attachment3['路线'] = attachment3['始发分拣中心'] + '-' + attachment3['到达分拣中心']
attachment4['路线'] = attachment4['始发分拣中心'] + '-' + attachment4['到达分拣中心']

# 合并数据,附件4为基础进行左连接
merged_data = attachment4.merge(attachment3[['路线', '货量']], on='路线', how='left')
merged_data['货量'].fillna(0, inplace=True)  # 填充未知货量为0

# 特征构建
X = merged_data.drop(columns=['始发分拣中心', '到达分拣中心', '路线', '货量'])
X['是否新线路'] = (merged_data['货量'] == 0).astype(int)
y = merged_data['货量']
# 实例化一个 StandardScaler 对象
scaler = StandardScaler()

# 使用 StandardScaler 对特征数据 X 进行标准化处理
X_scaled = scaler.fit_transform(X)  # 确保 X 已经定义并包含了您希望模型学习的特征

# 使用 train_test_split 将数据分割为训练集和测试集
X_train_scaled, X_test_scaled, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 构建神经网络模型
model = Sequential([
    Dense(64, activation='relu', input_shape=(X_train_scaled.shape[1],)),
    Dense(64, activation='relu'),
    Dense(1)
])

# 编译模型
model.compile(optimizer=Adam(learning_rate=0.01), loss='mean_squared_error')

# 增加模型的复杂度
model = Sequential([
    Dense(128, activation='relu', input_shape=(X_train_scaled.shape[1],)),
    Dense(128, activation='relu'),
    Dense(64, activation='relu'),
    Dense(1)
])

# 添加Dropout和正则化
from tensorflow.keras.layers import Dropout
from tensorflow.keras.regularizers import l2

model = Sequential([
    Dense(128, activation='relu', input_shape=(X_train_scaled.shape[1],), kernel_regularizer=l2(0.001)),
    Dropout(0.5),
    Dense(128, activation='relu', kernel_regularizer=l2(0.001)),
    Dropout(0.5),
    Dense(64, activation='relu', kernel_regularizer=l2(0.001)),
    Dense(1)
])

# 使用更慢的学习率和不同的优化器
optimizer = Adam(learning_rate=0.001)
model.compile(optimizer=optimizer, loss='mean_squared_error')

# 训练模型
history = model.fit(X_train_scaled, y_train, validation_split=0.2, epochs=100, verbose=1)


# 预测并计算RMSE
y_pred_nn = model.predict(X_test_scaled).flatten()
rmse_nn = mean_squared_error(y_test, y_pred_nn, squared=False)
print("Neural Network RMSE:", rmse_nn)

# 对整个数据集进行预测
y_full_pred_nn = model.predict(X_scaled).flatten()

plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号
# 可视化实际与预测货量
plt.figure(figsize=(12, 6))
plt.scatter(merged_data.index, merged_data['货量'], color='blue', label='实际货量', alpha=0.6)
plt.scatter(merged_data.index, y_full_pred_nn, color='red', label='预测货量 (NN)', alpha=0.6)
plt.title('实际货量 vs 预测货量 (神经网络)')
plt.xlabel('数据索引')
plt.ylabel('货量')
plt.legend()
plt.grid(True)
plt.show()

# ...(前面的代码不变,包括数据准备、模型构建、训练和预测)

# 将预测结果添加到原始的DataFrame中
merged_data['预测货量_NN'] = model.predict(X_scaled).flatten()

# 输出预测结果到CSV文件
output_filename = '预测结果.csv'
merged_data.to_csv(output_filename, index=False)

print(f"预测结果已保存到文件: {output_filename}")

问题三、假设每个分拣中心有60名正式工,在人员安排时将优先使用正式工,若需额外人员将使用临时工。请基于问题2的预测结果建立模型,给出未来 30 天每个分拣中心每个班次的出勤人数,并写入结果表5中。要求在每天的货量处理完成的基础上,安排的人天数(例如30天每天出200名员工,则总人天数为 6000)尽可能少,且每天的实际小时人效尽量均衡。

优化模型,极值问题的求解。根据问题二的结果设置目标函数、决策变量、约束条件即可。优化模型问什么设什么因此直接可以设置目标函数:最小化总人天数Z ,

决策变量:

xij​:第 i 天第 j 个班次的正式工人数。

yij​:第 i 天第 j 个班次的临时工人数

总人天数Z=∑∑(xij+yij)

约束条件  每班次的总分拣量不能少于预测货量

          正式工使用不超过60人

人员非负性约束

正式工每天最多出勤一个班次

对于这些约束条件,我们需要设置一些变量进行表述

参数:

P:正式工的最高小时人效(25包裹/小时)。

T:临时工的最高小时人效(20包裹/小时)。

Ci​:第 i 天每个分拣中心的预测货量。

N:每个分拣中心的正式工人数(60名)。

每班次的总分拣量不能少于预测货量。

Pxij+yijT≥6Ci​​∀i,j

正式工使用不超过60人。

xi,j≤60∀i,j

人员非负性约束。

∀,xi,j≥0,yi,j≥0∀i,j

正式工每天最多出勤一个班次。

∑xi,j,k≤1∀i,k

问题4:研究特定分拣中心的排班问题,这里不妨以SC60为例,假设分拆中心 SC60 当前有 200名正式工,请基于问题2的预测结果建立模型,确定未来 30 天每名正式工及临时工的班次出勤计划,即给出未来 30 天每天六个班次中,每名正式工将在哪些班次出勤,每个班次需要雇佣多少临时工,并写入结果表6中。每名正式工的出勤率(出的天数除以总天数30)不能高于 85%,且连续出勤天数不能超过7天。要求在每天货量处理完成的基础上,安排的人天数尽可能少,每天的实际小时人效尽量均衡且正式工出勤率尽量均衡。

对于问题四,与问题三相同需要进入一些新的约束条件。主要在于出勤率尽量均衡,两种考虑方式 其一可以引入平衡因子,将其作为目标函数的一项目标函数:最小化总人天数,并尽量平衡正式工的出勤率。

Minimize1∑yi,j+λ×StdDev(Attendance Rate)

其中,λ 是平衡因子,StdDev是出勤率的标准差。

这种方式λ 不好确定,也可以采用将出勤率尽量均衡试做是一个约束条件,我们可以设置出勤率的标准差在一定区间内

参数:

P:正式工的最高小时人效(25包裹/小时)。

T:临时工的最高小时人效(20包裹/小时)。

Ci​:第 i 天SC60的预测货量。

N:SC60的正式工人数(200名)。

决策变量:

xi,j,k​:第 i 天第 j 个班次是否有第 k 名正式工出勤(二元变量,0或1)。

yi,j​:第 i 天第 j 个班次需要雇佣的临时工人数。

约束条件:

每班次的总分拣量不少于预测货量。

∑xi,j,k×P+yi,j×T≥6Ci​​∀i,j

正式工每天最多出勤一个班次。

∑xi,j,k≤1∀i,k

正式工的出勤率不能超过85%。

∑∑xi,j,k≤25.5∀k

正式工连续出勤天数不超过7天。

人员非负性约束。

yi,j≥0∀i,j

正式工出勤率尽量均衡

StdDev(Attendance Rate)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Git教程】(十二)工作流之项目设置 — 何时使用工作流,工作流的结构,项目设置概述、执行过程及其实现 ~

Git教程 工作流之项目设置 1️⃣ 何时使用工作流2️⃣ 工作流的结构3️⃣ 概述4️⃣ 使用要求5️⃣ 执行过程及其实现5.1 基于项目目录创建一个新的版本库5.2 以文件访问的方式共享版本库5.3 用 Git daemon 来共享版本库5.4 用 HTTP 协议来共享版本库5.5 用 SSH 协议来共享版…

KubeSphere 社区双周报|2024.03.29-04.11

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

【服务器部署篇】Linux下Jenkins安装和配置

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是,产…

✌2024/4/1—力扣—按摩师✌

代码实现&#xff1a; 思路&#xff1a;打家劫舍题 int massage(int *nums, int numsSize) {if (nums NULL || numsSize 0) {return 0;}if (numsSize 1) {return nums[0];}int dp[numsSize];memset(dp, 0, sizeof(dp));dp[0] nums[0];dp[1] (nums[0] < nums[1] ? nums…

【网络初识】网络相关概念详解

一.局域网VS广域网 局域网 局域网:Local Area Network~简称LAN.指在某一特定区域内由多台计算机组成的互联网组。局域网内的主机之间能方便的进行网络通信&#xff0c;又称为内网.局域网和局域网之间在没有连接的情况下&#xff0c;是无法通信的。局域网的组建方式: 基于网线…

Docker 集成 redis,并在nacos进行配置时需要注意点

安装redis镜像 docker pull redis:6.0.6redis配置文件 创建相关配置文件 mkdir /apps/redis cd /apps/redis touch redis.conf vim redis.confredis.conf内容&#xff1a; #开启保护 protected-mode yes #开启远程连接 bind 0.0.0.0 #自定义密码 port 6379 timeout 0 # 900s内…

网络协议学习——以太网协议

目录 ​编辑 一&#xff0c;以太网简介 二&#xff0c;以太网通信的过程 为什么不用IP地址&#xff1f; 过程 MAC帧 MAC帧的字段介绍 ARP协议 传输过程的一些问题 RARP协议 提高效率 三&#xff0c;其他问题 ARP诈骗问题 URL解析过程 一&#xff0c;以太网简介 …

【优选算法专栏】专题十:哈希表(一)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

【线段树 有序映射】715. Range 模块

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

谷歌pixel6/7pro等手机WiFi不能上网,显示网络连接受限

近期在项目中遇到一个机型出现的问题,先对项目代码进行排查,发现别的设备都能正常运行,就开始来排查机型的问题,特意写出来方便后续查看,也方便其它开发者来自查。 设备机型:Pixel 6a 设备安卓版本:13 该方法无需root,只需要电脑设备安装adb(即Android Debug Bridge…

计算机网络---第九天

以太网交换机的工作原理 以太网定义&#xff1a; 定义&#xff1a;输出标准Ethernet2类型帧的网络 以太网特征&#xff1a; 特征&#xff1a;多路访问&#xff0c;广播式的网络 mac地址: 每台设备都有一个唯一的物理地址&#xff0c;全球唯一 48位长度&#xff0c;16禁止…

数显IC/点阵数显驱动芯片/抗干扰数显驱动-VK1Q60 QFN16L 8×4点阵

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1Q60 封装形式&#xff1a;QFN16L 概述 VK1Q60是一种带键盘扫描电路接口的 LED 驱动控制专用芯片&#xff0c;内部集成有数据锁存 器、LED 驱动、键盘扫描等电路。SEG脚接LED阳极&#xff0c;GRID脚接LED阴极&…

GPT-4 Turbo with Vision 提高‮写了‬作、数学、逻‮推辑‬理和编码能力

新版 GPT-4 Turbo 今‮开天‬始现‮向已‬所有付费 ChatGPT 用‮开户‬放。GPT-4 Turbo提高‮写了‬作、数学、逻‮推辑‬理和编码能力。具有128k上下文窗口&#xff0c;可以处理超过300页的文本&#xff0c;输出‮度速‬更快。 现‮已在‬经开始‮续陆‬推送&#xff0c;如果…

「seata」分布式事务seata部署及应用

「seata」分布式事务seata部署及应用 seata 版本一、部署seata服务1、配置config.txt文件中的属性值2、为seata服务单独创建一个nacos命名空间3、利用脚本上传配置文件到nacos4、配置seata服务的application.yml6、执行数据库脚本5、使用脚本启动seata服务 二、配置并启动微服务…

品牌发言稿怎么写?媒介盒子分享

品牌发言稿的重要性不言而喻&#xff0c;它不仅代表着品牌形象&#xff0c;更是沟通品牌与消费者、合作伙伴的桥梁。如何撰写一篇高质量的品牌发言稿&#xff0c;成为许多品牌关注的焦点。今天媒介盒子来和大家聊聊&#xff1a;品牌发言稿怎么写。 一、 发言稿写作技巧 1.结构…

MQTT的学习

近期构建物联网平台&#xff0c;学习到MQTT&#xff0c;这里使用的是uniapp作为连接MQTT broker的&#xff0c;这里使用的是国产的EMQX。 MQTT的认识 MQTT 协议入门&#xff1a;基础知识和快速教程 | EMQ&#xff08;简单的认识&#xff09; 创建 MQTT 连接时如何设置参数&am…

UI自动化测试案例

备注:本文为博主原创文章,未经博主允许禁止转载。如有问题,欢迎指正。 个人笔记(整理不易,有帮助,收藏+点赞+评论,爱你们!!!你的支持是我写作的动力) 笔记目录:笔记本~笔记目录_airtest和selenium那个好用-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪…

如何应对app应用程序或者网站常见的几种攻击类型

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天&#xff0c;我想和大家聊聊一个我们日常生活中经常遇到的问题——如何应对app或者网站常见的几种攻击类型。随着互联网的普及&#xff0c;app和网站已经成为我们获取信息、交流互动的重要平台。然而&#xff0c;这些平台也时常…

Vue.js组件精讲 第2章 基础:Vue.js组件的三个API:prop、event、slot

如果您已经对 Vue.js 组件的基础用法了如指掌&#xff0c;可以跳过本小节&#xff0c;不过当做复习稍读一下也无妨。 组件的构成 一个再复杂的组件&#xff0c;都是由三部分组成的&#xff1a;prop、event、slot&#xff0c;它们构成了 Vue.js 组件的 API。如果你开发的是一个…

360AI搜索爆火,位居三月全球AI新品增速榜榜首

近日&#xff0c;独立AI产品榜单“AI产品榜&#xff08;aicpb.com&#xff09;”发布最新全球AI新品增速榜单&#xff0c;该榜单数据显示&#xff0c;360AI搜索位居三月新品增速榜榜首&#xff0c;3月访问量环比增加1798.76%。360集团另一款AI产品360苏打办公也同时上榜&#x…