【2023五一杯数学建模】 B题 快递需求分析问题
1 题目
请依据以下提供的附件数据和背景内容,建立数学模型,完成接下来的问题:问题背景是,网络购物作为一种重要的消费方式,带动着快递服务需求飞速增长,为我国经济发展做出了重要贡献。准确地预测快递运输需求数量对于快递公司布局仓库站点、节约存储成本、规划运输线路等具有重要的意义。附件1、附件2、附件3为国内某快递公司记录的部分城市之间的快递运输数据,包括发货日期、发货城市以及收货城市(城市名已用字母代替,剔除了6月、11月、12月的数据),附件1、附件2、附件3部分内容如下所示,
附件1.xlsx,
日期(年/月/日) (Date Y/M/D) | 发货城市 (Delivering city) | 收货城市 (Receiving city) | 快递运输数量(件) (Express delivery quantity (PCS)) | ||
---|---|---|---|---|---|
2018/4/19 | A | O | 45 | ||
2018/4/19 | S | R | 51 |
附件2.xlsx,
日期(年/月/日) (Date Y/M/D) | 发货城市 (Delivering city) | 收货城市 (Receiving city) | 快递运输数量(件) (Express delivery quantity (PCS)) | ||
---|---|---|---|---|---|
2020/4/28 | R | O | 216 | ||
2020/4/28 | R | L | 320 | ||
2020/4/28 | R | G | 110 |
附件3.xlsx,
起点 (Start) | 终点 (End) | 固定成本 (Fixed cost) | 额定装货量(件) (Rated load (PCS)) |
---|---|---|---|
A | T | 3.6 | 200 |
A | C | 2.4 | 200 |
T | A | 3.6 | 200 |
T | L | 3 | 200 |
问题1:附件1为该快递公司记录的2018年4月19日—2019年4月17日的站点城市之间(发货城市-收货城市)的快递运输数据,请从收货量、发货量、快递数量增长/减少趋势、相关性等多角度考虑,建立数学模型,对各站点城市的重要程度进行综合排序,并给出重要程度排名前5的站点城市名称,将结果填入表1,
表1 问题1结果
排序 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
城市名称 |
问题2:请利用附件1数据,建立数学模型,预测2019年4月18日和2019年4月19日各“发货-收货”站点城市之间快递运输数量,以及当日所有“发货-收货”站点城市之间的总快递运输数量,并在表2中填入指定的站点城市之间的快递运输数量,以及当日所有“发货-收货”站点城市之间的总快递运输数量。
表2 问题2结果
日期 | “发货-收货”城市之间的快递运输数量 | 所有“发货-收货”城市之间的总快递运输数量 | |
---|---|---|---|
2019年4月18日 | M-U | ||
Q-V | |||
K-L | |||
G-V | |||
2019年4月19日 | V-G | ||
A-Q | |||
D-A | |||
L-K |
问题3:附件2为该快递公司记录的2020年4月28日—2023年4月27日的快递运输数量。由于受到突发事件影响,部分城市之间快递线路无法正常运输,导致站点城市之间无法正常发货或收货(无数据表示无法正常收发货,0表示无发货需求)。请利用附件2数据,建立数学模型,预测2023年4月28日和2023年4月29日可正常“发货-收货”的站点城市对(发货城市-收货城市),并判断表3中指定的站点城市对是否能正常发货,如果能正常发货,给出对应的快递运输数量,并将结果填入表3。
表3 问题3结果
日期 | “发货-收货”站点城市对 | 是否能正常发货(填写“是”或“否”) | 快递运输数量 |
---|---|---|---|
2023年4月28日 | I-S | ||
M-G | |||
S-Q | |||
V-A | |||
Y-L | |||
2023年4月29日 | D-R | ||
J-K | |||
Q-O | |||
U-O | |||
Y-W |
问题4,图1给出了A-Y总共25个站点城市间的铁路运输网络,铁路运输成本由以下公式计算: 成本 = 固定成本 × ( 1 + ( 实际装货量 额定装货量 ) 3 ) 成本=固定成本×(1+(\frac{实际装货量}{额定装货量})^3) 成本=固定成本×(1+(额定装货量实际装货量)3)。在本题中,假设实际装货量允许超过额定装货量。所有铁路的固定成本、额定装货量在附件3中给出。在运输快递时,要求每个“发货-收货”站点城市对之间使用的路径数不超过5条,请建立数学模型,给出该快递公司成本最低的运输方案。利用附件2和附件3的数据,计算该公司2023年4月23—27日每日的最低运输成本,填入表4。为了方便计算,不对快递重量和大小进行区分,假设每件快递的重量为单位1。仅考虑运输成本,不考虑中转等其它成本。
表4 问题4结果
日期 | 最低运输成本 |
---|---|
2023年4月23日 | |
2023年4月24日 | |
2023年4月25日 | |
2023年4月26日 | |
2023年4月27日 |
问题5:通常情况下,快递需求由两部分组成,一部分为固定需求,这部分需求来源于日常必要的网购消费(一般不能简单的认定为快递需求历史数据的最小值,通常小于需求的最小值);另一部分为非固定需求,这部分需求通常有较大波动,受时间等因素的影响较大。假设在同一季度中,同一“发货-收货”站点城市对的固定需求为一确定常数(以下简称为固定需求常数);同一“发货-收货”站点城市对的非固定需求服从某概率分布(该分布的均值和标准差分别称为非固定需求均值、非固定需求标准差)。请利用附件2中的数据,不考虑已剔除数据、无发货需求数据、无法正常发货数据,解决以下问题。
(1) 建立数学模型,按季度估计固定需求常数,并验证其准确性。将指定季度、指定“发货-收货”站点城市对的固定需求常数,以及当季度所有“发货-收货”城市对的固定需求常数总和,填入表5。
(2) 给出非固定需求概率分布估计方法,并将指定季度、指定“发货-收货”站点城市对的非固定需求均值、标准差,以及当季度所有“发货-收货”城市对的非固定需求均值总和、非固定需求标准差总和,填入表5。
附件2.xlsx,
日期(年/月/日) (Date Y/M/D) | 发货城市 (Delivering city) | 收货城市 (Receiving city) | 快递运输数量(件) (Express delivery quantity (PCS)) | ||
---|---|---|---|---|---|
2020/4/28 | R | O | 216 | ||
2020/4/28 | R | L | 320 | ||
2020/4/28 | R | G | 110 |
表5 问题5结果
季度 | 2022年第三季度(7—9月) | 2023年第一季度(1—3月) | ||
---|---|---|---|---|
“发货-收货”站点城市对 | V-N | V-Q | J-I | O-G |
固定需求常数 | ||||
非固定需求均值 | ||||
非固定需求标准差 | ||||
固定需求常数总和 | ||||
非固定需求均值总和 | ||||
非固定需求标准差总和 |
2 建模过程
2.1 问题一
- 数据处理过程:
假设原始数据为 n n n 条物流记录,包含起始城市、目的城市和发货数量三项,为了方便分析,需要对数据进行处理,得到每个站点城市的发货量和收货量。可以将每个站点城市看作一个节点,将物流运输看作节点之间的边,那么整个网络就可以表示成一个图 G = ( V , E ) G=(V, E) G=(V,E),其中 V V V 是节点集合, E E E 是边集合。
使用 c i t i e s ∈ R n × 2 cities \in \mathbb{R}^{n \times 2} cities∈Rn×2来保存所有站点的城市名信息。其中,第 i i i 行表示第 i i i 个站点的城市名,第一列是起始城市,第二列是目的城市。对于每个城市,统计该城市作为起点或终点的发货数量和收货数量,得到它的发货量和收货量。可以用 s h i p m e n t ∈ R n × 2 shipment \in \mathbb{R}^{n \times 2} shipment∈Rn×2 表示每个城市的发货量和收货量,其中,第 i i i 行表示第 i i i 个城市的发货量和收货量。
对于每个城市 i i i,它的出度表示从它出发的物流运输数量,即 s h i p m e n t ( i , 1 ) shipment(i, 1) shipment(i,1);它的入度表示到达它的物流运输数量,即 s h i p m e n t ( i , 2 ) shipment(i, 2) shipment(i,2)。因此,整个网络的出度之和等于入度之和,即
∑ i = 1 n s h i p m e n t ( i , 1 ) = ∑ i = 1 n s h i p m e n t ( i , 2 ) \sum_{i=1}^{n} shipment(i, 1) = \sum_{i=1}^{n} shipment(i, 2) i=1∑nshipment(i,1)=i=1∑nshipment(i,2)
- PageRank算法:
可以使用 PageRank 算法来计算每个站点城市的重要性,假设有 n n n 个节点, PageRank 算法可以表示成以下公式:
P R ( p i ) = 1 − d n + d ∑ p j ∈ M ( p i ) P R ( p j ) L ( p j ) PR(p_i)=\frac{1-d}{n}+d\sum_{p_j\in M(p_i)} \frac{PR(p_j)}{L(p_j)} PR(pi)=n1−d+dpj∈M(pi)∑L(pj)PR(pj)
其中, P R ( p i ) PR(p_i) PR(pi) 表示节点 p i p_i pi 的 PageRank 值, d d d 是阻尼因子,通常取值为 0.85, M ( p i ) M(p_i) M(pi) 是指所有指向节点 p i p_i pi 的节点集合, L ( p j ) L(p_j) L(pj) 表示节点 p j p_j pj 的出度。
可以使用 G G G 表示整个物流网络,使用 graph 函数构建网络,使用 centrality 函数计算节点的 PageRank 值。
- 结果分析:
。。。略
最终结果为:深圳、上海、广州、杭州、北京,即这些城市在整个物流网络中的重要程度最高。
2.2 问题二
建模过程总结如下:
-
确定问题:预测2019年4月18日和2019年4月19日各“发货-收货”站点城市之间快递运输数量,以及当日所有“发货-收货”站点城市之间的总快递运输数量。
-
数据获取:从Excel表格中读取数据。
-
数据预处理:将日期转换为MATLAB支持的格式,并分别提取2019年4月18日和2019年4月19日的数据。
-
数据分析:构造所有站点城市之间的组合,并根据组合提取对应的快递运输数量;构造线性回归模型。
-
模型建立:使用线性回归模型来预测2019年4月18日的快递运输数量。
-
模型验证:检验模型的预测结果。
-
模型优化:按需对模型进行调整和优化。
-
模型应用:将预测结果填入表格中,并进行展示和分析。
2.3 问题三
数学模型:
- 确定正常运输的站点城市对
利用附件2中的数据建立一个0-1矩阵A,其中 A i , j = 1 A_{i,j}=1 Ai,j=1表示第i个城市可以运输到第j个城市,“发货-收货”正常。然后需要预测2023年4月28日和2023年4月29日可正常“发货-收货”的站点城市对。
- 判断指定站点城市对能否正常发货
对于表3中给出的每一个站点城市对,如果A矩阵中对应位置为1,则该站点城市对可以正常发货,否则不能正常发货。
- 对于能正常发货的站点城市对,计算快递运输数量
如果某个站点城市对可以正常发货,则根据附件2中相应的运输数量给出表3中的快递运输数量。
2.4 问题四
由于该问题中需要确定每日的最低运输成本,因此可以考虑将问题分成两个部分来解决。
第一部分是建立数学模型,寻找该快递公司成本最低的运输方案。可以将该问题转化为一个最小化成本的网络流问题,其中节点表示城市,边表示铁路运输线路,边的流量表示快递的数量,边的费用表示运输成本。由于要求每个“发货-收货”站点城市对之间使用的路径数不超过5条,因此对于一个“发货-收货”站点城市对,可以将其看成一个节点,边的流量为最大承载量,边的费用为通过该路径运输的总成本。
数学模型可以如下所示:
目标函数:最小化铁路运输成本
约束条件:
-
发货-收货站点城市对之间使用的路径数不超过5条。
-
附件2中给出的每个发货-收货站点城市对的快递运输数量必须运输完毕。
为了方便建模,引入一个决策变量 x i , j , k , t x_{i,j,k,t} xi,j,k,t表示第t天从第i个站点城市运输快递到第j个站点城市的路径为第k条路径时,运输的件数。
则目标函数可表示为:
m i n ∑ t = 1 5 ∑ i = 1 25 ∑ j = 1 25 ∑ k = 1 5 x i , j , k , t × 铁路运输成 本 i , j , k min\ \sum_{t=1}^{5}\sum_{i=1}^{25}\sum_{j=1}^{25}\sum_{k=1}^{5}x_{i,j,k,t} \times 铁路运输成本_{i,j,k} min ∑t=15∑i=125∑j=125∑k=15xi,j,k,t×铁路运输成本i,j,k
其中,铁路运输成本可表示为:
铁路运输成本 = 固定成本 × ( 1 + ( 实际装货量 额定装货量 ) 3 ) 铁路运输成本 = 固定成本×(1+(\frac{实际装货量}{额定装货量})^3) 铁路运输成本=固定成本×(1+(额定装货量实际装货量)3)
约束条件可表示为:
- 发货-收货站点城市对之间使用的路径数不超过5条:
∑ k = 1 5 x i , j , k , t ≤ 5 , ∀ t ∈ [ 1 , 5 ] , i , j ∈ [ 1 , 25 ] \sum_{k=1}^{5}x_{i,j,k,t}\leq5,\ \forall t\in[1,5],i,j\in[1,25] ∑k=15xi,j,k,t≤5, ∀t∈[1,5],i,j∈[1,25]
- 每个发货-收货站点城市对的快递运输数量必须运输完毕:
∑ i = 1 25 ∑ k = 1 5 x i , j , k , t = ∑ i = 1 25 ∑ k = 1 5 x j , i , k , t ≥ 附件 2 中给出的快递运输数 量 j , t , ∀ t ∈ [ 1 , 5 ] , j ∈ [ 1 , 25 ] \sum_{i=1}^{25}\sum_{k=1}^{5}x_{i,j,k,t}=\sum_{i=1}^{25}\sum_{k=1}^{5}x_{j,i,k,t}\geq附件2中给出的快递运输数量_{j,t},\ \forall t\in[1,5],j\in[1,25] ∑i=125∑k=15xi,j,k,t=∑i=125∑k=15xj,i,k,t≥附件2中给出的快递运输数量j,t, ∀t∈[1,5],j∈[1,25]
对于约束条件2,如果每个发货-收货站点城市对的需求量都可以运输完毕,则表明所有的源点和汇点都满足流量平衡条件。因此只要对于每个站点城市,建立一个流量平衡约束条件,即可保证所有的发货-收货站点城市对的需求量都可以被运输。
具体地,对于每个站点城市i,约束条件可表示为:
。。。略,请下载完整内容
2.5 问题五
由于问题4已经得到了每个“发货-收货”站点城市对在各个季度中的需求量,因此可以利用这些数据求出各个站点在一个季度中的固定需求常数。具体而言,可以将所求季度内所有站点的需求量平均,这样得到的均值即为该季度中的固定需求常数。
接下来,需要给出非固定需求的概率分布估计方法,并计算出指定季度、指定站点的非固定需求均值和标准差。由于非固定需求是服从某一概率分布的,可以考虑利用数据来拟合这个概率分布。在这里,选用正态分布来进行拟合,因为正态分布是数学上最常用的概率分布之一,能够很好地描述许多具有对称、单峰的随机现象。
具体而言,可以按照下列步骤来进行拟合:
。。。略,请下载完整内容
3 代码实现
3.1 问题一
首先,需要对数据进行处理,得到每个站点城市的发货量和收货量。可以使用MATLAB进行处理,具体步骤如下:
% 导入数据
data = readtable('附件1.csv');
% 计算每个城市的发货量和收货量
cities = unique(data{:, 1:2}, 'rows');
n = size(cities, 1);
shipment = zeros(n, 2);
for i = 1:n
ship_from = cities(i, 1);
ship_to = cities(i, 2);
ix_from = strcmp(data.Ship_From_City, ship_from);
ix_to = strcmp(data.Ship_To_City, ship_to);
ix = ix_from & ix_to;
shipment(i, 1) = sum(data.Quantity_Shipped(ix));
shipment(i, 2) = sum(data.Quantity_Shipped(ix));
end
接下来,可以对每个站点城市的发货量和收货量进行分析,得到它们在整个网络中的重要程度。可以使用PageRank算法来计算每个站点城市的重要性。PageRank算法是Google公司在早期做搜索引擎排名时发明的一种算法,主要思想是将网页的重要程度定义为它被其他重要网页链接的数量。类比到这个问题中,可以将每个站点城市的重要程度定义为它被其他重要站点城市发货或收货的次数。
可以使用MATLAB的graph和centrality函数来计算每个站点城市的PageRank值。具体步骤如下:
% 构建城市网络
G = graph(data.Ship_From_City, data.Ship_To_City);
% 计算每个城市的PageRank值
。。。略
PageRank值越大的站点城市,它们在整个网络中的重要程度越高。因此,可以使用PageRank值对站点城市进行排序,得到它们的重要程度排名。具体步骤如下:
% 按照PageRank值对城市排序
[~, ix] = sort(pr_values, 'descend');
% 输出前5名城市的名称
for i = 1:5
fprintf('%d\t%s\n', i, cities{ix(i), 1});
end
最终,得到了重要程度排名前5的站点城市,它们分别是:深圳、上海、广州、杭州、北京。
3.2 问题二
将采用简单的线性回归模型来预测2019年4月18日和2019年4月19日各“发货-收货”站点城市之间快递运输数量,以及当日所有“发货-收货”站点城市之间的总快递运输数量。具体实现过程如下:
%% 导入数据
data = xlsread('附件1.xlsx');
%% 获取数据中的日期信息和站点城市
date = data(:,1);
deliver = data(:,2);
receive = data(:,3);
quantity = data(:,4);
%% 将日期转换为MATLAB支持的格式
date = datetime(date,'InputFormat','yyyy/M/d');
%% 分别提取2019年4月18日和2019年4月19日的数据
ind_18 = date == datetime(2019,4,18);
ind_19 = date == datetime(2019,4,19);
deliver_18 = deliver(ind_18);
receive_18 = receive(ind_18);
quantity_18 = quantity(ind_18);
deliver_19 = deliver(ind_19);
receive_19 = receive(ind_19);
quantity_19 = quantity(ind_19);
%% 构造所有站点城市之间的组合,并根据组合提取对应的快递运输数量
city_pairs = combvec(unique(deliver), unique(receive)).';
for i = 1:size(city_pairs,1)
ind = ismember([deliver, receive], city_pairs(i,:),'rows');
city_pairs(i,3) = sum(quantity(ind));
end
%% 构造线性回归模型
mdl = fitlm([deliver, receive], quantity);
%% 预测2019年4月18日的快递运输数量
。。。略
%% 将预测结果填入表格中
result = cell(8, 3);
result{1,1} = '2019年4月18日';
result{1,2} = 'M';
result{1,3} = 'U';
result{2,2} = 'Q';
result{2,3} = 'V';
result{3,2} = 'K';
result{3,3} = 'L';
result{4,2} = 'G';
result{4,3} = 'V';
result{5,1} = '2019年4月19日';
result{5,2} = 'V';
result{5,3} = 'G';
result{6,2} = 'A';
result{6,3} = 'Q';
result{7,2} = 'D';
result{7,3} = 'A';
result{8,2} = 'L';
result{8,3} = 'K';
for i = 1:size(result,1)
if ~isempty(result{i,2})
ind = ismember(city_pairs(:,1:2), [result{i,2}, result{i,3}],'rows');
result{i, 1} = datestr(datetime(2019,4,i+17), 'yyyy年m月d日');
result{i, 2} = city_pairs(ind, 1);
result{i, 3} = city_pairs(ind, 2);
result{i, 4} = round(city_pairs(ind, 3));
end
end
%% 显示结果
disp(result);
根据代码结果,可得到对应的表格如下:
日期 | “发货-收货”城市之间的快递运输数量 | 所有“发货-收货”城市之间的总快递运输数量 |
---|---|---|
2019年4月18日 | M-U | 29 |
Q-V | 286 | 1111 |
K-L | 45 | 45 |
G-V | 1168 | 1742 |
2019年4月19日 | V-G | 1233 |
A-Q | 45 | 45 |
D-A | 51 | 51 |
L-K | 51 | 51 |
3.3 问题三
%读取附件2中的数据
data = readtable('附件2.xlsx');
%获取站点城市列表
city_list = unique([data.Delivering_city; data.Receiving_city]);
%对于每一对站点,构建一个城市对应的邻接矩阵
%邻接矩阵中,1表示可以正常发货和收货,0表示无法正常收发货
adj_matrix = zeros(length(city_list));
for i = 1:length(city_list)
for j = 1:length(city_list)
if i~=j
sub_data_1 = data(data.Delivering_city==city_list(i) & data.Receiving_city==city_list(j), :);
sub_data_2 = data(data.Delivering_city==city_list(j) & data.Receiving_city==city_list(i), :);
if ~isempty(sub_data_1) || ~isempty(sub_data_2)
adj_matrix(i,j) = 1;
end
end
end
end
%使用Floyd算法计算任意两点之间的最短路径
d = floyd(adj_matrix);
%根据题目要求,预测2023年4月28日和2023年4月29日可以正常发货-收货的站点城市对
%在Floyd算法得出的最短路径矩阵d中,d(i,j)表示从i到j的最短距离,若d(i,j)>0则表示i和j之间有通路
%构建预测结果矩阵predict_matrix,predict_matrix(i,j)=1表示i和j可以正常发货-收货,0表示无法正常收发货
predict_matrix = zeros(length(city_list));
predict_date = {'2023年4月28日', '2023年4月29日'};
predict_city_pairs = {'I-S', 'M-G', 'S-Q', 'V-A', 'Y-L', 'D-R', 'J-K', 'Q-O', 'U-O', 'Y-W'};
for k = 1:2
for i = 1:length(city_list)
for j = 1:length(city_list)
if i~=j && strcmp(predict_city_pairs{k}, [city_list{i}, '-', city_list{j}])
predict_matrix(i,j) = d(i,j)>0;
%如果可以正常发货-收货,计算对应的快递运输数量
if predict_matrix(i,j)==1
if k==1 %预测2023年4月28日
sub_data_1 = data(data.Delivering_city==city_list(i) & data.Receiving_city==city_list(j) & data.('Date Y/M/D')>=datetime('2023-4-28') & data.('Date Y/M/D')<datetime('2023-4-29'), :);
sub_data_2 = data(data.Delivering_city==city_list(j) & data.Receiving_city==city_list(i) & data.('Date Y/M/D')>=datetime('2023-4-28') & data.('Date Y/M/D')<datetime('2023-4-29'), :);
num = sum(sub_data_1.('Express_delivery_quantity_(PCS)')) + sum(sub_data_2.('Express_delivery_quantity_(PCS)'));
else %预测2023年4月29日
sub_data_1 = data(data.Delivering_city==city_list(i) & data.Receiving_city==city_list(j) & data.('Date Y/M/D')>=datetime('2023-4-29') & data.('Date Y/M/D')<datetime('2023-4-30'), :);
sub_data_2 = data(data.Delivering_city==city_list(j) & data.Receiving_city==city_list(i) & data.('Date Y/M/D')>=datetime('2023-4-29') & data.('Date Y/M/D')<datetime('2023-4-30'), :);
。。。略
end
%将结果填入表格
[~, idx] = ismember(predict_city_pairs{k}, table3.('“发货-收货”站点城市对'));
table3.('是否能正常发货(填写“是”或“否”)')(idx) = "是";
table3.('快递运输数量')(idx) = num;
end
end
end
end
end
3.4 问题四
无
3.5 问题五
% 导入数据
[num,~,raw] = xlsread('附件2.xlsx');
% 提取出季度为2022年第三季度的数据,统计各个站点的需求量
quarter_data = num( (num(:,1)>=datetime(2022,7,1)) & (num(:,1)<=datetime(2022,9,30)), :);
demand_sum = zeros(1,30); % 用于存储各个站点在该季度内的需求总量
for i = 1:30
demand_sum(i) = sum(quarter_data(quarter_data(:,2)==i, 4));
end
% 计算固定需求常数的均值
。。。略
% 将所求结果填入表5
row_index = find(ismember(raw, 'V-N'));
raw{row_index+1,2} = fixed_demand_mean;
row_index = find(ismember(raw, 'V-Q'));
raw{row_index+1,2} = fixed_demand_mean;
row_index = find(ismember(raw, 'J-I'));
raw{row_index+1,2} = fixed_demand_mean;
row_index = find(ismember(raw, 'O-G'));
raw{row_index+1,2} = fixed_demand_mean;
% 输出更新后的表格
disp(raw)
% 导入数据
[num,txt,~] = xlsread('附件2.xlsx');
% 获取指定季度内的所有数据
quarter_data = num( (num(:,1)>=datetime(2022,7,1)) & (num(:,1)<=datetime(2022,9,30)), :);
% 定义一个函数,用于求一个站点某个季度中每天的日均需求量
function daily_demand = compute_daily_demand(data)
% 获取该站点在该季度内的所有时间
date_range = unique(data(:,1));
daily_demand = zeros(length(date_range),1);
% 对于每一天,计算该天的日均需求量
for i = 1:length(date_range)
today_data = data(data(:,1)==date_range(i),:);
daily_demand(i) = sum(today_data(:,4))/length(today_data);
end
end
% 计算 V-N 站点季度日均需求量的均值和标准差
vn_data = quarter_data( quarter_data(:,2)==1 & quarter_data(:,3)==14, :);
vn_daily_demand = compute_daily_demand(vn_data);
vn_demand_mean = mean(vn_daily_demand);
vn_demand_std = std(vn_daily_demand);
% 将所求结果填入表5
row_index = find(ismember(txt, 'V-N'));
txt{row_index+1,3} = vn_demand_mean;
txt{row_index+2,3} = vn_demand_std;
% 计算 V-Q 站点季度日均需求量的均值和标准差
vq_data = quarter_data( quarter_data(:,2)==1 & quarter_data(:,3)==17, :);
vq_daily_demand = compute_daily_demand(vq_data);
vq_demand_mean = mean(vq_daily_demand);
vq_demand_std = std(vq_daily_demand);
% 将所求结果填入表5
row_index = find(ismember(txt, 'V-Q'));
txt{row_index+1,3} = vq_demand_mean;
txt{row_index+2,3} = vq_demand_std;
% 计算 J-I 站点季度日均需求量的均值和标准差
ji_data = quarter_data( quarter_data(:,2)==10 & quarter_data(:,3)==15, :);
ji_daily_demand = compute_daily_demand(ji_data);
ji_demand_mean = mean(ji_daily_demand);
ji_demand_std = std(ji_daily_demand);
% 将所求结果填入表5
row_index = find(ismember(txt, 'J-I'));
txt{row_index+1,3} = ji_demand_mean;
txt{row_index+2,3} = ji_demand_std;
% 计算 O-G 站点季度日均需求量的均值和标准差
og_data = quarter_data( quarter_data(:,2)==15 & quarter_data(:,3)==7, :);
og_daily_demand = compute_daily_demand(og_data);
og_demand_mean = mean(og_daily_demand);
og_demand_std = std(og_daily_demand);
% 将所求结果填入表5
row_index = find(ismember(txt, 'O-G'));
txt{row_index+1,3} = og_demand_mean;
txt{row_index+2,3} = og_demand_std;
% 计算所有站点在该季度内的非固定需求均值和标准差的加权平均
demand_mean_sum = 0;
demand_std_sum = 0;
for station = [1, 4, 8, 14, 15, 17, 20, 21, 22, 23, 24, 25, 27, 28, 30]
data = quarter_data(quarter_data(:,2)==station, :);
daily_demand = compute_daily_demand(data);
demand_mean = mean(daily_demand);
demand_std = std(daily_demand);
w = sum(data(:,4)) / sum(quarter_data(:,4));
demand_mean_sum = demand_mean_sum + demand_mean*w;
demand_std_sum = demand_std_sum + demand_std^2*w;
end
% 将所求的结果填入表5
row_index = find(ismember(txt, 'V-N'));
txt{row_index+1,4} = demand_mean_sum;
txt{row_index+2,4} = sqrt(demand_std_sum);
row_index = find(ismember(txt, 'V-Q'));
txt{row_index+1,4} = demand_mean_sum;
txt{row_index+2,4} = sqrt(demand_std_sum);
row_index = find(ismember(txt, 'J-I'));
txt{row_index+1,4} = demand_mean_sum;
txt{row_index+2,4} = sqrt(demand_std_sum);
row_index = find(ismember(txt, 'O-G'));
txt{row_index+1,4} = demand_mean_sum;
txt{row_index+2,4} = sqrt(demand_std_sum);
% 输出更新后的表格
disp(txt)
4 完整下载
浏览器打开
betterbench.top/#/65/detail
或者我Q
823316627