没事撸点算法——dijkstra算法(python)

本文介绍了Dijkstra算法的基本原理和在Python中实现该算法的过程。通过图数据结构,利用字典和列表表示图,并详细阐述了算法的步骤,包括初始化cost、visited和parents字典,以及逐步寻找最短路径的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    数据结构地提出是为了更好地解决数据存储问题,图数据结构的提出是为了解决生活中的复杂网络问题。

    在Python中,图的表示方式一般使用字典以及列表完成。

#使用字典列表展现图
graph={
       1:{2:1,3:12},
       2:{3:9,4:3},
       3:{5:5},
       4:{3:4,5:13,6:15},
       5:{6:4},
       6:{6:0}
       }

Dijkstra算法一般是用于解决求解最短路径问题,属于盲目搜索算法。

原理:不断求解起始节点到其他节点的最短路径成本。

First:

引入cost字典,表示对于起始点到每一个其他节点的成本。eg:cost[2]=1。表示起始点(这里设定为节点1)到节点2的成本需要1。

引入visted列表,记录已访问的节点。eg:起始visted=[1];

引入Parents字典,记录已求解最短路径节点的前一个节点。eg:假设至3节点的最短路径为1-2-4-3,则parents[3]=4;

Second:算法流程(以上面的网络图为例)

cost初始值为1节点到各个节点的成本

123456
0112999(无穷)999(无穷)999(无穷)

可以得出1-2的最短路径成本即为1。因为1节点到2节点仅有一条路径最短,如果1节点先到其他节点之后再返回2节点,必然成本大于1,所以1-2为2节点的最低成本路径。此时将2节点放置visted中。

接下来,由于节点2已经解出1-2的最短路径,计算2节点的出度(2-3,2-4)由1-2-3和1-2-4的成本分别为10、4小于之前的成本12、999,对cost字典进行更新。

123456
01104999999

此时,cost成本最小的为节点4,最短路径为1-2-4,将4放入visted列表中,记录parents[4]=2。

再看4的出度,对cost列表进行更新,寻找成本最小节点,记入visted列表中,同时记录当前最短路径节点的前一个节点,知道所有节点全部被访问,即全部进入visted列表中,结束算法。

 

全部代码:

# -*- coding: utf-8 -*-
"""
Created on Tue Oct 30 08:46:14 2018

@author: 24367
"""
# find the shortest node(not visted) to add in the list(visted)
def find_shortest_node(cost):
        minDist=999
        node=None
        for item in cost.keys():
            if (cost[item]<minDist)&(item not in visted):
                minDist=cost[item]
                node=item
        return node
        

#Create Graph for the route plan
graph={
       1:{2:1,3:12},
       2:{3:9,4:3},
       3:{5:5},
       4:{3:4,5:13,6:15},
       5:{6:4},
       6:{6:0}
       }
#记录初始权值
cost={1:0,2:1,3:12,4:999,5:999,6:999}
#记录当前最短路径的前一个节点
parents={1:None,2:1,3:2,4:2,5:3,6:5}
#记录已经访问过的节点
visted=[1]
node=find_shortest_node(cost)
while (node):
    for i in graph[node]:
        newCost=cost[node]+graph[node][i];
        if(newCost<cost[i]):
            #更新cost权值以及记录最短路径前节点
            cost[i]=newCost
            parents[i]=node
    visted.append(node)#将最短路径节点添加至已访问列表中
    node=find_shortest_node(cost)
#输出最短路径
parent=parents[6]
while(parent):
    print(parent)
    parent=parents[parent]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值