西西河

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

共:💬67 🌺136
全看分页树展 · 主题 跟帖
家园 【续三】

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

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

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

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

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

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

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

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

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

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

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

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

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

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

全看分页树展 · 主题 跟帖


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

Copyright © cchere 西西河