python之建模图论篇

一.图论模型

0.分类

无向图:
若图中的每条边都是没有方向的,则称该图为无向图。

有向图:
若图中的每条边都是有方向的,则称该图为有向图。

混合图:
若图中的部分边是有方向的,而部分边是无方向的,则称该图为混合图。

1.Dijkstra

样例1:如下图所示,我们需要从①点走到⑨点,每条边的红色数
字代表这条边的长度,我们如何找到①到⑨的最短路径呢?

在这里插入图片描述
代码如下:

def startwith(start: int, mgraph: list) -> list:
    passed = [start]
    nopass = [x for x in range(len(mgraph)) if x != start]
    dis = mgraph[start]
    
    while len(nopass):
        idx = nopass[0]
        for i in nopass:
            if dis[i] < dis[idx]: idx = i

        nopass.remove(idx)
        passed.append(idx)

        for i in nopass:
            if dis[idx] + mgraph[idx][i] < dis[i]: dis[i] = dis[idx] + mgraph[idx][i]
    return dis


if __name__ == "__main__":
    inf = 10086
    mgraph =   [ [0, 1, inf, 3, inf, inf, inf, inf, inf],
               [1, 0, 5, inf, 2, inf, inf, inf, inf],
               [inf,inf, 0, 1, inf, 6, inf, inf,inf ],
               [inf, inf, inf, 0, inf, 7, inf, 9,inf ], 
               [inf, 2, 3, inf, 0, 4, 2, inf, 8],
               [inf, inf, 6, 7, inf, 0, inf, 2, inf],
               [inf, inf, inf, inf, inf, 1, 0, inf, 3],
               [inf, inf, inf, inf, inf, inf, 1, 0, 2],
               [inf, inf, inf, inf, 8, inf, 3, 2, 0]]

    dis = startwith(0, mgraph)
    
print(dis)

结果如下:
在这里插入图片描述

2.Floyd

代码如下:

import numpy as np
inf = 10086
edge = [ [0, 1, inf, 3, inf, inf, inf, inf, inf],
        [1, 0, 5, inf, 2, inf, inf, inf, inf],
        [inf,inf, 0, 1, inf, 6, inf, inf,inf ],
        [inf, inf, inf, 0, inf, 7, inf, 9,inf ], 
        [inf, 2, 3, inf, 0, 4, 2, inf, 8],
        [inf, inf, 6, 7, inf, 0, inf, 2, inf],
        [inf, inf, inf, inf, inf, 1, 0, inf, 3],
        [inf, inf, inf, inf, inf, inf, 1, 0, 2],
        [inf, inf, inf, inf, 8, inf, 3, 2, 0]]
A = edge[:]
N = len(edge)
path = np.zeros((N,N))
 
def Floyd():
    for i in range(N):
        for j in range(N):
            if edge[i][j] != inf and edge[i][j] != 0:
                path[i][j] = i
 
    for a in range(N):
        for b in range(N):
            for c in range(N):
                if(A[b][a]+A[a][c]<A[b][c]):
                    A[b][c] = A[b][a] + A[a][c]
                    path[b][c] = path[a][c]
 
if __name__ == "__main__":
    Floyd()
    print(path)

结果如下:

在这里插入图片描述

3.机场航线设计

数据集来自航空业,有一些关于航线的基本信息。有某段旅程的起始点和目的地。还有一些列表示每段旅程的到达和起飞时间。这个数据集非常适合作为图进行分析。想象一下通过航线(边)连接的几个城市(节点)。如果你是航空公司,你可以问如下几个问题:
(1)从A到B的最短途径是什么?分别从距离和时间角度考虑。
(2)有没有办法从C到D?
(3)哪些机场的交通最繁忙?
(4)哪个机场位于大多数其他机场“之间”?这样它就可以变成当地的一个中转站。

附链接(参考这位大佬):https://blog.csdn.net/zhouzhuo_CSUFT/article/details/81479244

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值