最优路径算法(python)

最优路径算法(python实现)

从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径

主要的最优(最短)路径算法:

一、深度优先算法;二、广度优先算法;三、Dijstra最短路径;四、floyd最短路径

深度优先算法

图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。

它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

无向无权值网络
无向无权值网络
data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 1, 0, 0x’x’x’x, 0], [1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 1, 0]]

图解

def depth_first_search(data, data_index):   # 有向、无向都可以满足要求
    d1 = [data_index[0]]
    index_now = 0

    for i in range(len(data_index) - 1):  # 只需要再寻找剩余的数值即可
        state = 1
        for j in range(len(data[index_now])):  # 遍历可行路径
            if data[index_now][j] == 1:  # 如果该路径可行,则直接判断
                if data_index[j] not in d1:  # 判断原始输出中是否已有
                    d1.append(data_index[j])# 无,则加入
                    index_now = j
                    state = 0
                    break
        if state:
            for k in d1[-2::-1]:    # 到达叶子后的操作
                index_now = data_index.index(k)
                for j in range(len(data[index_now])):  # 遍历可行路径
                    if data[index_now][j] == 1:  # 如果该路径可行,则直接判断
                        if data_index[j] not in d1:  # 判断原始输出中是否已有
                            d1.append(data_index[j])  # 无,则加入
                            index_now = j
                            break
                if index_now != data_index.index(k):
                    break

        # print(d1)
    return d1

if __name__ == "__main__":
    data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 1, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 1, 0]]
    data_w = [[0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 1, 0], [0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0],
              [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0]]
    data_index = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
    # print(data_index.index('F'))
    d1 = depth_first_search(data_w, data_index)
    print(d1)

输入(无向图):

data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0,

最优路线算法通常是指用于寻找两个或多个点之间最短路径的问题,常见的有Dijkstra算法、Floyd-Warshall算法和A*搜索算法等。在Python中,可以使用内置的数据结构如`heapq`库的优先队列来实现Dijkstra算法,而A*算法则需要额外设计启发式函数。 1. Dijkstra算法:适用于加权图,它通过每次选择当前未访问节点中最邻近的目标节点,逐步更新已知最短距离的过程来找到最短路径Python实现时,可以使用字典存储每个顶点的距离并维护一个优先级队列。 ```python import heapq def dijkstra(graph, start): distances = {node: float('infinity') for node in graph} distances[start] = 0 queue = [(0, start)] while queue: current_distance, current_node = heapq.heappop(queue) if current_distance > distances[current_node]: continue # 如果已经发现更短路径,跳过这个节点 for neighbor, weight in graph[current_node].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(queue, (distance, neighbor)) return distances ``` 2. Floyd-Warshall算法:适合于查找所有节点对之间的最短路径,通过动态规划的方式计算出任意两点间的最短路径。在Python中,可以用二维数组来表示图,并填充最短路径。 3. A*搜索算法:适用于解决带启发信息的问题,结合了Dijkstra算法和贪心策略,引入了一个“启发函数”作为估计从当前节点到目标节点的成本。Python中可以利用`heapq`和自定义状态评估函数来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值