主题:【原创】最近为公司开发了一个小软件,挺好玩的 -- 温雅颂
自己的Google MAP程序写的更好。
1.方案无法模拟野外路线, 即没有道路的不成。
2.出了直线插值难道没有别的算法?
3.不用和GOOGLE打招呼也可以将GOOGLE MAP用在内部网。最简单的办法之一,改造你的浏览器。
我们的客户中没有off road的要求,所以我们也不需要去模拟了。
线性内插的缺点是假设工作人员在整个路线上行进的速度是匀速的。这当然不符合实际情况,但似乎也没有更好的办法了。因为从孤狗地图上得不到更详细的速度信息了,在速度模拟上硬加一个随机变量也没有多大意义。
不跟孤狗打招呼也可以使用孤狗地图API,只是每次孤狗都要弹出一个message,提醒你所用的孤狗地图API的KEY已经在别的地方用了,要求你去另外申请一个Key而已。这对于个人来说,不过是有一点麻烦,但对一个公司来说,这等于是违反了孤狗的term of use,公司就比较有顾虑。
因为我需要模拟一个有几千员工的公司一年时间内户外工作人员的行车路线数据。这时我就遇到这样一个选择:假如把一个员工一天的行车路线看作一个单元,我要模拟的实际是一个M*N的二维数组,其中M为一年中的工作日,N为员工数。整个模拟过程无非是一个个生成这个二维数组中的每个单元而已。但是,我究竟是先M后N好呢,还是先N后M好?换句话说,我是先把每个员工第一天的数据模拟出来,再模拟每个员工第二天的数据好呢(员工为内循环,工作日为外循环)?还是先模拟出一个员工一年的数据,再模拟第二个员工一年的数据(工作日为内循环,员工为外循环)?
以员工为内循环的好处是,我可以在某个时间段内模拟一些意外情况,这样所有员工的网络状况在那一天都可能受到这个意外情况的影响。而以工作日为内循环的好处是,这个模拟软件可以很方便地在多个计算机上运行,同时产生模拟数据。多台计算机同时运行同样的模拟软件,一个主要问题就是所模拟的用户名称必须是单一的,绝对不会和其它计算机的模拟软件产生相同的用户名。
因为我们需要尽快产生足够数量的模拟数据,使用多台计算机同时生成模拟数据的可能性很大,所以我就选择了以工作日为内循环的方式,每台计算机模拟产生的用户名则是该计算机的登录者ID,加上计算机名称,和一个四位数的序列号。这样一来,即使同一个人在多台计算机上登录并运行这个模拟软件,因为计算机名称不可能相同,所产生的用户名也必然不同。当然,还有一个要做的是防止有人在同一台计算机上同时运行多个模拟软件,这就需要把它做成single instance的软件。这样就保证了所模拟出来的用户名的唯一性。
这样一来,这个模拟软件的用户界面就会非常简单,不需要任何特殊的设置和选择,直接运行就可以了。要是公司里几十上百人运行它,所模拟出的用户名就会有很多的变化,然而又有一定的规律性,便于测试系统对用户名的检索功能。
下一个要解决的就是单个员工单个工作日的行车路线模拟。这一步没什么技术性,但因为要使模拟数据逼真,我还是花了点心思在上面。
首先我在地图上画了三个嵌套的范围,最内圈是城区,中间圈近郊,最外圈是远郊。然后把员工分成三拨,一拨(60%)负责城区,一拨(30%)负责近郊,一拨(10%)负责远郊。
在模拟员工路线时,每个员工上班后,我先给他半小时以内的一个随机数,用来喝咖啡和做准备。因此每个员工并不是一上班就出发,而是有先有后,显得比较自然一些。
出发的第一个目的地是一个随机的经纬度,但是要在他所负责的范围内。他从公司总部出发去第一个目的地,这就形成了第一条路径。这时我需要记下这第一条路径所需要的时间,作为他返回公司总部所需时间的参考。
到了目的地后,我再给他半小时以内的一个随机数,作为他在那里工作的时间,比如对于一个电力部门的用户来说,这可能就是他在某家修理电路故障。干完活以后,就从这里出发去下一个目的地。
后面若干目的地的选择,将在一个以第一目的地为圆心,以到总部的距离的一半为半径的范围内随机选取经纬度。这样看起来也比较自然,否则他有可能东南西北到处跑,并且一天内几次经过公司总部,那就显得不够真实了。
在他每到一个目的地时,模拟软件都要记录下他离下班时间还有多长时间。如果离下班时间已经小于他返回总部所需要的时间,他下一个目的地就是当天的最后一个目的地,也就是返回公司总部。显然,如果他倒数第二个目的地如果离公司很近,他可能早下班。如果很远,他可能晚下班。平均起来公平合理。
考虑到有些客户可能会有“三班倒”的工作时间,我在模拟工作人员的工作时间时,也把三班倒考虑进去了。以星期为单位,随机轮换上班时间,周末休息。
可惜,我没办法模拟节假日,不过这已经很不错了,远远超过了同事们最初的期待。
下一节,我将讲讲我是怎样模拟信号强度的。我认为它是整个模拟软件中最有意思的部分。
到目前为止,户外工作人员的行车路线模拟已经基本就绪,剩下的一个关键问题就是模拟无线广域网的信号强度了。一开始,公司里的同事们因为不懂GIS,对空间方面的事一窍不通,提不出像样的要求,所以我一开始也没往深了琢磨,只想着看起来像那么回事就行了。
在做这个模拟软件之前,我接触过一些实地采集的信号强度数据。我发现即使你站在原地不动,你所接收到的信号强度也在一定范围内波动。刚开始考虑这个模拟软件时,我曾想过用一定范围内的随机数模拟这个信号强度。可后来发现不合适,因为信号强度只是波动,不是跳动。一个人接收到的信号强度一般不太可能从-60一下子跳到-130。显然,这样使用随机数不行。
随后,我就开始琢磨如何模拟信号强度的波动。我想到这样一种办法:在初始状态时,给路径起点一个在正常范围内的随机的信号强度值,然后随着时间的推移,对每个坐标点上的信号强度值,以前一个坐标点上的信号强度为基准做随机改动,改动的幅度在-2到+2之间。这样一来,信号强度就会随着时间的推移显示出一条波动的曲线。
但是后来我又对自己提出来新的要求:能不能模拟一套发射塔的位置数据,然后根据发射塔到路径坐标点之间的距离来计算信号强度呢?显然是可以的。不过我得先模拟发射塔的位置数据,这却不容易。虽然我知道一般城里发射塔比较密集,郊外比较稀疏。但城里的密会密到什么程度,郊外的稀又会稀到什么程度?我对此却一点概念都没有。虽说是模拟数据,不需要多高的真实度,但发射塔的密度分布总要合理,大体符合实际情况才好。
到这时,格言的重要性开始显现:外事不决问孤狗!网上一搜,居然找到几个网站,上面有全美国的发射塔数据。花了两个小时的时间,总算把华盛顿州主要的发射塔位置整理出来了,一共有七百多座。听同事讲实际比这要多,但这对我已经够了,足以显示出城乡地区塔的分布特点了。
因为我要模拟的是一个有几千员工的大公司,员工们使用的网络服务分别来自几个不同的运营商,因此我需要把搜集来的七百多发射塔按不同的运营商分组。一开始我就把它们随机地分了三组,一组是AT&T,一组是Sprint,一组是Verizon。但我仔细一看发射塔的分组情况,发现效果不够好,因为这样随机分组虽然可以保证组与组之间发射塔数量不会相差很多,但因为这个随机分组没有考虑到它们的空间分布状况,所以有些紧挨在一起的塔却被分在了同一组,这显然不符合实际情况,因为运营商肯定不会把两座发射塔建在一起。
那么如何分组才能使各组之间数目相差不多,而又使同一组的发射塔不会挤在一起呢?
手工分组当然可以,但那就没意思了,公司给你开的工资不低,可不想看你干小工的活。咱要么不干,干就要干得有点层次,这才好去忽悠不是?
喝水去了。。。。。。
鲜花已经成功送出。
此次送花为【有效送花赞扬,涨乐善、声望】
这个系列很有意思。
我前几天怎么没有注意到呢?罪过罪过。
方向概率可以用截短高斯?与前进方向相同角度为0,相反角度180...
不过那个不重要 :)
其实模拟员工沿着路行动的话,美国普查局的数据比google map要好用。
我读书的时候干过类似的试验,一般是通过信号强度估算和各个基站之间的距离,然后算出设备的位置,再根据实际地形进行修正。躲到一面墙后面就歇菜了,因为算法以为你离墙后面的那个基站特别远。
不过还是有好的应用的,比如系里折腾机器人的那帮弟兄,手里有楼面的地图和wifi hotspot数据,就让他们的机器人在楼里根据这个走路。
摩尔定律在机器人身上也有应用。我刚入学的时候,系里小蜜告诫,说不要被机器人压到了。那个时候机器人跟汽油桶一样高;等快毕业的时候,就是同学求大家别踩了他的机器人了。
1。很多塔不属于任何手机公司,是第三方所有,再由手机公司来租用天线位置。所以一个塔上各公司天线都有的现象很普遍。
2。cell大小差别很大,几十米到几千米半径都有,发射功率差别也大了,不知道发射功率和传输环境(用来估算衰减系数),很难光从距离来判断接收信号强度的。
3。多数cell是sector cell,光知道距离,不知道方向角也不好计算。
不过反正是为测试而模拟,这样详细够忽悠了。也没必要太详细,或者说,详细也没用,反正离实际情况距离还是不小。
莫非猜的是I字号的?
其实一直有个问题想知道,基站的位置是保密的吗?
恩,而且,一个运营商没有信号的情况下,漫游到另一个运营商是很正常的,这个时候要如何算呢
在我弄到了这七百多基站的位置后,公司里同事们的兴趣也被挑起来了,有人就提出来新的要求:现在城里的基站所使用的技术类型一般比郊外的要高,比如GSM在城里是HSPA,而郊外可能只是EDGE,希望我能把它们区分出来。
这玩艺手工分不难,在地图上画个范围,然后用这个范围去套所有的基站,在范围内的用新技术,范围外的用老技术就行了。
可是,到这个时候,我已经有了如何将这七百多基站组织管理起来的办法了。解决这个问题也就成了顺手牵羊的事。
那么,这个对七百多基站,既能按技术分组,又能按运营商分组的办法到底是什么呢?
呵呵,它就是Delaunay Triangulation。它的另一种表示方法则叫Voronoi Diagram。
图里面虚线表示的是“地捞泥”,实线表示的就是“佛肉泥”。
具体它的特性我就不在这里罗嗦,大家可以摆渡,也可以放狗,再不行还可以围鸡。
有了这玩艺,就可以很快地从中找出距离当前位置最近的一个基站,从而提高计算信号强度的速度。其次,在这个三角网里,可以方便地计算出每个基站和周围基站的平均距离。显然,城里基站密,郊外基站稀,那么找出一个合适的距离,就可以将基站分成“城里组”和“郊外组”。
而将基站按照运营商分组,使其相邻基站分属不同的运营商,就变成了图论中著名的“四色定理”问题了,也就是只用四种颜色给三角网中的结点染色,就可以保证相邻的结点分属不同的颜色!
哈哈,这才是本软件最好玩的地方。
渴了。。。。。。