前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >最短路问题与标号算法(label correcting algorithm)研究(3)

最短路问题与标号算法(label correcting algorithm)研究(3)

作者头像
用户1621951
发布于 2020-05-09 09:02:37
发布于 2020-05-09 09:02:37
2.6K02
代码可运行
举报
文章被收录于专栏:数据魔术师数据魔术师
运行总次数:2
代码可运行

3. Label Correcting Algorithms

本章将围绕Label Correcting Algorithms展开。首先,3.1小节介绍了最短路径最优性条件,这些条件允许我们评估一组距离标签是否达到最优,以及什么时候我们应该结束算法。基于这一最优性条件,3.2-3.5小节介绍了基本的Label Correcting Algorithms用于求解不含有负环的单源最短路径问题。对于多源最短路径问题将在3.6小节进行讨论,3.7小节将对本章内容进行总结。(小编注:限于篇幅原因,本章将分为三期,详细介绍相关算法)

在正式介绍内容之前我们做一下约定:①本文以有向图作为研究对象;②网络中不含有负环;③网络弧长均为整数;④在实现相应算法时以表格3-1为输入文件。

表3-1 算法输入文件格式

3.1 最优性判别条件

最优性定理1

对于任意节点,设表示从源节点到节点的某条有向路径的长度,则当且仅当满足以下最短路径最优性条件时为源节点到节点最短路径距离(3):

式(3)对于网络中任意弧,源点到节点的最短路径长度始终小于等于源点到节点的最短路径长度与弧的长度之和。反之,如果存在某些弧满足,那么我们就可以把节点加到源节点到节点的路径中去,从而降低源节点到节点的最短路径长度,这与是最短路径长度的命题相矛盾。

接下来我们从数学的角度再次证明上述定理的正确性。假设源点到任意节点的某条有向路径为

由式(3)可得(4):

把上述不等式相加可得到(5):

式(5)说明是从源节点到节点的任意有向路径长度的下界,又因为是源节点到节点的临时有向路径长度,因此它又是最短路径的上界,所以即为源节点到节点的最短路径长度。

在此,我们对定理1做进一步拓展:定义表示弧关于距离标签的缩短距离,其计算公式为:关于有以下三条性质:

1.在任意有向环W中,;

2.对于从节点到节点的任意有向路径,;

3.如果是网络中的一条最短路径,则;

接下来思考:如果网络中存在负环,上述三条性质是否还成立?假设W是网络G中的一个有向环,由上述性质3可推出性质1中,因此W不可能是负环。由此得出:含有负环的网络不满足定理1。此外,本文所介绍的最优性判别条件与动态规划中的Bellman Optimality Condition是一致的。

3.2 Generic Label Correcting Algorithm

3.2.1 算法介绍

如上文所介绍的最优性判断法则,本文所介绍的Generic Label Correcting Algorithm可以认为是Bellman Optimality Condition的具体实现。在Generic Label Correcting Algorithm中以距离标签来表示源节点到任意节点的最短路径长度,但与Label Setting Algorithms不同的是:这里不区分永久距离标签和临时距离标签,在算法迭代中距离标签是连续变化的,当所有距离标签都满足最优性条件时算法结束,此时距离标签即为源节点到任意节点的最短路径长度。Generic Label Correcting Algorithm步骤如下:

表3-2 Generic Label Correcting Algorithm

我们可以看出Generic Label Correcting Algorithm的伪代码很简洁,核心就是逐个检查不满最优性条件的距离标签,并根据更新距离标签,同时前向节点也随之更新,直到所有的距离标签都满足最优性条件。这里以附录2为例,求解节点1到其他节点的最短路径:

①令节点1的距离标签,前向节点pred(1)=0,其他节点的距离标签设为无穷大,如3-1(a);②检查弧(1,3),(1,2)是否满足最优性条件,并更新相应距离标签及前向节点,如图3-1(b);③检查弧(3,4),(3,5)是否满足最优性条件,并更新相应距离标签及前向节点,如图3-1(c);④检查弧(5,6),(5,4)是否满足最优性条件,并更新相应距离标签及前向节点,如图3-1(d)。

至此图3-1(d)中的所有弧都满足最优性条件,我们可以通过前向节点集合来生成节点1到其他节点的最短路径,例如,节点5的前向节点为3,节点3的前向节点为1,因此节点1到节点5的最短路径为1-3-5。通过这种方法我们可以得到一颗以节点1为根的前向节点树(如图3-2),此前向节树记录了根节点到其他子节点的最短路径。

图3-1 Generic Label-Correcting Algorithm 计算流程

图3-2 前向树

这里需要说明的是前向节点集合并不一定会形成一棵以源节点为根的树。如图3-3(a)所示,假设弧(4,1)满足d(1)>d(4)+c41,我们将节点1的前向节点由0更改为4,得到图3-3(b),此时前向节点不再构成一棵树。之所以会发生这种情况是因为网络中含有负环,在3.1小节我们已经讨论过,含有负环的网络不符合最优性定理。

图3-3 含有环的前向图

算法复杂度分析

接下来我们对Generic Label Correcting Algorithm的收敛性进行分析。通过伪代码我们得知算法只有一个while循环,但这个循环并没有明确指出迭代次数的值。我们假设为最大的弧长值,那么源节点到其他节点的路径长度上界为(该路径含有n-1条弧,每条弧的长度为),路径长度下界为,所以对于任意距离标签的最大更新次数为(假设每次更新距离标签只减少1单位),网络中节点数目为,因此距离标签总的更新次数为。因为每次迭代只更新一个距离标签,因此总的迭代次数为。

3.2.2 算法实现

首先给出Python版本的Generic Label Correcting Algorithm实现(求解附录2中源节点1到其他节点的最短路径)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""导入相关基础包,定义全局变量"""
import pandas as pd
import numpy as np
import copy

g_node_list=[] #网络节点集合
g_link_list=[] #网络节点类别集合
g_node_zone={} #网络弧集合
g_shortest_path=[]#最短路径集合
g_origin=None   #网络源节点
g_number_of_nodes=0#网络节点个数
node_predecessor=[]#前向节点集合
node_label_cost=[]#距离标签集合
Max_label_cost=99999#初始距离标签

"""导入网络数据文件,构建基础网络并初始化相关变量"""
#读取网络节点数据
df_node=pd.read_csv('./input_file/node.csv')
df_node=df_node.iloc[:,:].values
for i in range(len(df_node)):
    g_node_list.append(df_node[i,0])
    g_node_zone[df_node[i,0]]=df_node[i,-1]
    g_number_of_nodes+=1
    if df_node[i,3]==1: #第三列node_type数值为1时表示原点
        g_origin=df_node[i,0]
Distance=np.ones((g_number_of_nodes,g_number_of_nodes))*\
Max_label_cost #距离矩阵
node_predecessor=[-1]*g_number_of_nodes
node_label_cost=[Max_label_cost]*g_number_of_nodes
node_predecessor[g_origin-1]=0
node_label_cost[g_origin-1] = 0
#读取网络弧数据
df_link=pd.read_csv('./input_file/road_link.csv')
df_link=df_link.iloc[:,:].values
for i in range(len(df_link)):
    g_link_list.append((df_link[i,1],df_link[i,2]))
    Distance[df_link[i,1]-1,df_link[i,2]-1]=df_link[i,3]

"""最短路径求解:扫描网络弧,依据检查最优性条件更新距离标签"""
while True:
    v=0# 未满足最优性条件的节点个数
    for head,tail in g_link_list:
        if node_label_cost[tail-1]>\
node_label_cost[head-1]+Distance[head-1,tail-1]:
            node_label_cost[tail-1]=\
node_label_cost[head-1]+Distance[head-1,tail-1]
            node_predecessor[tail-1]=head
            v=v+1
    if v==0:
        break
"""依据前向节点生成最短路径"""
agent_id=1
o_zone_id=g_node_zone[g_origin]
for destination in g_node_list:
    if g_origin!=destination:
        d_zone_id=g_node_zone[destination]
        if node_label_cost[destination-1]==Max_label_cost:
            path=" "
            g_shortest_path.append([agent_id, o_zone_id,d_zone_id, path,node_label_cost[destination-1]])
        else:
            to_node=copy.copy(destination)
            path= "%s"%to_node
            while node_predecessor[to_node-1]!=g_origin:
                path="%s;"%node_predecessor[to_node-1]+path
                g=node_predecessor[to_node-1]
                to_node=g
            path="%s;"%g_origin+path
            g_shortest_path.append([agent_id, o_zone_id,d_zone_id,path, node_label_cost[destination - 1]])
        agent_id+=1
"""将求解结果导出到csv文件"""
#将数据转换为DataFrame格式方便导出csv文件
g_shortest_path=np.array(g_shortest_path)
col=['agent_id','o_zone_id','d_zone_id','node_sequence','distance']
file_data = pd.DataFrame(g_shortest_path, index=range(len(g_shortest_path)),columns=col)
file_data.to_csv('./1_generic_label_correcting/agent.csv', index=False)

表3-3 Python实现Generic Label Correcting Algorithm

接下来给出MATLAB版本的Generic Label Correcting Algorithm实现(求解附录2中源节点1到其他节点的最短路径)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%% clear
clc
clear

%% 设置变量
g_node_list = []; %网络节点集合
g_link_list = []; %网络弧集合
g_origin = [];   %网络源节点
g_number_of_nodes = 0;%网络节点个数
node_predecessor = [];%前向节点集合
node_label_cost = [];%距离标签集合
Max_label_cost = inf; %初始距离标签

%% 导入网络数据文件,构建基础网络并初始化相关变量
%读取网络节点数据
df_node = csvread('node.csv',1,0);
g_number_of_nodes = size(df_node,1);
g_node_list = df_node(:,1);
for i = 1 : g_number_of_nodes
    if df_node(i,4)==1
        g_origin=df_node(i,1);
        o_zone_id = df_node(i,5);
    end
end
Distance = ones(g_number_of_nodes,g_number_of_nodes)*Max_label_cost; 
%距离矩阵
node_predecessor = -1*ones(1,g_number_of_nodes);
node_label_cost = Max_label_cost*ones(1,g_number_of_nodes);
node_predecessor(1,g_origin) = 0;
node_label_cost(1,g_origin) = 0;
%读取网络弧数据
df_link = csvread('road_link.csv',1,0);
g_link_list = df_link(:,2:3);
for i = 1 : size(df_link, 1) 
    Distance(df_link(i,2),df_link(i,3)) = df_link(i,4);
end

%% 最短路径求解:扫描网络弧,依据检查最优性条件更新距离标签
while 1
    v=0; %未满足最优性条件的节点个数
    for i = 1 : size(df_link, 1)
        head = g_link_list(i,1);
        tail = g_link_list(i,2);
        if node_label_cost(tail)>node_label_cost(head)+Distance(head,tail)
            node_label_cost(tail)=node_label_cost(head)+Distance(head,tail);
            node_predecessor(tail)=head;
            v=v+1;
        end
    end
    if v==0
        break;
    end  
end

%% 依据前向节点生成最短路径
distance_column = [];
path_column = {};
o_zone_id_column = o_zone_id * ones(g_number_of_nodes-1, 1);
d_zone_id_column = [];
agent_id_column = [1:(g_number_of_nodes-1)]';
for i = 1: size(g_node_list, 1)
    destination = g_node_list(i);
    if g_origin ~= destination
        d_zone_id_column = [d_zone_id_column; df_node(i,5)];
        if node_label_cost(destination)==Max_label_cost
            path="";
            distance = 99999;
            distance_column = [distance_column; 99999];
        else
            to_node=destination;
            path=num2str(to_node);
            while node_predecessor(to_node)~=g_origin
                path=strcat(';',path);
                path=strcat(num2str(node_predecessor(to_node)),path);
                g=node_predecessor(to_node);
                to_node=g;
            end
            path=strcat(';',path);
            path=strcat(num2str(g_origin),path);
            distance_column = [distance_column; node_label_cost(i)];
        end
        path_column=[path_column;path];
    end
end

title = {'agent_id','o_zone_id','d_zone_id','node_sequence','distance'};
result_table=table(agent_id_column,o_zone_id_column,…
d_zone_id_column,path_column,distance_column,'VariableNames',title);
writetable(result_table, 'agent.csv','Delimiter',',','QuoteStrings',true)

表3-4 MATLAB实现Generic Label Correcting Algorithm

3.3 Modified Label Correcting Algorithm

3.3.1 算法介绍

这里先回顾一下Generic Label Correcting Algorithm的核心步骤:对违反最优性条件的弧,更新其对应节点的距离标签及前向节点,即表3-2第4行。我们可以看出在以最优性条件检查距离标签时该算法并没有给出具体的规则,可以认为是一种遍历的方式。因此我们在实现代码时,即表3-3第39行,表3-4第39行,默认采取对所有弧进行遍历。显然这是一个简单但低效的方法。本小节我们将介绍一种改进思路,称其为Modified Label Correcting Algorithm,可有助于提高算法效率。

这里引入一个可扫描列表SE_LIST(Scan Eligible LIST),用来记录可能违反最优性条件的所有弧,如果SE_LIST为空,则表明所有弧都满足最优性条件,已找到最短路径,否则就从SE_LIST中选择一条弧,判定其是否违反最优性条件,并将其从SE_LIST中移除。如果弧违反了最优性条件,就用它更新节点的距离标签,同时更新节点的前向节点。此时请注意,节点的距离标签的任何减少都会影响从节点发出的所有弧的缩减长度,从而导致其中一些弧就可能违反了最优性条件,换句话说,当节点的距离标签更新时,它可能会导致从节点发出的弧不满足最优性条件。还要注意的是,节点的距离标签更新对于所有流入节点的弧都保持最优条件,也就是说节点的距离标签更新不会影响节点的前向节点的最优性。因此,如果节点的距离标签发生改变,则应该将所有从节点发出的弧,即,加入到SE_LIST中。又因为节点唯一对应一个,所以我们可以只记录距离标签发生改变的节点编号,在进行扫描时取出与其对应的,这将有助于减少算法工作量,提高算法效率。以上就是Modified Label Correcting Algorithm的基本思路,其算法步骤如下。

表3-5 Modified Label Correcting Algorithm

算法复杂度分析

在介绍Generic Label Correcting Algorithm的时候我们提到对于任意距离标签最多更新次数为,因此Modified Label Correcting Algorithm总的迭代次数为。当值特别大时,算法总的迭代次数为。

3.3.2 算法实现

首先给出Python版本的Modified Label Correcting Algorithm实现(求解附录2中源节点1到其他节点的最短路径)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""导入相关基础包,定义全局变量"""
import pandas as pd
import numpy as np
import copy
import random
#全局变量定义
g_node_list=[] #网络节点集合
g_node_zone={} #网络节点类别集合
g_link_list=[] #网络弧集合
g_adjacent_arc_list={}#节点邻接弧集合(从节点i发出的弧集合)
g_shortest_path=[]#OD最短路径集合
g_node_status=[]#网络节点状态
g_origin=None  #网络源节点
g_number_of_nodes=0
node_predecessor=[]#前向节点集合
node_label_cost=[]#距离标签集合
SE_LIST=[]#可扫描节点集合
Max_label_cost=99999#初始距离标签
"""导入网络数据文件,构建基础网络并初始化相关变量"""
#读取网络节点数据
df_node=pd.read_csv('./input_file/node.csv')
df_node=df_node.iloc[:,:].values
for i in range(len(df_node)):
    g_node_list.append(df_node[i,0])
    g_node_zone[df_node[i, 0]] = df_node[i, -1]
    g_number_of_nodes+=1
    g_adjacent_arc_list[df_node[i,0]]=[]
    if df_node[i, 3] == 1:
        g_origin = df_node[i, 0]
g_node_status=[0 for i in range(g_number_of_nodes)] #初始化网络节点状态
Distance=np.ones((g_number_of_nodes,g_number_of_nodes))*\
Max_label_cost #距离矩阵
node_predecessor=[-1]*g_number_of_nodes
node_label_cost=[Max_label_cost]*g_number_of_nodes
node_predecessor[g_origin-1]=0
node_label_cost[g_origin-1] = 0
#读取网络弧数据
df_link=pd.read_csv('./input_file/road_link.csv')
df_link=df_link.iloc[:,:].values
for i in range(len(df_link)):
    g_link_list.append((df_link[i,1],df_link[i,2]))
    Distance[df_link[i,1]-1,df_link[i,2]-1]=df_link[i,3]
    g_adjacent_arc_list[df_link[i,1]].append(df_link[i,2])

"""最短路径求解:扫描网络弧,依据检查最优性条件更新距离标签"""
SE_LIST=[g_origin]
g_node_status[g_origin-1]=1
while len(SE_LIST):
    head=random.sample(SE_LIST,1)[0]#从待检查集合中随机抽取节点
    g_node_status[head-1]=0
    SE_LIST.remove(head)#将被抽取的节点从集合中移除
    adjacent_arc_list=g_adjacent_arc_list[head]#获取当前节点的邻接弧
    for tail in adjacent_arc_list:
        if node_label_cost[tail-1]>\
node_label_cost[head-1]+Distance[head-1,tail-1]:
            node_label_cost[tail-1]=\
node_label_cost[head-1]+Distance[head-1,tail-1]
            node_predecessor[tail-1]=head
            if g_node_status[tail-1]==0:
                SE_LIST.append(tail)
                g_node_status[tail-1]=1
"""依据前向节点生成最短路径"""
agent_id=1
o_zone_id=g_node_zone[g_origin]
for destination in g_node_list:
    if g_origin!=destination:
        d_zone_id=g_node_zone[destination]
        if node_label_cost[destination-1]==Max_label_cost:
            path=" "
            g_shortest_path.append([agent_id, o_zone_id,d_zone_id,path, node_label_cost[destination - 1]])
        else:
            to_node=copy.copy(destination)
            path="%s"%to_node
            while node_predecessor[to_node-1]!=g_origin:
                path="%s;"%node_predecessor[to_node-1]+path
                g=node_predecessor[to_node-1]
                to_node=g
            path="%s;"%g_origin+path
            g_shortest_path.append([agent_id, o_zone_id,d_zone_id,path, node_label_cost[destination - 1]])
        agent_id+=1
"""将求解结果导出到csv文件"""
#将数据转换为DataFrame格式方便导出csv文件
g_shortest_path=np.array(g_shortest_path)
col=['agent_id','o_zone_id','d_zone_id','node_sequence','distance']
file_data = pd.DataFrame(g_shortest_path, index=range(len(g_shortest_path)),columns=col)
file_data.to_csv('./2_modified_label_correcting/agent.csv', index=False)

表3-6 Python实现Modified Label Correcting Algorithm

接下来给出MATLAB版本的Modified Label Correcting Algorithm实现(求解附录2中源节点1到其他节点的最短路径)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%% clear
clc
clear

%% 设置变量
g_node_list = []; %网络节点集合
g_link_list = []; %网络弧集合
g_origin = [];   %网络源节点
g_number_of_nodes = 0;%网络节点个数
node_predecessor = [];%前向节点集合
node_label_cost = [];%距离标签集合
Max_label_cost = inf; %初始距离标签
g_adjacent_arc_list={}; %节点邻接弧集合(从节点i发出的弧集合)
g_node_status=[]; %网络节点状态
SE_LIST=[]; %可扫描节点集合

%% 导入网络数据文件,构建基础网络并初始化相关变量
%读取网络节点数据
df_node = csvread('node.csv',1,0);
g_number_of_nodes = size(df_node,1);
g_node_list = df_node(:,1);
g_node_status=zeros(1,g_number_of_nodes);
for i = 1 : g_number_of_nodes
    if df_node(i,4)==1
        g_origin=df_node(i,1);
        o_zone_id = df_node(i,5);
    end
end
Distance = ones(g_number_of_nodes,g_number_of_nodes)*Max_label_cost; 
%距离矩阵
node_predecessor = -1*ones(1,g_number_of_nodes);
node_label_cost = Max_label_cost*ones(1,g_number_of_nodes);
node_predecessor(1,g_origin) = 0;
node_label_cost(1,g_origin) = 0;
g_adjacent_arc_list = cell(1, g_number_of_nodes);
%读取网络弧数据
df_link = csvread('road_link.csv',1,0);
g_link_list = df_link(:,2:3);
for i = 1 : size(df_link, 1) 
    Distance(df_link(i,2),df_link(i,3)) = df_link(i,4);
    g_adjacent_arc_list{df_link(i,2)} = [g_adjacent_arc_list{df_link(i,2)}, df_link(i,3)];
end

%% 最短路径求解:扫描网络弧,依据检查最优性条件更新距离标签
SE_LIST=[g_origin];
g_node_status(g_origin)=1;
while ~isempty(SE_LIST)
head=SE_LIST(randperm(numel(SE_LIST),1)); 
%从待检查集合中随机抽取节点
    SE_LIST(SE_LIST==head)=[]; %将被抽取的节点从集合中移除
    g_node_status(head)=0;
    adjacent_arc_list = g_adjacent_arc_list(head); %获取当前节点的邻接弧
    adjacent_arc_list = cell2mat(adjacent_arc_list);
    for i = 1 : length(adjacent_arc_list)
        tail = adjacent_arc_list(i);
        if node_label_cost(tail)>node_label_cost(head)+Distance(head,tail)
            node_label_cost(tail)=node_label_cost(head)+Distance(head,tail);
            node_predecessor(tail)=head;
            if g_node_status(tail)==0
                SE_LIST = [SE_LIST,tail];
                g_node_status(tail) = 1;
            end
        end
    end   
end

%% 依据前向节点生成最短路径
distance_column = [];
path_column = {};
o_zone_id_column = o_zone_id * ones(g_number_of_nodes-1, 1);
d_zone_id_column = [];
agent_id_column = [1:(g_number_of_nodes-1)]';
for i = 1: size(g_node_list, 1)
    destination = g_node_list(i);
    if g_origin ~= destination
        d_zone_id_column = [d_zone_id_column; df_node(i,5)];
        if node_label_cost(destination)==Max_label_cost
            path="";
            distance = 99999;
            distance_column = [distance_column; 99999];
        else
            to_node=destination;
            path=num2str(to_node);
            while node_predecessor(to_node)~=g_origin
                path=strcat(';',path);
                path=strcat(num2str(node_predecessor(to_node)),path);
                g=node_predecessor(to_node);
                to_node=g;
            end
            path=strcat(';',path);
            path=strcat(num2str(g_origin),path);
            distance_column = [distance_column; node_label_cost(i)];
        end
        path_column=[path_column;path];
    end
end

title = {'agent_id','o_zone_id','d_zone_id','node_sequence','distance'};
result_table=table(agent_id_column,o_zone_id_column,…
d_zone_id_column,path_column,distance_column,'VariableNames',title);
writetable(result_table, 'agent.csv','Delimiter',',','QuoteStrings',true)

表3-7 MATLAB实现Modified Label Correcting Algorithm

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据魔术师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
最短路问题与标号算法(label correcting algorithm)研究(4)
这是全文第三章label correcting algorithm的第二节。本章围绕Label Correcting Algorithms展开。上一节已经介绍了最短路径算法Generic Label Correcting Algorithm以及Modified Label Correcting Algorithm,本节将介绍在前两个算法上改进得到的FIFO Label Correcting Algorithm以及Deque Label Correcting Algorithm。点击下方链接回顾往期内容:
用户1621951
2020/05/12
1.4K0
最短路问题与标号算法(label correcting algorithm)研究(5)
这是全文第三章label correcting algorithm的第三节。本章围绕Label Correcting Algorithms展开。前两节我们介绍了最短路径算法Generic Label Correcting Algorithm,Modified Label Correcting Algorithm,以及在前两个算法上改进得到的FIFO Label Correcting Algorithm,Deque Label Correcting Algorithm。以上四种算法都是单源最短路径算法,本小节我们将研究简单网络的多源最短路径问题以及对应的Floyd-Warshall Algorithm。点击下方链接回顾往期内容:
用户1621951
2020/05/12
1.4K0
最短路问题与标号算法(label correcting algorithm)研究(2) - 最短路径问题简介
在开始介绍最短路问题之前我们先来简单讨论网络流问题(network flow problems)
用户1621951
2020/04/24
2.3K0
最短路问题与标号算法(label correcting algorithm)研究(6) - 扩展阅读
这是全文第四章拓展阅读,也是全篇的最后一个章节。在前三章的内容里,我们详细介绍了最短路问题及其数学模型、最短路径求解算法以及单源、多源Label Correcting Algorithms的核心内容。本章将介绍如何利用前文介绍的算法求解多目标最短路径问题以及如何处理大规模网络。点击下方链接回顾往期内容:
用户1621951
2020/05/20
2.1K1
标号法(label-setting algorithm)求解带时间窗的最短路问题
想必大家在刚开始学习运筹学模型时,会觉得有些茫然不知所措吧?比如一大堆神奇的名词,各种各样的约束。。。反正我一开始是很懵的状态。
用户1621951
2019/12/12
2.5K0
标号法(label-setting algorithm)求解带时间窗的最短路问题
最短路问题与标号算法(label setting algorithm)研究(1) - 开篇介绍
本系列推文重在从算法基本原理、复杂度分析、优缺点、代码实现、算法扩展等方面科普Label Correcting Algorithm(最短路算法重要分支),同时给出了下一步学习内容建议。
用户1621951
2020/04/24
2.1K0
八十七、探究最短路问题:Dijkstra算法
最短路问题(Shortest Path Problems):给定一个网络,网络的边上有权重,找一条从给定起点到给定终点的路径使路径上的边权重总和最小。
润森
2022/08/17
7990
八十七、探究最短路问题:Dijkstra算法
[算法]-最短路径算法总结「建议收藏」
基本思想:首先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从顶点v 到其它各顶点的最短路径全部求出为止。
全栈程序员站长
2022/09/01
5750
Dijkstra算法求单源最短路径
在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同。如果是一个带权图,那么路径长度为路径上各边的权值的总和。两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度。
恋喵大鲤鱼
2018/08/03
2.4K0
Dijkstra算法求单源最短路径
最短路径问题:Dijkstra算法
所谓最短路径问题是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。
233333
2020/02/11
5.6K1
最短路径问题:Dijkstra算法
[图]最短路径-Dijkstra算法
2.BFS可能会是Dijkstra算法的实质,BFS使用的是队列进行操作,而Dijkstra采用的是优先队列。
王荣胜
2020/03/13
7K0
[图]最短路径-Dijkstra算法
经典算法之最短路径问题
所谓最短路径问题是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。最短路径问题一直是图论研究的热点问题。例如在实际生活中的路径规划、地图导航等领域有重要的应用。
用户3467126
2019/12/13
2.5K0
经典算法之最短路径问题
单源最短路径算法[通俗易懂]
最短路径问题:如果从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。当然这只是最基础的应用,关于单源最短路径还有很多变体:
全栈程序员站长
2022/09/01
1.8K0
单源最短路径算法[通俗易懂]
来聊聊最短路问题中的label-setting算法
时间过得真快!转眼间一年又过去了,我记得上一次写推文还是在去年。前段时间一直在做Label Setting相关的研究,今天趁着有空了,赶紧来聊一下吧~
短短的路走走停停
2021/01/18
1.5K0
来聊聊最短路问题中的label-setting算法
Python 算法基础篇之最短路径算法: Dijkstra 算法和 Floyd-Warshall 算法
在计算机科学中,寻找图中最短路径是一个经典问题。 Dijkstra 算法和 Floyd-Warshall 算法是两种常用的最短路径算法。本篇博客将重点介绍这两种算法的原理、应用场景以及使用 Python 实现,并通过实例演示每一行代码的运行过程。
小蓝枣
2023/07/25
1.9K0
最短路径四大算法「建议收藏」
熟悉的最短路算法就几种:bellman-ford,dijkstra,spfa,floyd。 bellman-ford可以用于边权为负的图中,图里有负环也可以,如果有负环,算法会检测出负环。 时间复杂度O(VE); dijkstra只能用于边权都为正的图中。 时间复杂度O(n2); spfa是个bellman-ford的优化算法,本质是bellman-ford,所以适用性和bellman-ford一样。(用队列和邻接表优化)。 时间复杂度O(KE); floyd可以用于有负权的图中,即使有负环,算法也可以检测出来,可以求任意点的最短路径,有向图和无向图的最小环和最大环。 时间复杂度O(n3); 任何题目中都要注意的有四点事项:图是有向图还是无向图、是否有负权边,是否有重边,顶点到自身的可达性。 1、Dijkstra(单源点最短路) 这个算法只能计算单元最短路,而且不能计算负权值,这个算法是贪心的思想, dis数组用来储存起始点到其他点的最短路,但开始时却是存的起始点到其他点的初始路程。通过n-1遍的遍历找最短。每次在剩余节点中找dist数组中的值最小的,加入到s数组中,并且把剩余节点的dist数组更新。
全栈程序员站长
2022/09/06
6450
最短路径四大算法「建议收藏」
关于最短路径算法的理解
“最短路径算法:Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法等。​从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径。”
全栈程序员站长
2022/09/02
1.1K0
Dijkstra的最短路径算法
给定图中的图形和源顶点,找到给定图形中从源到所有顶点的最短路径。 Dijkstra的算法与最小生成树的Prim算法非常相似。与Prim的MST一样,我们以给定的源为根生成SPT(最短路径树)。我们维护两组,一组包含最短路径树中包含的顶点,另一组包括最短路径树中尚未包括的顶点。在算法的每个步骤中,我们找到一个顶点,该顶点位于另一个集合中(尚未包括的集合)并且与源具有最小距离。
全栈程序员站长
2022/08/28
1.2K0
Dijkstra的最短路径算法
算法练习(19)-单源最短路径dijkstra算法
如上图,先初始化1个图,每条边上的红色数字为路径权重:(Node,Edge的定义参见算法练习(17)-图的广度优先遍历/深度优先遍历)
菩提树下的杨过
2021/11/16
5000
教你一招 | Python实现无向图最短路径
一心想学习算法,很少去真正静下心来去研究,前几天趁着周末去了解了最短路径的资料,用python写了一个最短路径算法。算法是基于带权无向图去寻找两个点之间的最短路径,数据存储用邻接矩阵记录。首先画出一幅
CDA数据分析师
2018/02/05
3.7K0
教你一招 | Python实现无向图最短路径
推荐阅读
相关推荐
最短路问题与标号算法(label correcting algorithm)研究(4)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文