纯lua版A*算法优化测试
来源:互联网 发布:学淘宝开店 编辑:程序博客网 时间:2024/05/29 13:05
写了个A*算法的lua版本,也参考了不少网上资料还有开源的代码,关于写这个的原因,只是在做一个rts的寻路,写了个lua版本也是图省事,想尽快看效果。出于程序员的好奇和执着,修改了好几个版本,优化算法,提高了一些效率,当然这里还有优化的余地,就不做进一步深入了,毕竟时间有限,优化的结果也是很明显的。
关于A*算法的基本原理,可以参考一个很好教程:http://www.policyalmanac.org/games/aStarTutorial.htm
优化
关于A*算法的优化,无非以下二点:
- openlist、closelist的查找
- openlist中获得最优节点
这里优化的方向有针对性,不同需要有不同的优化策略。这里我们研究的是针对2维地图的优化方案。
解决第一点,是要有好的查找效率,简单的可以用hash来加速查找。当然lua里直接map就可以提升不少速度:
local idx = self:getIndex(row, col) local curNode = self:getNode(node, row, col, (row ~= node.row and col ~= node.col)) local openNode = self.open_list[idx] local closeNode = self.close_list[idx] if not openNode and not closeNode then -- 不在OPEN表和CLOSE表中 self.open_list[idx] = curNode elseif openNode then -- 在OPEN表 if openNode.f > curNode.f then -- 更新OPEN表中的节点 self.open_list[idx] = curNode end else -- 在CLOSE表中 if closeNode.f > curNode.f then self.open_list[idx] = curNode self.close_list[idx] = nil end end
解决第二点,是要让openlist更快的查找最小f值节点,这里使用更快的heap,代码参考https://github.com/Yonaba/Binary-Heaps:
-- start node local idx = self:getIndex(self.startPoint.row, self.startPoint.col) self.open_list:push(self.nodes[idx]) -- walkable local check = function(row, col) ... end local dir = self.four_dir and four_dir or eight_dir while not self.open_list:empty() do -- check local node = self.open_list:pop() node.state = 2 if node.row == self.endPoint.row and node.col == self.endPoint.col then -- found end for i = 1, #dir do local row = node.row + dir[i][1] local col = node.col + dir[i][2] local idx = self:getIndex(row, col) if check(row, col) then local g, h, f = self:getCost(node, row, col, ...) local newNode = self.nodes[idx] if newNode.state == 0 then -- add new node newNode.father = node newNode.g = g newNode.h = h newNode.f = f newNode.state = 1 self.open_list:push(newNode) elseif newNode.state == 1 then -- alreay in openlist if newNode.f > f then -- a better way then update newNode.father = node newNode.g = g newNode.h = h newNode.f = f end else -- in closelist end end end end
测试结果
测试环境使用cocos2dx2.2.6-lua,地图tilemap,大小50*50,地图信息如下:
PC - Experiment1 实验结果:
PC - Experiment2 实验结果:
Mobile - Experiment1 实验结果:
Mobile - Experiment2 实验结果:
Repository
github:adamwu
往后可能写个c++版本的,毕竟lua效率要差些。
1 0
- 纯lua版A*算法优化测试
- 纯lua脚本搜索算法优化
- A*算法lua实现
- 纯代码LUA版农历
- A*寻路 -- 算法优化
- Csv转Lua工具(纯Lua版)
- 一次优化Lua算法的经历
- Lua版本冒泡算法及其优化
- lua实现A星最短路径算法
- A*寻路算法的lua实现
- A星寻路算法的Lua实现
- cocos2dx A*寻路算法lua实现
- 纯lua实现MD5
- lua实现的A星(a star)算法
- A*算法的C#实现(纯代码)
- lua a
- 纯Lua实现的Base64
- 纯Lua实现Rc4加密
- Apache Shiro 使用手册(五)Shiro 配置说明
- 自定义RatingBar 评分控件
- 悲剧!Homebrew 的作者被 Google 拒啦,因为他不会翻转二叉树(转自V2EX)
- jsp的<%%>
- NFS
- 纯lua版A*算法优化测试
- Android项目开发前的准备工作
- nodejs 学习资料
- 关于Q3ListView的排序功能
- .lds链接脚本基础
- 距离汇总
- swift 用GCD写的倒计时 防止计时器不准
- AspNet MVC4 教学-28:Asp.Net MVC4 Ajax技术实现除法取整取余快速Demo
- Top 10 content management systems