追商 首先声明,本文只从技术的角度讨论追商,不涉及道德评价。
之所以会花一些闲暇时间来研究这个问题,不过是这几天对 JScript 和曲线拟合有点兴趣. 碰巧拿战神中的追商问题来练练手而已. 笔者花了3天的空余时间,基本能够对+-500页以内贸易的商队的时间进行0秒误差的准确预测(用过1,3,9级贸易分别试验过15次左右)。
附: 笔者不是学数学的,而且离开大学也很多年了.现在主要是做与计算机系统软件和硬件相关的工作. 所以可能对数据拟合的理解有所偏差。
欢迎不同的见解,希望能够抛砖引玉.
追商的定义:
可能大家对这个问题有不同的理解. 在本文中,我的理解是 通过调整军队和商队的时间差,迫使卖家与前来掠夺的军队正面战斗.
具体包含3个步骤:
1) 掠夺者购买卖家的出售物资,根据掠夺者和卖家之间的距离,以及贸易中心等级,推导出贸易达成的时间. 假设是x秒钟后.
2) 掠夺者估计自己的军队到达卖家的时间,假设是y秒后(y<x).
3) 在 x-y+1 秒钟之后,掠夺者发兵打卖家. 使得掠夺者的军队到达卖家的城的时刻只比贸易达成的时刻晚一秒.
注意,这里"追商"的目的只是迫使卖家与掠夺者军队正面战斗. 不排除被埋伏的可能.
问题分析:
通俗的说,"追商"玩的就是军队和商队的时间差. 所以要解决这个问题,我们要估测军队的时间和商队的时间.
军队的时间:
这个其实不是一个问题,通过出征页面可以很容易的得到具体时间.
这里,我感兴趣的是,这个公式具体是什么.
另外,通过这个公式,我可以事先算好,我这城里的英雄和我所有的兵种搭配, 在一个小时内,最远能够跨过多少个页面.
我是通过分析 JScript 文件达到这个目的的.
var tmpTime = Math.round((63* Math.sqrt(tmpDist * 200 / msp) + 1)*100/ speedfactor);
另外一种解决方式是通过拟合数据,推导出军队时间与AB城距离和军队速度之间的公式.
商队的时间:
我相信思考过"追商"问题的朋友,都多多少少会从收集商队的时间入手. 从操作上来说,就是记录下从买家开始贸易时刻到贸易完成时刻之间所花的时间.
最简单的方法是,选择两个贸易级别都是1级的城市,记录下每次贸易的商队的时间. 显然贸易级别不变,两座城的距离不变,商队的时间应该也不变.
要理解这些问题,我们要首先理解战神服务器处理贸易的方式.
战神服务器处理贸易的方式:
设计过/写过服务器程序的朋友都知道,怎么提供稳定的服务给更多用户是首要的设计目标之一.
对于战神服务器程序中处理贸易的这部分功能, 有两种可能的设计方法
设计一: 每一秒钟检查所有正在进行中的贸易, 如果这个贸易时间已经到达,增加卖家的银币数量,增加买家的货物数量.
设计二: 每N秒钟检查所有正在进行中的贸易, 如果这个贸易时间已经到达,增加卖家的银币数量,增加买家的货物数量.
比较设计一与设计二,
同样多的时间内,设计二比设计一少做N次的比较.节省了处理器运算时间.
每次更变买卖双方的状态都需要进行数据库操作,可能需要读写磁盘.设计二与设计一相比,给数据库带来的压力更小.
如果用一个特定的进程处理贸易,设计二与设计一相比,进程转换的次数少了N倍.
所以可以看出,设计二远远好于设计一.
(如果我是老板,而战神的程序员使用设计一的话,一定让他明天就回家.)
然后再回头看看数据,很容易发现,目前战神是每 180 秒 处理一次贸易.
这就决定了同样两座城之间的两次贸易的商队的时间,最多会有3分钟的区别.
数据拟合:
影响商队的时间的变量包括距离,贸易等级(通过小实验可以看出只有买方的贸易等级影响商队的时间)
一开始,我们并不能确定距离,贸易等级和商队的时间三者之间的关系是否是线性的.
而拟合含有三个变量的非线性方程需要大量的数据,而这要花费太多的时间.
所以,我采用的方法是,通过固定距离把问题转化为两个变量(贸易等级和商队的时间)的方程.
而且直观上,贸易等级越高,商队时间越短
这个关系可以表示为 商队的时间 = 参数1 / ( (贸易等级 * 参数2 + 参数3) ^ 参数4) + 参数5 ;
根据贸易中心的描述,我们可以知道 参数2 = 10%;
参数3 = 1 或者 0.9
参数3等于1的时候, 贸易9的速度是贸易1的1.9倍
参数3等于0.9的时候, 贸易9的速度是贸易1的1.8/1.1 ~= 1.72 倍
所以我们得到
公式一) 商队的时间 = 参数1 / ( (贸易等级 * 10% + 0.9 ) ^ 参数4) + 参数5 ;
公式二) 商队的时间 = 参数1 / ( (贸易等级 * 10% + 1 ) ^ 参数4) + 参数5 ;
然后带入一组(商队的时间,贸易等级) 的数据-- 笔者用了大约20对数据.
可以推导出 参数1 ,参数4,和参数5的值.
同时,在 "参数4是个整数" 的猜想下, 我倾向于选择公式二.
通过类似的方法可以在固定贸易等级的情况下推出距离和商队的时间的关系.
如何处理误差:
由于系统每3分钟处理一次贸易的运行方式,我们很难得到精确的数据. 所以我们推出的公式一定存在误差.
1) 但是, 使用更多的数据来拟合公式能够减小误差.
2) 同时,这种每3分钟一次的运行方式也给与了我们容忍误差的能力.
比如说系统在 :02:58 :05:58 :08:58 .... :59:58 处理贸易.
根据公式我们推出, 某次贸易在 03:34 完成, 而实际上贸易在 04:58 完成.
但是只要掠夺军队在 :04:59 到达,我们就能达到目的.
系统的处理节奏:
可以看出,得知系统的处理节奏是达到完美追商的重要环节.
正如上面的例子, 通过得知":02:58 :05:58 :08:58 .... :59:58 " 我们才能准确地派出掠夺军队.
其实,获得系统的处理节奏很简单. 只要通过进行一次购买就能得到.
假如说某次购买的交易达成时间是 :11:58, 我们就能推出 ":02:58 :05:58 :08:58 .... :59:58 "是系统的处理节奏.
根据笔者的观察,系统的处理节奏比较稳定.一般同一个节奏会维持几个小时.
备注:
所有试验数据都是在同一时间,两座城之间只有一项贸易正在进行中的情况下收集的.
结论:
1) 商队的时间和买方的贸易等级的一次方成反比。
2) 商队的时间和距离的一次方成正比。
3) 具体交易时间向后推迟到下一次3分钟一次的系统处理贸易的时刻.
4) 其他常数项可以用单变量一次函数拟和得到.
战神II的超级贸易追秒战(风险系数高)
前提,你或者你的盟友可以购买到对手挂在贸易中心的物资装备。
第1步:在正式抢劫前,请购买最少1次对手最少量的物资,然后计算物资交易成功的时间(点下购买那一刻到交易正式完成那一刻之间的时间,最好精确到3秒以内,操作难度很高,但不是不可以做到)。
第2步:按照计算出的交易成功所需要的时间(也就是买方的银正式汇入卖方城堡的时间),然后让你的3连攻击(每波间隔不超过3秒)出发。
只要2波打中,基本上赚得你笑开脸了,不过,这个需要很精密的计算,而且要观察对手的交易中心等级,毕竟交易中心等级决定系统送货时间(交易成功周期),如果算错10秒,就该对手笑了。
仅仅以讨论的目的让狼们改变下思路,纯不负责言论。