数学建模:图论模型 — 最短路模型示例 (Python 求解)

这篇具有很好参考价值的文章主要介绍了数学建模:图论模型 — 最短路模型示例 (Python 求解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

例 1: 设备更新问题

某种工程设备的役龄为 4 年, 每年年初都面临着是否更新的问题: 若卖旧买新, 就要支付一定的购置费用; 若继续使用, 则要支付更多的维护费用, 且使用年限越长维护费用越多. 役龄期内每年的年初购置价格, 当年维护费用及年末剩余净值如下表所示. 为该设备制定一个 4 年役龄期内的更新计划, 使总的支付费用最少.

年份 1 2 3 4
年初购置价格 (万元) 25 26 28 31
当年维护费用 (万元) 10 14 18 26
年末剩余净值 (万元) 20 16 13 11

可以把这个问题化为图论中的最短路问题.

构造赋权有向图 D = ( V , A , W ) D=(V, A, W) D=(V,A,W), 其中顶点集 V = { v 1 , v 2 , ⋯   , v 5 } V=\left\{v_{1}, v_{2}, \cdots, v_{5}\right\} V={v1,v2,,v5}, 这里 v i v_{i} vi ( i = 1 , 2 , 3 , 4 ) (i=1,2,3,4) (i=1,2,3,4) 表示第 i i i 年年初的时刻, v 5 v_{5} v5 表示第 4 年年末的时刻, A A A 为边集, 邻接矩阵 W = ( w i j ) 5 × 5 W=\left(w_{i j}\right)_{5 \times 5} W=(wij)5×5, 这里 w i j w_{i j} wij 为第 i i i 年年初至第 j j j 年年初 (或 j − 1 j-1 j1 年年末) 期间所支付的费用, 计算公式为
w i j = p i + ∑ k = 1 j − i a k − r j − i , w_{i j}=p_{i}+\sum_{k=1}^{j-i} a_{k}-r_{j-i}, wij=pi+k=1jiakrji,

其中 p i p_{i} pi 为第 i i i 年年初的购置价格, a k a_{k} ak 为使用到第 k k k 年当年的维护费用, r i r_{i} ri 为使用 i i i 年旧设备的出售价格.

则邻接矩阵
W = [ 0 15 33 54 82 ∞ 0 16 34 55 ∞ ∞ 0 18 36 ∞ ∞ ∞ 0 21 ∞ ∞ ∞ ∞ 0 ] . W=\left[\begin{array}{ccccc} 0 & 15 & 33 & 54 & 82 \\ \infty & 0 & 16 & 34 & 55 \\ \infty & \infty & 0 & 18 & 36 \\ \infty & \infty & \infty & 0 & 21 \\ \infty & \infty & \infty & \infty & 0 \end{array}\right] . W=0150331605434180825536210.

则制定总的支付费用最小的设备更新计划, 就是求有向图 D D D 从顶点 v 1 v_{1} v1 到页点 v 5 v_{5} v5 的最短路.

import numpy as np
import networkx as nx
import pylab as plt
p=[25,26,28,31]; a=[10,14,18,26]; r=[20,16,13,11]
b=np.zeros((5,5)); #初始化邻接矩阵
for i in range(5):
    for j in range(i+1,5):
        b[i,j]=p[i]+np.sum(a[0:j-i])-r[j-i-1];
print(b)
G=nx.DiGraph(b)
p=nx.dijkstra_path(G, source=0, target=4, weight='weight')  #求最短路径;
print("最短路径为:",np.array(p)+1)  #python下标从0开始
d=nx.dijkstra_path_length(G, 0, 4, weight='weight') #求最短距离
print("所求的费用最小值为:",d)
s=dict(zip(range(5),range(1,6))) #构造用于顶点标注的标号字典
plt.rc('font',size=16)
pos=nx.shell_layout(G)  #设置布局
w=nx.get_edge_attributes(G,'weight')
nx.draw(G,pos,font_weight='bold',labels=s,node_color='r')
nx.draw_networkx_edge_labels(G,pos,edge_labels=w)
path_edges=list(zip(p,p[1:]))
nx.draw_networkx_edges(G,pos,edgelist=path_edges,edge_color='r',width=3) #画出最短路径
#plt.savefig("figure10_9.png",pdi=500); 
plt.show()
[[ 0. 15. 33. 54. 82.]
 [ 0.  0. 16. 34. 55.]
 [ 0.  0.  0. 18. 36.]
 [ 0.  0.  0.  0. 21.]
 [ 0.  0.  0.  0.  0.]]
最短路径为: [1 2 3 5]
所求的费用最小值为: 67.0

数学建模:图论模型 — 最短路模型示例 (Python 求解)

求得 v 1 v_{1} v1 v 5 v_{5} v5 的最短路径为 v 1 → v 2 → v 3 → v 5 v_{1} \rightarrow v_{2} \rightarrow v_{3} \rightarrow v_{5} v1v2v3v5, 最短路径的长度为67. 即设备更新计划为第1年年初买进新设备, 使用到第 1 年年底, 第 2 年年初购进新设备, 使用到第 2 年年底, 第 3 年年初再购进新设备, 使用到第 4 年年底.

例 2: 重心问题

重心问题指有些公共服务设施 (例如邮局, 学校等) 的选址, 要求设施到所有服务对象点的距离总和最小. 一般要考虑人口密度问题, 或者全体被服务对象来往的总路程最短. 例如下面的问题:

某矿区有六个产矿点, 如图所示, 已知各产矿点每天的产矿量 (标在图中的各顶点旁) 为 q i ( i = 1 , 2 , ⋯   , 6 ) q_{i}(i=1,2, \cdots, 6) qi(i=1,2,,6) 吨, 现要从这六个产矿点选一个来建造选矿厂, 问应选在哪个产矿点, 才能使各产矿点所产的矿石运到选矿厂所在地的总运力 (吨·公里) 最小.

数学建模:图论模型 — 最短路模型示例 (Python 求解)

d i j ( i , j = 1 , 2 , ⋯   , 6 ) d_{i j}(i, j=1,2, \cdots, 6) dij(i,j=1,2,,6) 表示顶点 v i v_{i} vi v j v_{j} vj 之间的距离. 若选矿厂设在 v i v_{i} vi 并且各产矿点到选矿厂的总运力为 m i m_{i} mi, 则确定选矿厂的位置就转化为求 m k m_{k} mk, 使得 m k = min ⁡ 1 ≤ i ≤ 6 m i m_{k}=\min _{1 \leq i \leq 6} m_{i} mk=min1i6mi.

由于各产矿点到选矿厂的总运力依赖于任意两顶点之间的距离, 即任意两顶点之间最短路的长度, 因此可首先利用 Dijkstra (或 Floyd) 算法求出所有顶点对之间的最短距离, 然后计算出顶点 v i v_{i} vi 设立选矿厂时各产矿点到 v i v_{i} vi 的总运力
m i = ∑ j = 1 6 q j d i j , i = 1 , 2 , ⋯   , 6. m_{i}=\sum_{j=1}^{6} q_{j} d_{i j}, \quad i=1,2, \cdots, 6. mi=j=16qjdij,i=1,2,,6.

最后利用 min ⁡ 1 ≤ i ≤ 6 m i \min _{1 \leq i \leq 6} m_{i} min1i6mi 选择设置选矿厂的位置.

计算的 Python 程序如下:

import numpy as np
import networkx as nx
List=[(1,2,20),(1,5,15),(2,3,20),(2,4,40),
      (2,5,25),(3,4,30),(3,5,10),(5,6,15)]
G=nx.Graph()
G.add_nodes_from(range(1,7))
G.add_weighted_edges_from(List)
c=dict(nx.shortest_path_length(G,weight='weight'))
d=np.zeros((6,6))
for i in range(1,7):
    for j in range(1,7): d[i-1,j-1]=c[i][j]
print(d)
q=np.array([80,90,30,20,60,10])
m=d@q  #计算运力,这里使用矩阵乘法
mm=m.min()  #求运力的最小值
ind=np.where(m==mm)[0]+1  #python下标从0开始,np.where返回值为元组
print("运力m=",m,'\n最小运力mm=',mm,"\n选矿厂的设置位置为:",ind)
[[ 0. 20. 25. 55. 15. 30.]
 [20.  0. 20. 40. 25. 40.]
 [25. 20.  0. 30. 10. 25.]
 [55. 40. 30.  0. 40. 55.]
 [15. 25. 10. 40.  0. 15.]
 [30. 40. 25. 55. 15.  0.]]
运力m= [ 4850.  4900.  5250. 11850.  4700.  8750.] 
最小运力mm= 4700.0 
选矿厂的设置位置为: [5]

min ⁡ 1 ≤ i ≤ 6 m i = m 5 \min _{1 \leq i \leq 6} m_{i}=m_{5} min1i6mi=m5, 所以 v 5 v_{5} v5 为设置选矿厂的位置文章来源地址https://www.toymoban.com/news/detail-468397.html

到了这里,关于数学建模:图论模型 — 最短路模型示例 (Python 求解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)

    数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)

    一、最短路径问题 从图中的某个顶点出发,到达另一个顶点的 所经过的边的权重之和最小 的一条路径。 1.1 两个指定顶点之间的最短路径 问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,求一条最短铁路线。 1.1.1 Dijkstra算法 迪杰斯特拉(D

    2024年02月02日
    浏览(34)
  • 【数学建模】图论模型

    【数学建模】图论模型

    无向图和有向图 简单图和完全图:重边、环、孤立点 赋权图/网络 顶点的度 子图与生成子图 路与回路、迹、path、圈 连通图与非连通图 图的表示 考虑简单图 关联矩阵表示 邻接矩阵表示 对于赋权图而言,邻接矩阵中的数值改为对应边的权值就得到对应的无向/有向赋权图

    2024年01月17日
    浏览(8)
  • 【数学建模常用模型】图论专题

            图论是研究点、线间关系的一门学科。现实生活中,凡是涉及到事物间的关系,都可以抽象为图论模型。图论模型也是各大数学建模中常见的一种模型,主要用于计算、规划最短距离、路线等问题。下面介绍几个基本概念和算法。   单源最短路         单源最短路

    2024年02月06日
    浏览(9)
  • python机器学习经典算法代码示例及思维导图(数学建模必备)

    python机器学习经典算法代码示例及思维导图(数学建模必备)

    最近几天学习了机器学习经典算法,通过此次学习入门了机器学习,并将经典算法的代码实现并记录下来,方便后续查找与使用。 这次记录主要分为两部分:第一部分是机器学习思维导图,以框架的形式描述机器学习开发流程,并附有相关的具体python库,做索引使用;第二部

    2024年02月12日
    浏览(13)
  • 数学建模——图论学习

    数学建模——图论学习

    一、图论基础 图分为有限图与无限图两类,本课只涉及有限图,即顶点和边都是有限集合 (2)有向图:每一条边都是有向的 无向图:每一条边都是无向的 除外都是混合图  注意:有向图边的描述{1.每一条边都需要描述到   2.始点,终点 (3)邻接点:两个结点之间有一条边

    2024年02月04日
    浏览(10)
  • 集货运输优化:数学建模步骤,Python实现蚁群算法(解决最短路径问题), 蚁群算法解决旅行商问题(最优路径问题),节约里程算法

    目录 数学建模步骤 Python实现蚁群算法(解决最短路径问题)  蚁群算法解决旅行商问题(最优路径问题)

    2024年02月09日
    浏览(50)
  • 线性规划模型(数学建模python版)

    线性规划模型(数学建模python版)

    前言:本篇文章只涉及问题的应用层面(如何调用包调用函数,如何把问题归结为一般形式方便使用第三方库中的函数求解),不涉及问题的具体求解原理。 首先回顾一下高中学过的线性规划:求一个线性目标函数在先行可行域内的 最值问题。 高中遇到的问题:配送运输问

    2024年02月20日
    浏览(10)
  • 【Python数学建模常用算法代码——蒙特卡洛模型】

    蒙特卡洛方法的理论支撑其实是概率论或统计学中的大数定律。基本原理简单描述是先大量模拟,然后计算一个事件发生的次数,再通过这个发生次数除以总模拟次数,得到想要的结果。下面我们以三个经典的小实验来学习下蒙特卡洛算法思想。 实验原理 在正方形内部有一

    2024年02月02日
    浏览(12)
  • 数学建模--决策树的预测模型的Python实现

    目录 1.算法流程简介 2.算法核心代码 3.算法效果展示

    2024年02月08日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包