基于英雄联盟寻路背景的A星算法及python实现
文章目录
- 前言
- 一、什么是A星算法?
- 二、算法流程
- 三、python算法实现
- 四、结果展示
前言
Astar算法是游戏中最常见的寻路算法,比如LOL的自动导航等。菜鸡的你从水晶复活以后,需要自动导航到大龙坑打团,这时你选择右击小地图上的大龙坑,你的英雄就会自动绕开障碍物前往该处。这是如何实现的呢?
一、什么是A星算法?
Astar算法是在实际生活和工业应用包括游戏设计等情景中所频繁被使用的一种路径规划算法。算法类似于贪婪最佳优先搜索,因为同样属于启发式算法,通过设定一个估价函数来实现。标准算法计算当前位置上相邻的每个节点,其方向可以是四面也可以是八面,并选择估价函数值成本最低的节点加入数组。添加到新数组的节点将用于搜索更多可行的路径。A*搜索算法通过依次扩展具有最小启发函数的节点来寻找最优路径。该算法的计算从它的图中的起始节点开始,通过不断寻找以最低代价函数值到达目标点的节点,并且优先将那些使估价值函数更小的节点加入拓展序列或数组,从而形成一个求解的节点集,在计算的到的每一个节点都放置到一个list中进行记录(大规模问题要使用优先级队列,也就是堆结构来存储),最后通过对list有序的链接来实现整个路径规划的结果。
二、算法流程
由以上A算法的过程图中可以分析得到该算法的核心思维:通过评价函数f(n)的确定来使得A可以不断地前进和运行。这是一种启发式算法,而分析可得f(n)= g(n)+ h(n)是使用评价节点n的估计成本函数,它是由两部分构成的: g(n) 是距离值函数,用来描述从起点到节点n的路径的确切成本,; f (n)是启发函数,表示从节点n到目标的启发式估计成本。
A*算法在进行路径规划和搜索时,通过计算f(n)的值,运用贪婪算法的思维,每次都选取下一个点的依据找到估价成本最低的那个节点,通过多次计算和比较来选择移动方向和节点的。从而实现路径最优。
三、python算法实现
代码如下(示例):
def A_star(org, des):open_list = []close_list = []open_list.append(org)while len(open_list) > 0:temp_node = open_list[0]for node in open_list:if node.f < temp_node.f:temp_node = nodecurrent_node= temp_nodeopen_list.remove(current_node)close_list.append(current_node)#找到当前节点的所有领近节点node_list = []if Is_valid(current_node.x, current_node.y - 1, open_list, close_list):node_list.append(Node(current_node.x, current_node.y - 1))if Is_valid(current_node.x, current_node.y + 1, open_list, close_list):node_list.append(Node(current_node.x, current_node.y + 1))if Is_valid(current_node.x - 1, current_node.y, open_list, close_list):node_list.append(Node(current_node.x - 1, current_node.y))if Is_valid(current_node.x + 1, current_node.y, open_list, close_list):node_list.append(Node(current_node.x + 1, current_node.y))neighbors = node_listfor node in neighbors:if node not in open_list:node.init_node(current_node, des)open_list.append(node)for node in open_list:if (node.x == des.x) and (node.y == des.y):return nodereturn Nonedef Is_valid(x,y,open_list=[],close_list=[]):if x < 0 or x >=len(MAZE) or y < 0 or y >= len(MAZE[0]):return Falseif MAZE[x][y] == 1:return Falseif Is_contain(open_list,x,y):return Falseif Is_contain(close_list,x,y):return Falsereturn Truedef Is_contain(nodes, x, y):for node in nodes:if (node.x == x) and (node.y == y):return Truereturn Falseclass Node:def __init__(self, x, y):self.x = xself.y = yself.f = 0self.g = 0self.h = 0self.parent = Nonedef init_node(self, parent, end):self.parent = parentif parent is not None:self.g = parent.g + 1else:self.g = 1self.h = abs(self.x - end.x) + abs(self.y - end.y)self.f = self.g + self.h#迷宫地图
MAZE = [[0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,1,1,0,1,0],[0,0,0,1,0,0,0,1,0,0,0],[0,0,1,1,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,0,0],[0,0,0,1,1,1,0,1,0,0,0],[0,1,0,0,1,1,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0]
]#设置起始点和终点
org = Node(8, 0)
des = Node(2, 5)result_node = A_star(org, des)path = []
while result_node is not None:path.append(Node(result_node.x, result_node.y))result_node = result_node.parentcnt=0
for i in range(0,len(MAZE)):for j in range(0,len(MAZE[0])):if Is_contain(path, i, j):cnt+=1print("*, ", end='')else:print(str(MAZE[i][j]) + ", ", end='')print()
print("最短路为:",cnt-1)
四、结果展示
结果如图:
左下角为你的复活点org = Node(8, 0)
中间靠上的位置是大龙处des = Node(2, 5)
基于英雄联盟寻路背景的A星算法及python实现相关推荐
- 机器学习算法(七): 基于LightGBM的分类预测(基于英雄联盟10分钟数据判断红蓝方胜负)
机器学习算法(七)基于LightGBM的分类预测 1. 实验室介绍 1.1 LightGBM的介绍 LightGBM是2017年由微软推出的可扩展机器学习系统,是微软旗下DMKT的一个开源项目,由20 ...
- A.机器学习入门算法[七]:基于英雄联盟数据集的LightGBM的分类预测
[机器学习入门与实践]入门必看系列,含数据挖掘项目实战:数据融合.特征优化.特征降维.探索性分析等,实战带你掌握机器学习数据挖掘 专栏详细介绍:[机器学习入门与实践]合集入门必看系列,含数据挖掘项目实 ...
- 【爬虫+数据可视化毕业设计:英雄联盟数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩】
[爬虫+数据可视化毕业设计:英雄联盟数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩] https://b23.tv/TIoy6hj
- 简单在线音乐推荐网 基于用户、物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能、大数据分布式、机器学习开发
简单在线音乐推荐网 基于用户.物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能.大数据分布式.机器学习开发S ...
- 分析5万多场英雄联盟比赛,教你如何轻松用python预测胜负
CDA数据分析师 出品 作者:真达.Mika 数据:真达 后期:Mika [导读] 今天教大家用Python预测英雄联盟比赛胜负.Show me data,用数据说话!今天我们聊一聊 pyth ...
- 机器学习集中训练营——基于英雄联盟数据集的LightGBM分类实战
# 导入包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # ...
- 教你用python爬英雄联盟官网:①掌握爬虫技术;②Python数据可视化
大家好,我是明月十四桥!! 擅长领域:python黑科技.大数据后端研发.数据仓库 今日重点: ① 掌握爬虫技术,体会python爬虫流程,可见即可爬: ② 学会使用python数据可视化. 有问 ...
- 基于多项式插值的亚像素边缘定位算法(python)
本文代码主要是将另外一个博主的c++代码转换成python代码 原文链接:https://blog.csdn.net/yx123919804/article/details/103123071 代码如 ...
- 【数据分析与挖掘】基于LightGBM,XGBoost,逻辑回归的分类预测实战:英雄联盟数据(有数据集和代码)
机器学习-LightGBM 一.LightGBM的介绍与应用 1.1 LightGBM的介绍 1.2 LightGBM的应用 二.数据集来源 三.基于英雄联盟数据集的LightGBM分类实战 Step ...
- 在英雄联盟地图中寻找“数据结构的大门”
作者 | 韩小乐 责编 | 张文 头图 | CSDN 下载自东方 IC 来源 | 乐享Coding(ID:hhl_1393603513) 英雄联盟里的数据结构 程序=数据结构+算法 不知各位有没有玩 ...
最新文章
- 【opus源码分析】【互相关函数源码分析】xcorr_kernal_c
- canvas——橡皮筋式线条绘图应用
- 简单的ALV显示例子
- erlang OTP中的四大behaviour fsm的例子
- 记录一次StackOverflowError问题
- WITH RECOMPILE和OPTION(RECOMPILE)区别
- 保送清华成博士,华为 12 年搞通信,他为何如此看待 5G ?| 人物志
- oracle数据库考试答题,Oracle数据库试题
- this installer requires you to restart your system to finish installing Microsoft VC
- php 横杠箭头,为什么我的箭头下面有一横线?
- TP5路由知识简单个人汇总
- 记录一次成功的EC、BIOS降级操作
- Coverity介绍以及典型缺陷说明
- 如何使用Java计算闰年?
- asp.net WebResource.axd请求报404错误
- c# 基于BouncyCastle.Crypto的国密sm2,sm4封装,与java版本兼容
- // #ifdef MP-WEIXIN微信小程序无效,不执行
- Android 仿微信小程序开屏页加载loading
- 前端学习笔记,加油!
- 用Python来玩微信小游戏跳一跳