目录
Python算法之旅:http://iyenn.com/rec/1699032.html?spm=1001.2014.3001.5502
欢迎志同道合者一起交流学习,我的QQ:94509325/微信
飞行棋(Flying Chess)算法是一种搜索算法,主要用于解决图搜索和路径规划问题。它的主要特点是可以“飞跃”到棋盘上任何位置,从而大大减少了搜索的时间和空间复杂度。以下是一些飞行棋算法的实际应用场景:
1、路径规划:在机器人领域,飞行棋算法可以用于规划机器人的运动路径。机器人可以根据当前的位置和目标位置,通过飞行棋算法找到一条最优的路径。
2、网络路由:在计算机网络中,飞行棋算法可以用于数据包的路由选择。通过计算数据包从源节点到目标节点的最优路径,可以提高网络传输的效率。
3、资源分配:在资源分配问题中,飞行棋算法可以用于寻找最优的资源分配方案。例如,在任务调度问题中,可以使用飞行棋算法找到最优的任务分配方案。
4、旅行商问题:在经典的旅行商问题(TSP)中,飞行棋算法可以用于寻找最短的旅行路线。旅行商需要访问一组城市,并在这些城市之间旅行,目标是找到一条总距离最短的路线。
5、图像分割:在计算机视觉领域,飞行棋算法可以用于图像分割问题。通过对图像进行网格化处理,可以将图像分割问题转化为图搜索问题,进而使用飞行棋算法求解。
6、游戏AI:在游戏开发中,飞行棋算法可以用于游戏AI的实现。例如,在策略游戏中,AI可以使用飞行棋算法来规划单位的移动和攻击。
7、模拟实验与科学研究:在科学研究中,有时需要模拟随机过程来观察和分析系统的行为。飞行棋算法的原理可以用于构建简单的随机模型,用于模拟和测试某些现象或系统的特性。例如,在生物学或物理学领域,研究人员可能会使用类似的随机算法来模拟种群动态、粒子运动等复杂过程。
总之,飞行棋算法在很多需要解决图搜索和路径规划问题的领域都有实际应用场景。
1、 飞行棋(SPFA):
1-1、Python:
- # 1.问题描述:
- # 一维棋盘,起点在棋盘的最左侧,终点在棋盘的最右侧,棋盘上有几个位置和其他位置相连,如果pos1和pos2相连,但连接是单向的,即当棋子落在位置pos1时,
- # 可以选择不投骰子,直接移动棋子从pos1到pos2,但不能从pos2移动到pos1.给定这个棋盘的长度length和位置的相连情况connections,用六面骰子(点数1-6),
- # 问最少需要投几次骰子才能到达终点?
- # 2.问题示例:
- # 输入length = 10 和 connections = [[2, 10]],输出结果为1;即0 -> 2(投骰子), 2 -> 10(直接相连);输入length = 15 和 connections =
- # [[2, 8], [6, 9]],输出结果为2,即0 -> 6(投骰子), 6 -> 9(直接相连),9 -> 15(投骰子).
- # 3.代码实现:
- class Solution:
- def flying_chess(self, length, connections) :
- # 初始化距离数组,所有位置到起点的初始距离设为无穷大
- dist = [float('inf')] * (length + 1)
- # 初始化访问数组,记录位置是否被访问过
- vis = [0] * (length + 1)
- # 初始化队列,用于广度优先搜索
- Q = [0] * (length + 1)
- # 队列起始位置
- st = 0
- # 队列结束位置
- ed = 0
- # 起点到起点的距离为0
- dist[1] = 0
- # 标记起点为已访问
- vis[1] = 1
- # 将起点加入队列
- Q[ed] = 1
- # 队列结束位置向后移动
- ed += 1
- # 当队列不为空时,执行循环
- while st < ed:
- # 队列头部元素出队
- u = Q[st]
- # 队列起始位置向后移动
- st += 1
- # 标记当前位置为未访问,因为接下来要检查它的邻居
- vis[u] = 0
- # 遍历所有的连接点
- for roads in connections:
- # 如果连接点的起点不是当前位置,则跳过
- if roads[0] != u:
- continue
- # 连接点的目标位置
- v = roads[1]
- # 如果通过当前位置到达目标位置的距离更短,则更新距离
- if dist[v] > dist[u]:
- dist[v] = dist[u]
- # 如果目标位置未被访问过
- if vis[v] == 0:
- # 标记目标位置为已访问
- vis[v] = 1
- # 将目标位置加入队列
- Q[ed] = v
- # 队列结束位置向后移动
- ed += 1
- # 遍历从当前位置连续向前跳1到6步的所有可能位置
- for i in range(1, 7):
- # 如果跳步后的位置超出了棋盘长度,则停止检查
- if i + u > length:
- break
- # 跳步后的位置
- v = i + u
- # 如果通过当前位置连续跳步到达目标位置的距离更短,则更新距离
- if dist[v] > dist[u] + 1:
- dist[v] = dist[u] + 1
- # 如果目标位置未被访问过
- if vis[v] == 0:
- # 标记目标位置为已访问
- vis[v] = 1
- # 将目标位置加入队列
- Q[ed] = v
- # 队列结束位置向后移动
- ed += 1
- # 返回从起点到终点的最少步数
- return dist[length]
- # 主函数
- if __name__ == '__main__':
- # 初始化棋盘长度
- length = 15
- # 初始化跳点集合
- connections = [[2, 8], [6, 9]]
- # 创建Solution对象
- solution = Solution()
- # 输出棋盘长度
- print("棋盘长度:", length)
- # 输出跳点连接
- print("跳点连接:", connections)
- # 调用flying_chess函数并输出结果
- print("最少需要步数:", solution.flying_chess(length, connections))
- # 4.运行结果:
- # 棋盘长度: 15
- # 跳点连接: [[2, 8], [6, 9]]
- # 最少需要步数: 2
1-2、VBA:
- Rem 自定义函数,功能:飞行棋(SPFA)
- Function flying_chess(length As Integer, connections As Variant) As Variant
- Dim dist() As Double
- Dim vis() As Integer
- Dim Q() As Integer
- Dim st As Integer
- Dim ed As Integer
- Dim u As Integer
- Dim v As Integer
- Dim i As Integer
- Dim roads As Variant
-
- ' 初始化数组
- ReDim dist(1 To length + 1)
- ReDim vis(1 To length + 1)
- ReDim Q(1 To length + 1)
-
- ' 初始化距离和访问状态
- For i = 1 To length + 1
- dist(i) = 99 ^ 99
- vis(i) = 0
- Next i
-
- ' 设置起点和队列
- st = 1
- ed = 1
- dist(1) = 0
- vis(1) = 1
- Q(ed) = 1
- ed = ed + 1
-
- ' 主循环
- While st < ed
- u = Q(st)
- st = st + 1
- vis(u) = 0
-
- ' 遍历连接
- For Each roads In connections
- v = roads(1)
- If v <= length Then
- If dist(roads(1)) > dist(v) Then
- dist(v) = dist(u)
- If vis(v) = 0 Then
- vis(v) = 1
- Q(ed) = v
- ed = ed + 1
- End If
- End If
- End If
- Next roads
-
- ' 遍历跳跃
- For i = 1 To 6
- v = u + i
- If v > length Then Exit For
- If dist(v) > dist(u) + 1 Then
- dist(v) = dist(u) + 1
- If vis(v) = 0 Then
- vis(v) = 1
- Q(ed) = v
- ed = ed + 1
- End If
- End If
- Next i
- Wend
-
- ' 返回到达指定长度的最少步数
- flying_chess = dist(length)
- End Function
- Rem 执行过程,功能:调用自定义函数flying_chess,以弹窗方式输出结果
- Sub TestRun()
- ' 定义变量
- Dim length As Integer
- Dim connections As Variant
- Dim result As Integer
- Dim i As Integer, j As Integer
-
- ' 输入棋盘长度
- length = 15
- ' 输入跳点集合,针对每个子区间,都可以直连,即骰子投出2时,可以实现先走两步,再通过起跳点2直接到达8的位置;骰子投出6时,可以实现先走六步,再通过起跳点6直接到达9的位置
- connections = Array(Array(2, 8), Array(6, 9))
- ' 调用自定义函数,返回到达指定长度的最少步数
- result = flying_chess(length, connections)
- '输出结果
- MsgBox "棋盘长度:" & length & vbCrLf & _
- "跳点连接:" & vbCrLf & Join(Application.Transpose(Application.index(connections, 0, 1)), ", ") & " => " & Join(Application.Transpose(Application.index(connections, 0, 2)), ", ") & vbCrLf & _
- "最少需要步数:" & result, vbInformation, "飞行棋"
- End Sub
注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行TestRun程序,以弹窗方式输出结果。
2、相关文章:
2-1、Python-VBA编程500例-015-01(入门级)
2-2、Python-VBA编程500例-015-02(入门级)
Python算法之旅:http://iyenn.com/rec/1699032.html?spm=1001.2014.3001.5502
个人主页:非风V非雨-CSDN博客
欢迎志同道合者一起交流学习,我的QQ:94509325/微信:



评论记录:
回复评论: