数据分析——[数学建模篇](一)

一.题目介绍

A题:物流网络问题

电商物流是我国经济服务中的一种重要方式,为我国经济发展做出了重要贡献。但也逐渐累积出现一些问题:增减网点盲目,运输线路浪费,仓储效率减低的现象。为此快递公司需要合理应对用户下单量波动,网点和仓储停用的状况。请依据附件数据,完成下列问题。

问题1:附件1为某快递公司记录的一个区域内各网点在2021年01月01日至2022年12月31日期间每天不同网点之间运输的快递货量数据。线路是有方向的,如线路DC1→DC2和线路DC2→DC1被认为是两2条线路。请综合考虑多种因素建立数学模型,对各网点的重要程度进行综合排序。根据排序结果列出前10名的网点。

问题2:附件2数据为该快递公司记录的另一区域内各网点在2020年4月28日至2023年4月27日的快递货量数据。请运用问题1的排序模型对此区域内各网点进行排序,再建立模型检验排序的合理性。

问题3:考虑到可能受防疫、火灾、地震等应急事件影响,导致网点临时或永久停用,使部分网点之间线路无法正常运输,导致无法正常发货或收货(无数据表示无法正常收发货,0表示无发货需求)。请基于附件2数据,建立模型预测2023年4月28日至2023年4月30日可正常运输的线路。

问题4:在附件2中如果网点P于2023年5月1日起关停,请建立模型调整货量分配使与网点P相关线路的货量尽可能正常运输,并使受影响的线路尽可能少且工作负荷尽可能均衡。若考虑各网点的处理能力和每条线路的运输能力存在上限,你们的模型应该使一段时间内未能正常运输的货量总数尽可能少。

 

二.问题分析 

阅读问题1,可以知道,题目要求我们计算每个线路的重要程度,我们现在可以看一下附件1的部分数据集:

查看数据集分析可知,每个线路的重要程度,与该线路所运输的货量是有很大关系的,从根本上说是由货量来决定线路的重要程度,到此为止,第一题可以着手去做,模型可以考虑:各个线路的货量排序模型、线路指向模型、强连通分量模型、圆形模型等模型布局。这里我将采用Pyhton语言实现模型建立与数据分析。 

 三.问题解答——问题1

1. 首先我将引入pagerank算法

        介绍pagerank算法:该算法基本想法是在有向图上定义一个随机游走模型,即一阶马尔可夫链,描述随机游走者沿着有向图随机访问各个结点的行为。在一定条件下,极限情况访问每个结点的概率收敛到平稳分布,这时各个结点的平稳概率值就是其PageRank值,表示结点的重要度。PageRank 是递归定义的,PageRank 的计算可以通过迭代算法进行。

        我将采取该算法,将每个网点作为一个结点来随机访问,返回重要程度值。

若还是不懂该算法,请前往:PageRank介绍 

公式计算:

  • PR(a)表示当前节点a的PR值
  • PR(Ti)表示其他各个节点(能够指向a)的PR值
  • L(Ti)表示其他各个节点(能够指向a)的出链数
  • i 代表当前时刻或迭代次数

当然,在python中真正去计算PageRank值的时候,无需记住具体公式,只需会调用计算即可。 

1.首先,我们要读取数据

# 读取数据
data = pd.read_excel('A-附件1.xlsx')

 2.计算PageRank值需要先构造有向图模型

# 建立有向图模型
G = nx.DiGraph()
for i in range(len(data)):
    G.add_edge(data.iloc[i]['场地1'], data.iloc[i]['场地2'], weight=data.iloc[i]['货量'])

3.计算PageRank值 

 

# 计算PageRank值
pr = nx.pagerank(G)

# 对节点按PageRank值进行排序
sorted_pr = sorted(pr.items(), key=lambda x: x[1], reverse=True)

# 输出前10名网点
for i in range(10):
    print(i+1,sorted_pr[i][0],"重要程度",sorted_pr[i][1])

结果展示:

四.建立可视化模型 

 代码内容:

# 可视化分析
plt.rcParams['font.sans-serif'] = ['SimSun']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False
# 构建子图
top10 = [node[0] for node in sorted_pr[:10]]
subgraph = G.subgraph(top10)

# 1. 圆形布局
pos = nx.circular_layout(subgraph)
nx.draw(subgraph, pos, with_labels=True, node_size=800, font_size=14, node_color='lightblue', alpha=0.8, edge_color='grey')
plt.title("前 10 个节点(圆形布局)")
plt.show()

#  强连通分量布局
strong_components  =  list(nx.strongly_connected_components(subgraph))
color_map  =  plt.cm.get_cmap('Pastel2',  len(strong_components))
strong_dict  =  {}
for  i,  component  in  enumerate(strong_components):
        for  node  in  component:
                strong_dict[node]  =  color_map(i)
strong_colors  =  [strong_dict[node]  for  node  in  subgraph.nodes()]
pos  =  nx.spring_layout(subgraph)
nx.draw(subgraph,  pos,  with_labels=True,  node_size=800,  font_size=14,  node_color=strong_colors,  alpha=0.8,  edge_color='grey')
plt.title("前 10 个节点(强连接组件布局)")
plt.show()

建模结果

 

 

 箭头所指地方越密集,所反映的重要程度越高

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡不醒的恒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值