西西河

主题:【原创】最近为公司开发了一个小软件,挺好玩的 -- 温雅颂

共:💬67 🌺136
分页树展主题 · 全看首页 上页
/ 5
下页 末页
      • 家园 发现一篇好文

        恭喜:你意外获得【通宝】一枚

        鲜花已经成功送出。

        此次送花为【有效送花赞扬,涨乐善、声望】

        这个系列很有意思。

        我前几天怎么没有注意到呢?罪过罪过。

    • 家园 【续三】

      因为我需要模拟一个有几千员工的公司一年时间内户外工作人员的行车路线数据。这时我就遇到这样一个选择:假如把一个员工一天的行车路线看作一个单元,我要模拟的实际是一个M*N的二维数组,其中M为一年中的工作日,N为员工数。整个模拟过程无非是一个个生成这个二维数组中的每个单元而已。但是,我究竟是先M后N好呢,还是先N后M好?换句话说,我是先把每个员工第一天的数据模拟出来,再模拟每个员工第二天的数据好呢(员工为内循环,工作日为外循环)?还是先模拟出一个员工一年的数据,再模拟第二个员工一年的数据(工作日为内循环,员工为外循环)?

      以员工为内循环的好处是,我可以在某个时间段内模拟一些意外情况,这样所有员工的网络状况在那一天都可能受到这个意外情况的影响。而以工作日为内循环的好处是,这个模拟软件可以很方便地在多个计算机上运行,同时产生模拟数据。多台计算机同时运行同样的模拟软件,一个主要问题就是所模拟的用户名称必须是单一的,绝对不会和其它计算机的模拟软件产生相同的用户名。

      因为我们需要尽快产生足够数量的模拟数据,使用多台计算机同时生成模拟数据的可能性很大,所以我就选择了以工作日为内循环的方式,每台计算机模拟产生的用户名则是该计算机的登录者ID,加上计算机名称,和一个四位数的序列号。这样一来,即使同一个人在多台计算机上登录并运行这个模拟软件,因为计算机名称不可能相同,所产生的用户名也必然不同。当然,还有一个要做的是防止有人在同一台计算机上同时运行多个模拟软件,这就需要把它做成single instance的软件。这样就保证了所模拟出来的用户名的唯一性。

      这样一来,这个模拟软件的用户界面就会非常简单,不需要任何特殊的设置和选择,直接运行就可以了。要是公司里几十上百人运行它,所模拟出的用户名就会有很多的变化,然而又有一定的规律性,便于测试系统对用户名的检索功能。

      下一个要解决的就是单个员工单个工作日的行车路线模拟。这一步没什么技术性,但因为要使模拟数据逼真,我还是花了点心思在上面。

      首先我在地图上画了三个嵌套的范围,最内圈是城区,中间圈近郊,最外圈是远郊。然后把员工分成三拨,一拨(60%)负责城区,一拨(30%)负责近郊,一拨(10%)负责远郊。

      在模拟员工路线时,每个员工上班后,我先给他半小时以内的一个随机数,用来喝咖啡和做准备。因此每个员工并不是一上班就出发,而是有先有后,显得比较自然一些。

      出发的第一个目的地是一个随机的经纬度,但是要在他所负责的范围内。他从公司总部出发去第一个目的地,这就形成了第一条路径。这时我需要记下这第一条路径所需要的时间,作为他返回公司总部所需时间的参考。

      到了目的地后,我再给他半小时以内的一个随机数,作为他在那里工作的时间,比如对于一个电力部门的用户来说,这可能就是他在某家修理电路故障。干完活以后,就从这里出发去下一个目的地。

      后面若干目的地的选择,将在一个以第一目的地为圆心,以到总部的距离的一半为半径的范围内随机选取经纬度。这样看起来也比较自然,否则他有可能东南西北到处跑,并且一天内几次经过公司总部,那就显得不够真实了。

      在他每到一个目的地时,模拟软件都要记录下他离下班时间还有多长时间。如果离下班时间已经小于他返回总部所需要的时间,他下一个目的地就是当天的最后一个目的地,也就是返回公司总部。显然,如果他倒数第二个目的地如果离公司很近,他可能早下班。如果很远,他可能晚下班。平均起来公平合理。

      考虑到有些客户可能会有“三班倒”的工作时间,我在模拟工作人员的工作时间时,也把三班倒考虑进去了。以星期为单位,随机轮换上班时间,周末休息。

      可惜,我没办法模拟节假日,不过这已经很不错了,远远超过了同事们最初的期待。

      下一节,我将讲讲我是怎样模拟信号强度的。我认为它是整个模拟软件中最有意思的部分。

    • 家园 【续二】

      要想模拟户外工作人员的路线信息,人们最容易想到的就是孤狗地图。如果能把孤狗地图找路的信息抓下来,这不就是现成的路线信息吗?问题是?能不能抓?怎么抓?

      首先,这个模拟软件不能依赖人机交互的操作,必须能自动生成路线信息,而孤狗地图找路的功能需要输入起点和终点的地址,这显然不行。需要能自动生成孤狗地图认可的起点和终点的地址才行。

      其次,孤狗地图找到路以后,必须要能得到路径的所有坐标点。

      第三,软件必须能知道孤狗地图是否找到了路径,以便决定是提取坐标点,还是让孤狗地图重新找路。

      如果以上三条都能满足,那就可以用孤狗地图找路的功能模拟户外工作人员的路线信息了。

      这里需要澄清一下:孤狗地图的API是公开的,任何人都可以用,而且免费。但孤狗有个条件,使用了孤狗地图API的网站,必须是公众可以访问到的网站,内部网不能免费使用孤狗地图API。如要使用,须与孤狗接洽,使用孤狗地图API的premium版本。

      玩过孤狗地图的人大概都知道,微软也推出了一个类似于孤狗地图的玩艺,叫“虚拟地球”。虚拟地球也有它的API,也是任何人都可以使用。但如果用于商业目的,则需要与微软接洽,微软要收费。

      孤狗地图API的网址是:http://code.google.com/apis/maps/index.html

      微软虚拟地球API的网址是:http://dev.live.com/virtualearth/sdk/

      研究了一下两边的API,发现两边的找路功能大同小异,比较棒的是:两边都接受经纬度作为起点和终点。这对我非常重要,解决了我的第一个问题。因为我的模拟软件无法自动生成真实地址,但可以很方便地随机生成经纬度。只要起始终止两个经纬度附近有道路,路径就可以生成。第三个问题也好办,两边都会在路径生成的时候(或出错的时候)raise一个event,使用户在event handler处加入自己的处理过程。而第二个问题,如何抓取路径坐标点上,微软的这一功能不对外公开。只有从微软得到许可的用户才能使用此功能。而孤狗地图的这一功能是公开的。正是这一点区别,使我选择了孤狗。

      从孤狗地图上抓下来的路径,除了路径中途所有坐标点外,还有总的路径长度,和总的时间。这样,我就可以根据路径的总长度和总时间,按照我需要的时间间隔内插所有的坐标点。比如在一条笔直的大街上生成了一条路径,这个路径可能只有起点和终点两个坐标点,时间也许是五分钟。如果我以五秒为间隔模拟途中所有坐标点,我就可以内插出59个坐标点。当然,这些点都在同一条直线上。

      内插这么多点的目的是要模拟网络变化的详细记录。所以尽管这些点在空间上处于同一直线,但它们的信号强度等网络状况可能发生了很多变化,因此项目决定的采样密度比较高。

      确定了路径生成的方式方法,接下来就是研究如何模拟工作人员在户外的活动规律,使模拟出的路线尽可能像一个人在外面的工作路线,而不是一堆杂乱无章的路径堆砌。

      喝茶ing......

      • 家园 乱弹123

        1.方案无法模拟野外路线, 即没有道路的不成。

        2.出了直线插值难道没有别的算法?

        3.不用和GOOGLE打招呼也可以将GOOGLE MAP用在内部网。最简单的办法之一,改造你的浏览器。

        • 家园 回乱弹

          1.方案无法模拟野外路线, 即没有道路的不成。

          我们的客户中没有off road的要求,所以我们也不需要去模拟了。

          2.出了直线插值难道没有别的算法?

          线性内插的缺点是假设工作人员在整个路线上行进的速度是匀速的。这当然不符合实际情况,但似乎也没有更好的办法了。因为从孤狗地图上得不到更详细的速度信息了,在速度模拟上硬加一个随机变量也没有多大意义。

          3.不用和GOOGLE打招呼也可以将GOOGLE MAP用在内部网。最简单的办法之一,改造你的浏览器。

          不跟孤狗打招呼也可以使用孤狗地图API,只是每次孤狗都要弹出一个message,提醒你所用的孤狗地图API的KEY已经在别的地方用了,要求你去另外申请一个Key而已。这对于个人来说,不过是有一点麻烦,但对一个公司来说,这等于是违反了孤狗的term of use,公司就比较有顾虑。

    • 家园 需求有点像google map的手机版的,

      ,中国移动提供定位服务,定位数据误差相比GPS要大。

      我去年在杭州西湖玩的时候,看一下手机上Goole map的时候,居然定位在湖的中央。

      • 家园 三角定位自然比GPS差多了

        我读书的时候干过类似的试验,一般是通过信号强度估算和各个基站之间的距离,然后算出设备的位置,再根据实际地形进行修正。躲到一面墙后面就歇菜了,因为算法以为你离墙后面的那个基站特别远。

        不过还是有好的应用的,比如系里折腾机器人的那帮弟兄,手里有楼面的地图和wifi hotspot数据,就让他们的机器人在楼里根据这个走路。

        摩尔定律在机器人身上也有应用。我刚入学的时候,系里小蜜告诫,说不要被机器人压到了。那个时候机器人跟汽油桶一样高;等快毕业的时候,就是同学求大家别踩了他的机器人了。

      • 家园 哇,那兄台身边有没有白衣女偕青衣女

        一段浪漫的邂逅就此发生,急展开恋爱模式开启……

    • 家园 【续一】

      楼下太守说得对,我在一开始的需求介绍里说得不够详细,导致许多河友的注意力偏了。我在这里再重申一下:

      这个模拟软件要做的事是自动产生海量无线广域网使用者在户外工作的位置信息和网络信息。之所以强调海量,就是想说明测试重点不在数据采集端,而在数据库端和应用端。因为采集端的测试,有多少种意外情况一般都可以列出来,那模拟这些情况其实很容易,比如v22列出的四种状况。而doom所说的GPS数据异常等情况,那其实是无线网卡的问题,不是我们的业务范围。

      我在开始时提到要模拟几千人一年的户外工作路线数据,一个是要测试数据库的检索效率,一个是要测试分析应用端根据这样的数据产生的结果是否能给客户提供有用的信息。比如,某个雇员反应在某个时间段内联不上网,系统根据他的工作路线进行分析,发现他当时所处的地区信号太弱,联不上网并不奇怪。而如果那个地区平时信号都不错,只是他一个例外,那问题就可能出在他自己的什么地方。如果最近好几个人在那个地区都有联不上网的现象,而以前没有。那也有可能是发射塔本身出了问题,就要向服务商反映。

      因此,所模拟的户外工作路线数据需要尽可能地接近实际。否则只能做数据库的测试,而无法做应用分析的测试。

      最一开始,公司只是想到要有海量数据对数据库进行测试,而没想到测试应用的部分。当然了,应用部分也并不非要一整年的数据来测试,能有若干人、几天的路线数据也能凑合,只是效果要差一些,有些效果难以测试出来。

      因为大部分人只想着测试数据库,所以有人出了个主意,在一定的经纬度范围内,随机产生一对经纬度,表示地面的一个点,再随机产生一个信号强度值,作为该点的无线网卡所收到的信号强度。服务商和网络技术类型也都按此方式随机产生。

      这个想法提出来以后,我就表示了异议。我的理由有两条:第一,客户雇员的户外工作是线型的,所采集的地理位置是一串按时间顺序排列、相隔不会太远的点,而不是随机产生的离散点。从这样的离散点里,无法模拟出工作人员的路线,因此无法做联网故障分析。第二,因为每个点的信号强度都是随机产生的,那么地面任意一个小区域(比如一百平方米范围)内所有模拟点信号强度的平均值都将会很接近随机范围内的中值。如果用这样的数据做一张信号强度分布地图,用不同颜色表示不同的信号强度,那图面上只会有一种颜色,看不出信号强度在空间的变化趋势。

      我把意见一提,同事们就沉默了,因为这不是他们的专长,因此都没想到这一层。不过他们也很聪明,既然是我提出的反对意见,那就干脆顺水推舟,把这活交给我了。

      喝水。。。(这次喝的时间长点,下星期一再更新)

      • 家园 还是可以用随机点

        既然用户的移动是线性的,那么就需要限制下一个随机点的位置和当前点之间的距离。比如说用户是步行的,那么一分钟后他的位置就只能在一个半径100米的圆内;如果是骑自行车,那么这个圆的半径可能就是500米了。

        在移动的方向上也可以设置随机性。定义当前前进方向为从上一个随机点到当前随机点的矢量,那么与当前前进方向相反的方向的概率最小,与当前前进方向相同的方向的概率最大,其余方向的概率在这个区间内按比例变化。

      • 家园 呵呵

        可不可以调用google地图的api,

        给模拟几个路线图。

分页树展主题 · 全看首页 上页
/ 5
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河