IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Microcity——lua语言编写Dijkstra算法与Floyd算法求解航线网络图最短路 -> 正文阅读

[数据结构与算法]Microcity——lua语言编写Dijkstra算法与Floyd算法求解航线网络图最短路

Microcity是大连海事大学交通运输工程学院的孙卓教授自主开发的一款集3D仿真、空间数据分析等众多功能于一体的软件。本文使用lua语言,利用Microcity软件进行编译,分别使用Dijkstra与Floyd两种算法对拓扑化后的航线网络图求解最短路径。

拓扑化后的航线网络图:

部分路段ID、起点ID、终点ID、实际路长数据:

?


一、Dijkstra算法计算从起点到各点的最短路代码

Links=GetControl("links.shp")
Nodes=GetControl("nodes.shp")
marked={}
stpdis={}			
preid={}
startid=1                                  --本例设置起点为1
a={}
for inodes0 = 1, GetRecCount(Nodes) do   --数组初始化
    id0 = GetValue(Nodes,"ID",inodes0)
    marked[id0]	= false					 --标记数组
    stpdis[id0]	= 100000000				 --最短距离
    preid[id0]	= -1					 --前溯节点号
end
crtid = startid					         --设置当前节点为起点
marked[crtid] = true
stpdis[crtid] = 0
judge = false                            --设置判断变量
while not judge do	                     --判断变量(存在未永久标号的点)
    for ilinks = 1, GetRecCount(Links) do 			--搜索所有路段
        linko = GetValue(Links, "O", ilinks)		--得到路段起点
        linkd = GetValue(Links, "D", ilinks)		--得到路段终点
        linkdis = GetValue(Links, "W", ilinks)
        if linko == crtid then		        --如果与当前节点邻接
            tmpid = linkd				
            if stpdis[crtid] + linkdis < stpdis[tmpid] then      --并且另一端点的最短距离较大
                stpdis[tmpid] = stpdis[crtid] + linkdis
                preid[tmpid] = crtid		--修改另一端点的最短距离和前溯节点
            end
        elseif linkd == crtid then
            tmpid = linko
            if stpdis[crtid] + linkdis < stpdis[tmpid] then      --并且另一端点的最短距离较大
                stpdis[tmpid] = stpdis[crtid] + linkdis
                preid[tmpid] = crtid		--修改另一端点的最短距离和前溯节点
            end
        end
    end
    for inodes1 = 1, GetRecCount(Nodes) do
        id1 = GetValue(Nodes,"ID",inodes1)
        judge = true                       
        if not marked[id1] then            --若不存在未永久标号的点,判断变量变为true,此时所有点都已得到永久标号,跳出本循环,不进入下一个if语句并跳出while大循环
            judge = false                  --若存在未永久标号的点,判断变量仍为false
            crtid = id1                    --设置下一个当前节点暂时为该未永久标号的点
            break
        end
    end
    if not judge then
        for inodes2 = 1, GetRecCount(Nodes) do 		--搜索所有节点
            id2 = GetValue(Nodes,"ID",inodes2)
            if not marked[id2] and stpdis[id2] < stpdis[crtid] then		            --找到未标记的有最小距离的节点
                crtid = id2				        --重新设置当前节点
            end
        end
        marked[crtid] = true			        --标记新的当前节点
    end
end
for inodes3 = 1, GetRecCount(Nodes) do
    id3 = GetValue(Nodes,"ID",inodes3)
    Print("destination point",id3,":",stpdis[id3])  --输出当前点及到其最短距离
    n = 1
    id = id3
    while id ~= startid do              --倒序存储
        a[n] = preid[id]
        id = preid[id]
        n = n+1
    end
    while n ~= 1 do                     --正序输出
        Print(a[n-1])
        n = n-1
    end
    Print(id3)
end

二、Floyd算法计算从各点到各点的最短路代码

Links = GetControl("links.shp")
Nodes = GetControl("nodes.shp")
N = GetRecCount(Nodes)
L = GetRecCount(Links)
--初始化距离矩阵dis和前置跳转点矩阵path
--由于航线图左右侧同一点连通,需设置两个判断变量处理矩阵
judge1 = {}
judge2 = {}
for i = 1, N do
    id = GetValue(Nodes, "ID", i)
    judge1[id] = true  --大循环的判断变量1初始化
end
num = 0
dis = {}  
path = {}
for i1 = 1, N do
    id1 = GetValue(Nodes, "ID", i1)
    --每次大循环都需将小循环的判断变量2重新初始化
    for i0 = 1, N do
        id0 = GetValue(Nodes, "ID", i0)
        judge2[id0] = true
    end
    --若大循环的判断变量1为true(即未检索过该id)才会继续处理
    if judge1[id1] then
        dis[id1] = {}
        path[id1] = {}
        for i2 = 1, N do
            id2 = GetValue(Nodes, "ID", i2)
            --若小循环的判断变量2为true(即未检索过该id)才会继续处理
            if judge2[id2] then
                if id1 == id2 then         --各点到自己的矩阵处理
                    dis[id1][id2] = 0
                    path[id1][id2] = id2
                else                       --各点到其它点的矩阵处理
                    dis[id1][id2] = 1000000  --初始设为无穷大
                    path[id1][id2] = id2
                end
                judge2[id2] = false --若小循环已检索该点,更新判断变量2
            end
        end
        judge1[id1] = false --若大循环已检索该点,更新判断变量1
        num = num + 1       --求得最终共有几个不重复id的点(即矩阵的行数或列数)
    end
end
--输入航线图的路段距离
for linki = 1, L do
    o = GetValue(Links, "O", linki)			--得到路段起点
	d = GetValue(Links, "D", linki)			--得到路段终点
    w = GetValue(Links, "W", linki)         --得到路段距离
    dis[o][d] = w   --无向图处理
    dis[d][o] = w   --无向图处理
end
--Floyd算法核心步骤
for k = 1, num do         --中间点循环
    for v = 1, num do     --起点循环
        for w = 1, num do --终点循环
            if dis[v][w] > (dis[v][k] + dis[k][w]) then  
                dis[v][w] = dis[v][k] + dis[k][w]--更新距离矩阵dis
                path[v][w] = path[v][k]          --更新前置跳转点矩阵path
            end
        end
    end
end
--输出最短距离
for i = 1, num do
    for j = 1, num do
        Print(i,"到",j,"的最短路长为:",dis[i][j])
    end
end
--输出最短距离经过路径(以1为起点将结果与迪杰斯特拉算法结果对比)
v = 1
for i = 1, num do
    w = i
    k = path[v][w]
    Print(v,"到",w,"的最短路径为:")
    Print(v)
    while k ~= w do    --搜索前置跳转点矩阵直至终点
        Print(k)
        k = path[k][w]
    end
    Print(w)
end


结果对比:Dijkstra算法适合求解单源最短路问题,Floyd算法适合求解多源最短路问题。除此之外,计算最短路径的算法还有Bellman-Ford算法、SPFA算法、A*算法等等。

Microcity下载链接:https://microcity.github.io

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 14:11:59  更:2022-01-01 14:13:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:20:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码