A星寻路算法可视化

  • 效果
  • 算法流程
  • 代码

效果

确定起点终点,画障碍,空格启动
红色是探索过的,绿色是当前可探索的。

算法流程

先介绍几个概念

名词 解释
open列表 可探索的方块
closed列表 已探索的方块
方块分数F F = G + H
G 从起点到当前点的距离
H 自己定义的当前点到终点的距离
邻接节点 本例中指上下左右4个节点

我对H的理解是这样的:
H就相当于机器学习里的正则化惩罚,就是一个限制,可以自己确定,比如使用曼哈顿距离或者欧式距离,添加这个的目的是为了使寻路的方向向终点靠拢。(感谢舍友指点)

流程:

  1. 将起点添加到open列表中
  2. 从open列表中寻找F最小的节点,称为current。若current是终点,则停止。将current从open列表移除,然后添加current到closed列表中。
  3. 对于与current的每一个邻接节点neighbor:
    . 如果neighbor在closed列表中:pass
    . 如果neighbor不在open列表中:添加neighbor到open列表然后计算它的F
    . 如果neighbor已经在open列表中:当我们使用当前生成的路径到达那里时,(这一步相当于dijkstra)检查F是否更小。如果是,更新它的F和它的前继
  4. 回到 2

代码

import pygame
import sys
import math
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import osscreen = pygame.display.set_mode((800,800))class spot:def __init__(self,x,y):#坐标self.i = xself.j = y#分数self.f = 0self.g = 0self.h = 0#父节点self.previous = None#是不是障碍self.obs = False#选择状态self.closed = False#权self.value = 1#相邻节点self.neighbors = []def show(self,color,st):if self.closed == False:pygame.draw.rect(screen,color,(self.i*w,self.j*h,w,h),st)pygame.display.update()def path(self,color,st):pygame.draw.rect(screen,color,(self.i*w,self.j*h,w,h),st)pygame.display.update()def addNeighbors(self):i = self.ij = self.jif i < rows-1 and grid[i+1][j].obs == False:self.neighbors.append(grid[i+1][j])if i > 0 and grid[i-1][j].obs == False:self.neighbors.append(grid[i-1][j])if j < cols-1 and grid[i][j+1].obs == False:self.neighbors.append(grid[i][j+1])if j > 0 and grid[i][j-1].obs == False:self.neighbors.append(grid[i][j-1])#行列数
cols = 50
rows = 50#颜色
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
grey = (220,220,220)#格子长宽
w = 800/cols
h = 800/rows#父节点列表
cameFrom = []#创建节点
grid = [0 for i in range(cols)]
for i in range(cols):grid[i] = [0 for i in range(rows)]for i in range(rows):for j in range(cols):grid[i][j] = spot(i,j)#默认起点、终点
start = grid[5][5]
end = grid[7][19]#画界面
for i in range(rows):for j in range(cols):grid[i][j].show((255,255,255),1)#画围墙
for i in range(rows):grid[i][0].show(grey,0)grid[i][cols-1].show(grey,0)grid[0][i].show(grey,0)grid[cols-1][i].show(grey,0)grid[i][0].show(grey,0)grid[i][cols-1].show(grey,0)grid[0][i].show(grey,0)grid[cols-1][i].show(grey,0)grid[i][0].obs = Truegrid[i][cols-1].obs = Truegrid[0][i].obs = Truegrid[cols-1][i].obs = Truegrid[i][0].obs = Truegrid[i][cols-1].obs = Truegrid[0][i].obs = Truegrid[cols-1][i].obs = Truedef onsubmit():global startglobal endst = startBox.get().split(',')ed = endBox.get().split(',')start = grid[int(st[0])][int(st[1])]end = grid[int(ed[0])][int(ed[1])]window.quit()window.destroy()#输入界面
window = Tk()
window.title('请输入')
label_1 = Label(window,text = '起点坐标(x,y): ')
startBox = Entry(window)
label_2 = Label(window,text = '终点坐标(x,y): ')
endBox = Entry(window)
var = IntVar()
showPath = ttk.Checkbutton(window,text = '显示每一步',onvalue=1,offvalue=0,variable=var)
submit = Button(window,text='提交',command=onsubmit)#布局
label_1.grid(row = 0,column = 0,pady = 3)
label_2.grid(row = 1,column = 0,pady = 3)
startBox.grid(row = 0,column = 1,pady = 3)
endBox.grid(row = 1,column = 1,pady = 3)
showPath.grid(columnspan = 2,row = 2)
submit.grid(columnspan = 2,row = 3)#启动输入界面
mainloop()#两个表
openSet = [start]
closeSet = []#显示起点终点
start.show((255,8,127),0)
end.show((255,8,127),0)#监听鼠标位置
def mousePress(x):t = x[0]w = x[1]#判断在第几个格子g1 = t//(800//cols)g2 = w//(800//rows)#设置障碍set_obs = grid[g1][g2]if set_obs != start and set_obs!= end:set_obs.obs = Trueset_obs.show(grey,0)#画障碍
loop = True
while loop:ev = pygame.event.poll()if pygame.mouse.get_pressed()[0]:try:pos = pygame.mouse.get_pos()mousePress(pos)except AttributeError:passif ev.type == pygame.QUIT:pygame.quit()elif ev.type == pygame.KEYDOWN:if ev.key == pygame.K_SPACE:loop = False#画好障碍后,初始邻接节点列表
for i in range(rows):for j in range(cols):grid[i][j].addNeighbors()#启发式方法
def heurisitic(n,e):d = math.sqrt((n.i - e.i)**2 + (n.j - e.j)**2)return ddef main():#openSet初始化时已经包含起点#从中选择f分数最小的if(len(openSet) > 0):lowestIndex = 0for i in range(len(openSet)):if(openSet[i].f < openSet[lowestIndex].f):lowestIndex = i#对当前节点操作current = openSet[lowestIndex]#找到 打印路径if current == end:temp = current.fwhile current != start:current.closed = Falsecurrent.show(blue, 0)current = current.previousend.show(red, 0)Tk().wm_withdraw()result = messagebox.askokcancel('Program Finished', ('The program finished, the shortest distance \n to the path is ' + str(temp) + ' blocks away, \n would you like to re run the program?'))if result == True:os.execl(sys.executable,sys.executable, *sys.argv)else:ag = Truewhile ag:ev = pygame.event.get()for event in ev:if event.type == pygame.KEYDOWN:ag = Falsebreakpygame.quit()openSet.pop(lowestIndex)closeSet.append(current)neighbors = current.neighborsfor i in range(len(neighbors)):neighbor = neighbors[i]if neighbor not in closeSet:tmpG = current.g + current.valueif neighbor in openSet:if neighbor.g > tmpG:neighbor.g = tmpGneighbor.previous = currentelse:neighbor.g = tmpGopenSet.append(neighbor)neighbor.previous = currentneighbor.h = heurisitic(neighbor,end)neighbor.f = neighbor.g + neighbor.hif var.get():for i in range(len(openSet)):openSet[i].show(green,0)for i in range(len(closeSet)):if closeSet[i] != start:closeSet[i].show(red,0)current.closed = Truewhile True:ev = pygame.event.poll()if ev.type == pygame.QUIT:pygame.quit()main()

A*:python实现A星寻路算法可视化相关推荐

  1. 用Python从零复现A星寻路算法 | 手撕代码#1

    用Python从零复现A星寻路算法 |

  2. UnityA星寻路算法获取最短路径

    UnityA星寻路算法获取最短路径 ~最后效果 1. 场景的搭建 2. 说明 3. Singleton脚本 4. AStarNode脚本 5. AStarManager 脚本 6. Test脚本 7. ...

  3. 【Android】基于A星寻路算法的简单迷宫应用

    简介 基于[漫画算法-小灰的算法之旅]上的A星寻路算法,开发的一个Demo.目前实现后退.重新载入.路径提示.地图刷新等功能.没有做太多的性能优化,算是深化对A星寻路算法的理解. 界面预览: 初始化: ...

  4. 如何实现A星寻路算法 Cocos2d-x 3 0 beta2

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

  5. 如何实现A星寻路算法 Cocos2d-x 3.0 beta2

    本文实践自 Johann Fradj 的文章<How To Implement A* Pathfinding with Cocos2D Tutorial>,文中使用Cocos2D,我在这里 ...

  6. A星寻路算法(A* Search Algorithm)

    你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...

  7. 【解析】A星寻路算法介绍

    你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...

  8. 【A星算法】A星寻路算法详解(小白也可以看懂+C#代码+零基础学习A*)

    1.问题背景 在制作RPG游戏角色和NPC移动时,需要角色自动避开障碍物,到达终点 怎么快速找到一条到达终点的路径? 使用a星寻路算法 2.A星算法的思路 绿色:起点:红色:终点 :黑色:障碍物 新增 ...

  9. 从国产SLG手游来说A星寻路算法

    1. 前文 先说SLG是什么,SLG=Simulation Game,策略类游戏.现特指回合制策略游戏以及即时SLG.有别于SIM(Simulation)类"生活"模拟游戏,SLG ...

最新文章

  1. ES6-3 let进阶、const、全部变量与顶层对象
  2. 绩效工作流_流绩效–您的想法
  3. 计算机二级web题目(1)--web基础
  4. linux neo4j weget,关于在linux中安装neo4j的步骤
  5. Datatables+Bootstrap
  6. mybatisplus 增删改查(普通)
  7. SPSS数据编码(图文+数据集)【SPSS 008期】
  8. JavaMail API详解
  9. linux下载m3u8工具,m3u8命令行下载工具
  10. 【英语-同义词汇词组】study和research的用法及区别
  11. Spring Boot + ECharts
  12. mac M1安装SVN错误Error: Command failed with exit 128: git
  13. 华为鲲鹏是芯片还是服务器,关于芯片:眼见为实华为鲲鹏架构服务器生态大揭秘...
  14. 学习java随堂练习-20220624
  15. Key exchange was not finished,connection is closed近期遇到这个错误sshd更新导致的
  16. 数据科学库(HM)DAY 5
  17. python pygame模块按键响应
  18. linuxprobe
  19. 元素的alt和title有什么异同?
  20. 2022-2027年(新版)中国地铁AFC系统行业发展现状与供需态势报告

热门文章

  1. Unity3D开发的2D游戏---《趣味推箱子》
  2. 基于Java Swing JFream 组件的趣味推箱子小游戏
  3. 纷享销客 java开发实习生面经
  4. 简单Android app之 一键签到 开发日记
  5. mysql实验四数据库查询和视图_数据库-第四次实验报告-视图-t-sql语句
  6. 代码分析 | 单细胞转录组数据整合详解
  7. 山东大学为什么火了_“火得一塌糊涂”的山东大学:号称巨无霸、全国排名前三十...
  8. Camel-学习笔记(一)
  9. PCI设备驱动和相关知识
  10. windows server2016搭建FTP服务器