GPCT我们的“张鑫马”算法


        感谢韩鑫和张雨禾,大家一起讨论,编码,画图,Debug Debug Debug了一个半月,能得三等奖我们小组都很满意了,只是遗憾于大家的很多想法由于时间原因未能实现。。

     废话少说,开正题吧...

    题目分析:

    很悲剧,今年的题目又是人工智能,题目说白了,就是给《魔塔》这个游戏写人工智能,大家一定都在文曲星上玩过这个游戏,对,这次算法的目标就是让你的程序自动控制英雄(Mario)自己找到公主并且救出来。但是,我们自己在玩这个游戏的时候找出来就行了,而这次比赛的评判规则是:在救出公主的前提下,生命值越高越好,步数越少好,时间越短越好。但是,这三个评判条件是相互制约的。比如:你想让步数越短越好,你就必须选择一条直路,但是在直路上往往怪兽很多,宝石很少,这就会导致生命值损失严重;而如果进行大规模搜索,尽量找最优解,程序时间必然会很长(要求算法在10s之内完成)。。其实困难远不止如此,比如宝石的属性可能会有负值,或者有负有正,这就让规则的复杂度成指数形式上涨了。。。所以如何让自己的Mario更智能呢?

    算法分析:

    在编写代码前小组对各种寻路以及AI算法一一进行了分析,分析结果如下:

    A*     动态性能良好,但是大局意识差,很容易陷入局部最优;

   Dijkstra    大局意识好(在固定的权值下绝对保证解最优),但是动态性能很差,基本上在算法内核中不容得任何动态修改;

   遗传,蚁群,神经网络  这些算法都是站在一个更高的层次全局审查,但是对不同的编码产生的效果差异很大,对于初学者对参数的设定很不容易控制,换句换说,写的好就是金子,写不好就是垃圾。

    对于数据结构,小组选择了C#的泛型集合List<T>用来储存各种集合数据;(但对于一些高性能代码块,为了提高效率还是采用了传统的线性表)

   算法设计:

      Easy题图:  Dijkstra + 小规模动态权值库 + 动态添删 + 贪心;

      真的很佩服Dijkstra这个人,大学课本上不管是什么课都能学到他的成果,佩服他是第一个提出PV操作和信号量的人,初级地图就靠他最著名的Dijkstra最短路径巡游了!

      对于初级地图,由于没有宝石,别看就是这一个条件,问题难度和后面的地图从本质上已经不一样了。这样的图拿A*或者Dijkstra怎么跑都能跑出最优来。经过小组讨论最终决定采用Dijkstra;

     写好了初级算法后的效果是,一般的初级图都能跑出来了:

      

     

     但是由于地图权值是静态的,这会导致Mario过高“评价”自己,去和打不过怪兽战斗,这样,就需要其他算法的配合了;

     我们的算法是:利用贪心算法,在Mario的这条路径上按怪兽强度从小到大依次人为修改怪兽结点权值为10000,这相当于删除这个结点,通过循环,信号量,配合Dijkstra很快就能找到新的最优路径:

     

     对于Easy地图没有太多可以讨论的地方了,重点在Normal和Hard地图了!

     对于Normal和Hard地图:

     算法设计:Dijkstra + 蚁群算法(改进版,算法重点) + 贪心 + A*(稀疏图) + Floyd(稠密图)

    + 动态添删  + 大规模动态权值 + 快速遗传算法

    算法的第一步和Easy图是一样的,但是,由于Dijkstra算法是不会走“回头路”的,所以。当完成若干次的Dijkstrta后,一条“主干道”就形成了,这个过程其实是很复杂的,因为可能会出现各种各样非常苛刻的地图,例如需要按照一定的循序吃宝然后打怪,其中主要运用贪心算法,A*,Flody等算法配合找找的出路(这个过程也是算法中最为重要且最为复杂的一环,他直接影响到算法的稳定性)当然,这不是最优解(其实很多地图想要找到最优解真的太难太难了!)

此后就该蚁群算法登场了!和传统蚁群算法不同的是,在信号量的设定上允许信号量为负,对主干道周围区域进行蚁群搜索,然后将有“价值”的分枝加入“主干道”中来。。这样看似就结束了算法,但实际上,这样用蚁群算法后,由于是将Dikjstra和蚁群所寻找到的路径物理化的连接在一起,所以会出现很多重复走过的结点,有人肯能会说,那我将最终路径进行遍历,删除重复的结点不就完了吗?呵呵,这样看似可以,但却忽略了那些苛刻的地图,有些结点的遍历顺序是不允许改变的,这样你就不能区分哪些可以删,那些不能删。。所以在算法的设计上必须添加大量的标志变量以及判断,具体过程在此就不详细说了。。。

      现在算法就剩最后一步了,快速遗传。。因为这次的游戏规则非常复杂,所以很难找到一个“套路”对结点的权值进行设定。所以算法第一次是老老实实按照游戏规则进行一次相对而言“最合适”的权值设定(但很多情况下,看似合理的权值设定都不一定会有很好的结果),接下来就开始通过不同的权值设定方式进行设定了,小组一共设计了20来个设定方案,进过一个大循环,把每一种方案的结果保存下来,但是要注意,有些情况是找不出解的,这是因为在对待苛刻地图上始终是采用最基本的权值设定方案,没办法,小组只好在算法中加入计时器和异常处理,对于超时和异常情况进行舍弃。

      初始化完成20个种群后(可能只有10几个,经过实验,一般种群大小会在15个以上),现在就可以用遗传算法进行微调了,由于这些种群几乎不能叫做“初始种群”了,所以很快就可以收敛到一起(1~2秒,有的只要0.0几秒),最终的路径,就是本算法的最优路径了~~~~~惊讶

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
共54个文件 2018地球巨大灾难之前的宁静(此文件某管家识别病毒,已加密,密码csdn) 05.eqx_frameskool 2007年作品.exe 12.fr-019 kkino64.exe 13.fr-030 candytron party火星美女.exe 14.flybye卡通.exe 15.fr-041_debris.exe 17.FAiRLiGHT(cpu).EXE 18.国内 psyong.exe 19.apc_universe.exe 22.chaostheory.exe 23.pb3.exe 24.zoom3_v1_02.exe 64K动画大赛作品_彗星撞地球.exe apc_universe.exe Beyond_Final.exe BinaryFlow_ATI.exe BinaryFlow_Nvidia.exe Brullwurfel.exe cat-F-Felix.exe cat-F-Felix_safe.exe chaostheory.exe fr-019-v110.exe fr-022.exe fr-027.exe fr-034.exe fr030-candytron-final-101.exe fr08v101.exe GaiaMachina.exe game. kkrieger.RAS.exe HEAVEN7W.EXE pb3.exe project_genesis.exe prophecy.exe prophecy《彗星撞地球》.exe ptct.exe rgba_195_95_256_win32_pc.exe rgba_paradise_final.exe rzr-the_scene_is_dead.exe squish.exe zoom3_v1_02.exe 之一:幽灵古堡.exe 之三:火域幻境.exe 之二:第七天堂.exe 之五:死亡阴影.exe 之六:金属迷城.exe 之四:爱之记忆.exe 光影.exe 幽灵古堡.exe 死亡阴影.EXE 火域幻境.EXE 爱之记忆.exe 第七天堂.EXE 金属迷城.EXE 彗星撞地球 据说半小时不重复 Warez出品的精品动画 近25万倍的压缩的精品 每年,世界各地著名的Warez组织都会推出一个小的动画片来比较,仅仅是用来炫耀其实力。64K的3D动画。要知道,一首普通的MP3,通常就有 4000K左右,一张普通的JPG压缩图片也要30-40K,而这个仅有63K的3D动画,你花半个小时也看不完而且不重复带音乐. prophecy《彗星撞地球》2000年时的最经典力作!相信大多网友对这个演示是相当熟悉了。将1.9G的数据压缩为64K,其3D渲染和声效却令人震撼,尤其是已64K的大小竟然演示了近30分钟的不重复3D影片,其技术令人震惊~因为,事实上,这个动画的真正容量超过15G,也就是说这个 Warez组织把它压缩了25万倍。注:系统必须安装有 directx8.0才行。因为动画支持DX8.0加速。 表面看起来这是一只小鸭的图片,然而把文件后缀名改成RAR,然后解压缩,很神奇的事情就发生了! 推荐配置:2G/512M/GF4Ti或ATi9600、128M以上 按A键可缩小,按S键放大,按F键快速放,按R键重放…… ++++++++++补充说明的分割线++++++++++++ 1、右键点鸭子图片,选择“图片另存为”。 2、文件后缀名可能无法直接修改,请: (1)右键点屏幕左下角“开始” (2)进入“资源管理器” (3)选择“工具”---“文件夹”选项---“查看” 取消“隐藏已知文件类型的扩展名”前的勾 (4)点“确定” 3、右键点鸭子图片,选择“重命名”,把文件名最后的“Jpg”改为“RAR”,注意,不要加引号。 4、解压缩,出现文件夹。双击其中的“彗星撞地球.exe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值