作者AmosYang (LetMeGoogleThatForYou)
看板java
标题Re: [恶搞] 悬赏踩地雷 AI!
时间Sat Oct 9 23:00:55 2010
※ 引述《wendly777 (小水)》之铭言:
: → AmosYang:大略地看了一下, **感觉** 与 LolAI 的想法很接近… 10/09 13:45
: → AmosYang:但 LolAI 对上 TkcnAI 胜率硬是只有三成 XD 10/09 13:46
: → AmosYang:是故…还是不能靠感觉… ... 10/09 13:53
: → tkcn:我总觉得最近都睡不好... 10/09 14:30
XD
: → wendly777:刚刚看到LolAI最新的code,抓下来PK500场,结果半小时过 10/09 14:51
: → wendly777:了还没跑完= =,我自己跟自己PK大概45秒就跑完500场了 10/09 14:52
: → wendly777:你可能先最佳化一下比较好抓问题,可能太复杂产生bug 10/09 14:54
: → wendly777:讲错应该是500张地图,另外GeminiAI运算速度跟我差不多 10/09 15:02
LolAI 0.5 的 perf 问题在於我一开始对整个架构的需求作了错误的假设
演算法本身的复杂度并不高,但实作的部分很「浪费」
所谓错误的假设,
1. 就是我以为物件的生命周期是 cross-session, 而非仅限於该次 "shoot"
2. 我以为棋盘的大小会是像 30*30 或 50*50 这种规模 (後来才知道是 16*16 XD)
易言之,在我一开始的想法里,整个东西应该是这样运作:
GameEngine 通知 AI: 「轮到你了」
-> AI check 上次计算的资料有没有剩下来
没有的话,AI 开始重新计算
(LolAI 的 initialization 很贵,付了很多为了把实作抽象化的税)
-> AI 计算完成,得到 a set of "shoot" candidates
这些 candidates 肯定是地雷
-> AI 从 shoot candidates 挑一个喂给 GameEngine
剩下没用到的部分 cache 起来
只要之前计算出来的 candidate 还没用完, LolAI 就不用重新计算
但事实上,整个东西是这样运作:
GameEngine 通知 AI: 「轮到你了」
-> AI 开始计算
-> AI 计算完成,得到 a set of "shoot" candidates
-> AI 从 shoot candidates 挑一个喂给 GameEngine
-> AI object 生命周期
必须结束
因为 game engine 并没有 session 的观念
也就是说,AI 并没有办法针对 sesstion 来 cache 资料
所以,一开始我预期为了实作抽象化的税应该不会太惨
且我觉得在大棋盘上,cache 资料会比每回合重新算来得好
但在现行的架构下, LolAI 每一回合都要付这些税… perf 就炸了 XD
又,所谓「实作抽象化」就是 LolAI 可以很简单地用来计算
不同的棋盘上的踩地雷,例如三角形格子、六角形格子
这种实作的 perf 比直接对一个 2D array 作存取来得慢,但写起来比较爽 XD
有兴趣的话可以比较看看,
「如果今天要把 AI 改写成处理六角格的棋盘,或着是 3D
或着是更不规则的形状,看看各种 AI 的实作有多少部分需要重写」 :D
总结:
1. LolAI 因为对整个架构的估计错误, perf 就爆炸了
(但其演算法其实很简洁…虽然 v0.5 里有 50% 的计算是不必要的)
2. LolAI 作者对「抽象化」有异常的执着, perf 就又爆炸了
3. 不管 perf 有没有炸, LolAI 目前只能在
「根据现有的资料判断一定是地雷的格子」这点上与其他 AI 分庭抗礼
在「根据现有的资料判断有可能是地雷的格子」这点上是确实输给其他 AI 的
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 24.148.239.184
易言之, LolAI 可以说是完全惨败
画蛇添足的下场就是 perf 吃的比别人凶,且胜率没有也比较高
要扭转战局只能砍掉重练,得先去写个一、两百题 ACM 把脑残治好 XD
※ 编辑: AmosYang 来自: 24.148.239.184 (10/09 23:13)
1F:推 godfat:我只有 nearby method 需要重写,其他都不用动 :D 10/10 02:01
2F:→ AmosYang:我的是叫 getNeighbors() :D 10/10 07:00
3F:→ wendly777:我有定义一个point物件,将x与y座标化为一个唯一id,利 10/10 10:59
4F:→ wendly777:用id来判断是否重叠,整个演算法只涉及id,所以完全不 10/10 11:00
5F:→ wendly777:用改,只需要建构新的point3D,另外比对id比较快 10/10 11:02