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 l2model = 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)

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

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

相关文章

数据结构基础 ——数组VS链表(二)

一、数组 数组对应的英文是array,是有限个相同类型的变量所组成的有序集合,数组中的每一个变量称为元素。数组是最简单、最常用的数据结构。 数组存储格式: 在Python语言中,并没有直接使用数组这个概念,而是使用列表(…

投资认知第一篇-股票分红是怎么回事?

购买股票的收益分为两种,一种是低价买高价卖的差价(也就是俗称的炒股),另一种就是分红收益。购买一家上市公司的股份,投资者有权享受其分红,这是投资者的权益。一般来讲,上市公司分红有两种形式…

重磅,新GPT-4-Turbo重新夺回大模型第一名

好消息,新版 GPT-4 Turbo 今天开始现已向所有付费 ChatGPT 用户开放。GPT-4 Turbo提高了写作、数学、逻辑推理和编码能力。上下文长度128k 输出速度更快。现在已经开始陆续推送,如果你发现你的知识库截止时间是2024年4月,那么就是最新版本了&…

蓝桥杯 — — RSA解密

RSA解密 友情链接:RSA解密 题目: 思路: 对于这道题目,给出了三个已知量n d C,要我们进行解密,对于解密的公式 X C e m o d n X C^e \mod n XCemodn来讲,我们有唯一的参数e是未知的&#xf…

.[[backup@waifu.club]].svh勒索病毒数据怎么处理|数据解密恢复

尊敬的读者: 近年来,随着信息技术的迅猛发展,网络安全问题日益凸显,其中勒索病毒成为了一大威胁。.[[backupwaifu.club]].svh、.[[MyFilewaifu.club]].svh勒索病毒就是其中之一,它以其独特的传播方式和恶劣的加密手段…

【论文阅读——Profit Allocation for Federated Learning】

1.摘要 由于更为严格的数据管理法规,如《通用数据保护条例》(GDPR),传统的机器学习服务生产模式正在转向联邦学习这一范式。联邦学习允许多个数据提供者在其本地保留数据的同时,协作训练一个共享模型。推动联邦学习实…

山洪灾害防治监测报警系统方案

一、概述 我国是全球地区复杂程度最高的国家之一,多种气候和地形特征,特定的地质环境条件决定了我国地质灾害呈现增长和频发的态势。加之全球气候的变化使得我国极端、恶劣的天气在各地区发生的频率逐渐增高。据统计,在中国有1300多个乡镇&am…

交换机与路由器缓冲区:寻找完美大小

*本文系SDNLAB编译自瞻博网络技术专家兼高级工程总监Sharada Yeluri领英 在路由器和交换机中,缓冲区至关重要,可以防止网络拥塞期间的数据丢失。缓冲区到底要多大?这个问题在学术界和工业界一直备受争议。本文探讨了高端路由器中数据包缓冲的…

PSPICE、Multisim和Saber哪个更适合电路仿真?没想到是它

PSPICE、Multisim和Saber这三个软件都是非常流行的模拟电路仿真工具,它们各自有各自的优缺点,我简单讲一下: PSPICE: 优点: 精度高:PSPICE是专业的电路仿真软件,可以进行高精度的模拟电路仿真…

关于DNS解析那些事儿,了解DNS解析的基础知识

DNS,全称Domain Name System域名系统,是一个将域名和IP地址相互映射的一个分布于世界各地的分布式数据库,而DNS解析就是将域名转换为IP地址的过程,使人们可以轻松实现通过域名访问网站。DNS解析是网站建设非常关键的一步&#xff…

深度学习在三维点云处理与三维重建中的应用探索

目录 点云数据处理 数据清洗 数据降噪和简化 数据配准 特征提取 数据增强 数据组织 性能考量 PointNet PointNet ​编辑 算法问题 改进方法 三维重建 重建算法 架构模块 流程步骤 标记说明 优点和挑战 点云数据处理 数据清洗 去噪:点云数据通常…

数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!)

前言:学习完了C语言的基础知识点之后,我们就需要使用我们所学的知识来进一步对存储在内存中的数据进行操作,这时候我们就需要学习数据结构。而这篇文章为数据结构中顺序表的讲解。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以…

一、OpenCvSharp环境搭建

一、Visual Studio 创建新项目 二、选择Windows窗体应用(.NET Framework) 直接搜索模板:Windows窗体应用(.NET Framework) 记得是C#哈,别整成VB(Visual Basic)了 PS:若搜索搜不到,直接点击安装多个工具和…

MemoryAnalyzer分析OpenJ9上的phd格式文件

在做excel大数据写入时,发生内存泄漏 core.20240412.093703.1.0001.dmp heapdump.20240412.093703.1.0002.phd需要分析heap dump文件 mat本身不支持,需要我们下载插件 https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/runtimes/tools…

同等学力申硕-计算机专业-历年真题及其他资料分享

同等学力申请硕士学位考试是比较适合在职人员的提升学位方式,了解过的人应该都知道,现在社会的竞争压力越来越大,为了提高职业生存能力,提升学位在所难免。 我将与大家分享一份珍贵的复习资料:这不仅是我个人备考的心…

Docker Desktop修改镜像存储路径 Docker Desktop Start ... 卡死

1、CMD执行wsl -l -v --all 2、Clean / Purge data 3、导出wsl子系统镜像: wsl --export docker-desktop D:\docker\wsl\distro\docker-desktop.tar wsl --export docker-desktop-data D:\docker\wsl\data\docker-desktop-data.tar4、删除现有的wsl子系统: wsl -…

Springboot集成RabbitMq+延时队列

1. 引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置yml 2.1 配置生产者yml spring:rabbitmq:host: localhostport: 5672virtual-host: …

主题换肤操作

有许多项目会遇见有light和dark多种颜色方案展示&#xff0c;如下&#xff1a; 这种是怎么实现的呢&#xff1f; 方案1&#xff1a;采用css变量来实现 /* 默认粉色主题 */ :root {--underline-dark: #000d8a;--gray-light: 229, 233, 240;--gray-dark: 34, 41, 57;--black: 1…

华为远程登陆管理配置:轻松掌握核心要点

实验拓扑及需求 实验步骤 A、配置相关地址及连通性测试 R1&#xff1a; [R1]int GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.12.1 24 R2&#xff1a; [R2]int gi 0/0/0 [R2-GigabitEthernet0/0/0]ip add 192.168.12.2 24 [R2]int gi 0/0/1 […

如何将对象转换成json字符串,以json格式输出,并获取到其中的特定字段

小王学习录 Json格式示例 1&#xff1a;简单的 JSON 对象示例 2&#xff1a;JSON 对象嵌套示例 3&#xff1a;JSON 数组示例 4&#xff1a;混合使用对象和数组 使用Gson将java对象转换成json字符串哪些数据类型的对象可以使用Gson转换为json字符串如何使用Gson将java对象转换成…