时雨小径 May the Spirit be with you

曼谷印象

一开始跟我说要去曼谷的时候,我是拒绝的。
因为当出现泰国这个词时,我的脑海里出现的画面总是逃不过大象,蟒蛇和弯着膝盖跳舞的罗汉们。
当然了,因着某些不可抗力,最后我还是坚定(听话)地买了两张飞曼谷的机票。

Day 1 萨瓦迪卡

这句问候语直到最后我都没有成功地对一个当地人说出,原因是我觉得说这句话的时候双手一定得配合地合成十字,然而不碰巧的是每次我想说这句话的时候某只手上总是有东西,试图合十却总是变成了抱拳,若是一口吼错怕是要被误认为切磋泰拳。

从落地签到出机场大概花了我们四十分钟的时间,机场出口那儿有非常多的出租车,有工作人员安排取票候车,秩序井然。然而轮到我们的时候,发现那个司机并不会英文,于是我们打印出来的英文酒店地址也派不上用场,幸好上面有电话号码,司机电话确认地址之后也还是顺利到达。也算是吃了个教训,以后去英文非官方语言的地方旅行的话还是得打印出当地语言的资料才行。
路上碰上了曼谷的塞车,google了一下发现原来是普遍现象,在曼谷平均2、3个人就有一辆车,堵起来的时候就是露天的停车场。

第一天的晚餐在一家叫Eat Me的餐厅,主要都是招待外国游客的。菜的份量偏小但是意料之外地好吃。
吃完饭沿着是隆街一路逛,沿街有两排地摊货夜市,最后在一个拖鞋摊前象征性地砍了砍价300泰铢买了两双拖鞋。

晚上睡前看了看泰国的偶像剧,W和我都表示泰国人男帅女靓甩国内几条街。

Day 2 将错就错

对于旅行计划来说,容错性很重要,而更重要的是两颗休闲的心,和一个在身边笑着说你白痴的人。

早上本来的计划是去大皇宫,然而因为我没睡醒的缘故,上错了BTS线,乘往了相反的方向,来到了暹罗广场。
暹罗广场附近基本上就是一个购物和吃饭的地方,其中Siam Paragon的第一层有世界各地的食物,楼上还有家非常大的书店,书的种类感觉比香港的诚品还要多些,只不过价格也很贵就是了。
因为都很厌恶无尽的队伍,我和W在海洋公园门口和鱼的模型拍照留念之后便算是去过了。

晚上去了淘宝上订购的大珍珠号夜游湄南河游轮,自助餐不咋的,夜景说实在也是一般,河道两岸大部分都是黑漆漆一片,路过了一处零星的烟花。
回酒店之后在街对面的按摩店做了个脚底按摩,W说按得很好,我觉得略欠份力道。

Day 3 鸟兽虫鱼

基本上这是一个结合了酷热与阴凉,喧闹与秩序,野性与艺术,猎人与猎物的地方。

上午的大皇宫之行就一句话带过吧,天气太热,真的愿意了解不如上网去看。
睡了个午觉之后悠闲地前往恰图恰集市,到了之后发现可以说是名不虚传,街道两旁都是一眼望不到头的店铺,厉害的是这些店铺里除了卖食物的之外鲜有重复,让人保持好奇不断地探索。
我们在穿过N条小巷之后不小心闯入了本地的一个类似花鸟市场的区域,不一样的是这里卖的不止麻雀,更有大型蜥蜴,热带鹦鹉。在W远离禽类的决定下,我们四处逃窜并最终迷失在鸡鸣狗叫之中。
其实这个地方真的很好逛,若是早的话应该还能逛好一会儿。

晚上吃完晚饭后来到酒店门口的小酒吧,我找了张沙发椅,W坐在我对面的摇椅上,问我,你觉得曼谷是一个怎么样的城市?我回答说这是一个非常多元化的城市,包容性极强,然而又在包容外来文化的同时让自己本身的传统得到很大程度的保留。

喧闹如满城的汽车,而很少有见抢道鸣笛;世俗如红灯区遍地,而也有敬虔的路人经过佛像便要合十礼拜。

这是一个接近之后才会让人产生了解欲的城市。

后记

回到香港之后,一切又挤了起来,夏天也带着湿气回到了这里,而我,终于可以穿着沙滩裤去上班了。

九月末

最近几天把三体从第二部的后半部分到第三部都看完了, 关于想象力什么的其实并没有太大的感觉, 因为觉得神造现在这个地球留下的痕迹已经足够惊艳了.

有几个喜欢的地方, 四个面壁者的计划, 四维碎块和魔法, 还有就是三体人的觉醒.

文笔是真的不对胃口, 看着那些背台词一样的对话忍不住不出戏. 还有那拥有亘古不变'人性'的群众, 最钟意的就是颠来倒去地捧完这个骂那个, 骂完这个捧那个, 在三部曲里乐此不疲地轮番出现领饭盒, 实在无趣.

关于人物, 没有一个是喜欢得起来的. 喜欢不起来的原因是实在不真实, 性格特征随意地根据剧情需要而改变, 最后那令人粪脉喷张的狗血感情戏让从第二部积累起来的一点点好感丧失殆尽.

真要拍电影的话, 对导演和编剧的要求应该老高了吧.


最近的项目是用angular, 觉得跟之前写js相比真是工业时代和农耕时代的区别了.

可惜工作都忙到没有时间写自己的东西了, 果然香港还是比南加州chur多了.

境外使用网易云音乐的Chrome插件

网易云音乐是一个比较良心的产品, 所以尽管我一直不在国内, 每次打开一个歌单大部分都是灰色的不能播放, 我还是买了一年的那个资源包, 算是支持了一把.

之前在网上看到一个方法是改dns, 试过一阵子, 但是因为会有一些负面影响于是就又放弃了. 最近琢磨着有没有其他的办法.

昨天花了一个早上研究了下云音乐网页版的前端代码, 结果发现, 对于一首歌曲能不能播放的判断逻辑是放在前端里的.

(|||゚д゚)

简单来说是这样子的, 有一个叫GCopyrights的全局变量, 它原来是等于[5001,7002,…7001]这样子的, 数组里呢是一些禁止播放的copyrightId, 每首歌呢有一个copyrightId, 如果在GCopyrights找不到这首歌的copyrightId, 那么这首歌就可以播放, 否则就不行.

于是抱着试一试的心态, 我在console里运行了一句

window.GCopyrights = [];

结果, 灰色的歌就可以播放了! 。:.゚ヽ(*´∀`)ノ゚.:。

然后写了一个Chrome插件来帮我去掉灰化的css以及自动执行上面那句js.
已经发布到了Chrome Store, 在境外的喜欢云音乐的同学可以试一下.

插件下载链接

战棋游戏AI设计心得体会

来说说最近写的战棋AI的一点点心得. 要做到运筹帷幄, 进行基于全局的统筹规划, 目前来看难度太高, 还是觉得从写一个好的考虑局部决策的AI比较现实.

作为一个最基本的战棋游戏, 每一个单位应该具有基本的属性,比如体力,行动力, 攻击力, 防御力, 攻击范围等等.
而对于回合制的战棋游戏来说, AI需要在每一个回合做出一个决策, 在这里, 选取决策应该是一个决策集合里面AI认为最好的一个. 我们希望AI能合理地选择出一个AI, 因此首先需要将决策量化.

量化决策

如何量化一个决策? 首先我们需要考虑AI做决策的目的是什么, 比如一个AI的目的是杀死全部敌人, 而另一个的目的是支撑更多回合, 这两个所使用的量化手段就会有不同.

因为基本的战棋游戏就有两种策略, 进攻和防守, 所以在一开始我们可以定义一系列AI的策略类型, 举个简单的例子就是分成四个:

  1. 进攻型
  2. 极端进攻型
  3. 防守型
  4. 极端防守型

先记住这些, 我们后面会用到.

再接着说量化方法, 这是我最近考虑到的一些可以量化的因素:

决策的进攻性 – 当这个值越大表示该决策可以产生越大的进攻性

对这个变量产生影响的因素可以有:

  1. 与所有敌人的距离总和. 距离可以是欧几里得距离, 也可以是更具体的考虑地图移动性的'实际距离'.
  2. AI做出该决策后所处位置将有能力攻击到的敌人.
  3. 如果该决策是攻击, 那么考虑对攻击对象产生的伤害, 并量化该伤害对敌方总体产生的削弱影响.

决策的危险性 – 当这个值越大表示该决策会对当前AI造成越大的潜在危险

  1. 与所有敌人的距离. 同上.
  2. AI做出该决策后所处位置将有可能被攻击到的敌人.
  3. 如果该决策是攻击, 且攻击有可能无法杀死敌人, 考虑被反击造成的伤害对我方总体产生的削弱影响.

考虑这些因素之后, 对于每一个决策, 得到两个值, $A_i$ 和 $D_i$, 在对它们进行标准化之后, 我们可以根据策略类型$f$得到该决策的一个量化值.

$Score_i = f_{s,a}(A_i) + f_{s,d}(D_i)$

比如说极端进攻型的量化函数就可以是$ Score_i = 0.8 * A_i - 0.2 * D_i $, 只有当危险性远大于攻击性时, AI才认为该决策更'差'一些.

执行顺序

简单量化完之后, 还有一个问题, 那就是AI执行的顺序.

因为AI对决策进行量化都是根据当前形势, 而当一个AI执行完之后, 往往会导致另外一个AI不能执行其最优决策, 比如一个步兵先动, 挡住了一条路, 结果好几个骑兵被堵住无法通过.

跟妹子讨论了这个问题, 给了我一个从经济学方面考虑的方法, 在决定顺序时引入机会成本的概念. 对每一个AI的最优决策, 量化该决策的机会成本, 然后选取拥有当前机会成本最小的AI执行它的决策. 不断迭代, 直到每一个AI都执行完毕. 我觉得这个方法挺好的, 在不想遍历所有可行顺序的情况下, 应该可以找到一个比较优秀的解.

那么怎么量化机会成本呢, 最简单的就是假设某个AI执行了它的最优决策, 然后在这个局势下计算所有其他AI的决策量化值, 并与之前的比较, 累计差值最作为机会成本.

结语

写AI是一件很有趣的事情, 尤其是当你观察到AI做出一个你认为还算'聪明'的决策的时候.

新年的时候

现在的时间是凌晨三点, 带着迟到的时差感和木馒头.

正在听到电台里放到宋冬野的
到是也切合这时间.

今年会在香港开始第二份工作.

这个还真的是万万妹想到的一件事情.

而且我发现自从有了女朋友之后就啥都写不出来了.