CPU上0.0022S的九宫算法,GPU能更快么?

来源:互联网 发布:华懋科技知乎 编辑:程序博客网 时间:2024/04/27 19:43

欢迎大家下载我上传的资源: (内附源码、详细代码注释、测试数据)

源码1:普通IDA*算法实现八数码

源码2:变相IDA*算法实现八数码,这个我得好好说道说道。

 

一大清早地,跟电脑前发愣,突然想知道8/15数码的GPU速度会怎样,毕竟这可是搜索界的极品问题了。先跟网上狂搜一把,“2005年百度之星”的决赛题目,就这个九宫问题,且看冠军得主楼大牛如何在0.0022s的时间内搞定它(请参看源码)。我用了一天的时间来“破译”这段代码,真的实现了零注释哇,总算呕血看完,也添加了详细注释供后来人参考。

 

不得不赞,有几处用地非常巧妙:

1. 在判断九宫问题有无解情况的时候方法巧妙 (countP – disp[b1][b2])%2 = = 0则无解;

2. 楼大牛是这么用地A* + ID思想:死表就是那个hash表,活动表用地好,head[]使得按预估值从小到大迭代加深(ID式)地进行,expand[]按depth深度从小到大BFS进行考查。而不走常规按DFS进行考查,这里BFS深度不超maxp.

3. 从代码中看地出来,楼天成数学功底很强悍,对整数的那些个计算看地我都然了,他在赛场上那么短的时间还…,百度之星当之无愧! 这个比赛为什么叫A星赛,就这个名堂!

 

顺带科普一下A*/ID/IDA*,以下是我的理解,供初学者参考:

普通的A*算法是这么做地:一个活动表,一个死表(均可用Queue/list/heap/hashtable实现),分别用来记录待扩展结点和已经扩展过的结点。在活动表中的结点按预估函数值f(f=g+h)值从小到大排列,取出最小的,放进死表并把其扩展出的结点进行考查,如果扩展出的结点在活动表、死表中均未出现,说明它是新结点,加入活动表;如果在死表中出现,那么不管了;如果在活动表中出现,看它的f值是不是更小,谁小就用谁(毕竟A*是按预估值小的进行启发式搜索地)。上面的过程重复进行直到找到目标。所以总地来说,活动表要支持查找、删除、更新、排序功能;死表要支持查找、插入功能。

 

ID算法将深度设置为dep,对于一个树做深度优先的遍历(节制条件:所有节点的深度不大于dep),如果没有找到目标,那么将dep++,重复上面的过程直到找到目标。

 

IDA*(迭代深度优先)算法在是A*与ID算法的结合物,用了A*算法的预估方法和预估值(f=g+h),用了ID算法的迭代深入(最初从Manhatton距离开始)。较之A*算法,IDA*算法不需要Open表和Closed表,大大节省了内存空间,而且IDA*算法可以不采用递归式程序设计方法,这样也可以节约堆栈空间。 IDA*在进行搜索时,使用耗散值(f=g+h)替代ID中的深度值,在那些不超过给定值的结点中进行DFS,当深度超过一给定阈值时,去掉相应的分支并进行回溯。如果搜索不成功,那么返回头节点,并且使耗散值变大(具体为所有超过上次限定值节点中的最小耗散,在迭代过程中需要纪录那些已经探知的,超过限定的节点的耗散函数值,然后挑选其中的最小值,再次进行搜索)。

 

 下一步就该CUDA大显身手啦。预知效率如何,且听下次分解啦!毕竟GPU实现+优化也是需要点时间的嘛!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 cf进房间闪退怎么办 手游cf账号封了怎么办 大门牙缺了一块怎么办 缺了一颗牙齿怎么办 CF购买医疗包竞猜币没到账怎么办 CF手游昵称不合法怎么办 微信gif尺寸过大怎么办 微信表情上限300怎么办 太受欢迎了怎么办快穿 兔宝宝沾上人气味怎么办 我该怎么办的文字图片 爱奇艺缓存视频显示下载失败怎么办 把老公惹生气了怎么办 苹果x用电量太快怎么办 小中考地生没过怎么办 如果遇到不负责的语文老师怎么办 孩子的语文老师教的不好怎么办 刚买的小猫很凶怎么办 2月幼犬不吃东西怎么办 小狗狗不吃狗粮怎么办 母猫不会照顾小猫怎么办 刚买的小狗拉稀怎么办 母兔子吃小兔子怎么办 照片照出来背亮景人是黑的怎么办 手机透明壳变黄了怎么办 ae视频渲染太慢怎么办 3ce口红太干了怎么办 中考误用0.38mm的笔怎么办 ps画笔都锁住了怎么办 削铅笔机坏了怎么办 幼儿园小朋友不听老师话怎么办 孩子在幼儿园不听老师话怎么办 幼儿园大班孩子上课不好好上怎么办 脸上挠了血印子怎么办 大班公开课烫伤了怎么办教案 孩子心理出现了问题该怎么办 幼师打孩子很多家长告怎么办 课堂上纪律不好的学生怎么办 孩子上幼儿园总感冒怎么办 孩子上幼儿园总生病怎么办 台湾人抗拒统大陆人中国人怎么办