一.题目介绍
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()
建模结果
箭头所指地方越密集,所反映的重要程度越高!