Smyshlёnye停止

今天我们有一个不寻常的机会与habrosoobschestvom分享我们的经验。这不是什么秘密,大部分是我们创建了一个现场“虚拟”世界中的项目和产品,我们不能总是被追溯到开始,我们所做的一切工作,在现实生活中的结束。

这个项目,这是我们想告诉你,我们有一个代码,并有点搞笑的名字“Smyshlёnye停止。”




那么,什么是 - 在城市的“H”的是建立一个跟踪系统基于传感器的GLONASS数据移动涌向中心调度服务在从这些相同的传感器报告源源不断形式的城市交通。我想放置在液晶面板上的停止,将显示时间和内容上的车辆运行路线到达。

这个想法听起来很简单,并实现这一切都没有 - 路线的时间表,路线本身,从他们的传感器和信息,站,车,发表在飞行中的坐标。此案为小 - 收集这一切在人堆里,开始工作。

这就是我们今天要告诉大家的协议与传感器通信,我们达到铁的智能站的装配和显示一个工作原型在展会TECHNOPROM 2014

让我们先从系统的基本架构,然后再在细节。



收集实时数据 H4>目前还没有单独的系统或运营数据的标准。在使用不同的格式和内容的分发数据的方法不同,不同供应商的不同城市。目前,我们面临着两个:通过TCP和REST API提供程序上的端数据的传输

包的一个例子,我们对TCP
<前>&LT;代码&GT; D·00287; 190614; 034452; 5628.0000; N; 8457.8226,E; 0; 272; 123; 12; gosnum:3:379,民:3:3巨魔&LT; /码&GT; < / PRE>
 包的REST API
的例子 <前>&LT;代码&GT; {&QUOT;网络&QUOT; :[{&QUOT; deviceHash&QUOT; :0558132541,&QUOT;名称&QUOT; :&QUOT;巴士H564VE96&QUOT;,&QUOT;时间戳&QUOT; :1384710565,&QUOT;纬度&QUOT; :50.65,&QUOT;经度&QUOT; :60.56,&QUOT;速度&QUOT; :43.5,&QUOT;当然&QUOT; :120.1,&QUOT; SATS&QUOT; 8,QUOT;路线&QUOT; :&QUOT; 021总线&QUOT; },...]}&中尉; /码&GT; PRE>
 格式和内容包:

  • 在设备ID
  • 的命名和标识TA - 。数TC和车辆类型
  • 上映时间的数据
  • 经纬度< /
  • 速度。
  • 当然。
  • 卫星的数量。
  • 该航线的ID沿该车辆。 ul>所有这些数据被用在预测算法。
    考虑两种选择接收数据。

    角色和职责listnera:
    • 获取从提供“原始”的数据。
    • 分析和处理数据的系统理解的格式。从行,或JSON的POJO。
    • 转发接收到的POJO数据JMS在预定的话题。
    • 故障转移。为了确定获得来自供应商或物理交通不便listnera数据问题,听者应该发送ping包JMS。
    • 保存POJO解析在一个单独的数据库之后。保存原始数据到一个漫长的一周。此机构由以能够累积的算法统计是最小的。在系统的使用寿命假定完成和裁缝的算法,并能够检查变化的算法中,我们存储数据。他们知道怎么打积累了更改后的算法的统计和评估。
       在TCP的情况下,我们指定的主机和端口,并将数据提供者发送数据包到该主机。然后,它出自于我们的监听TCP通道。

      我们作为TCP listnera Netty的一个基础。这是非常容易使用和运行稳定。在REST API的情况下,我们所使用的客户Jsoup,这民意测验API计时器。

      听者本身,与指定主机,端口和设置JMS和数据库的能力,一个控制台应用程序。

      工作listnera的过程:
      • 在获取数据与TCP或定时器时,REST API
      • 分析字符串或JSON的,创造一流NavigationPackage的对象的情况。
      • 发送NavigationPackage到JMS
      • 保存NavigationPackage数据库。
      • 发送ping包的JMS(对象类PingPackage)。

        其结果是每30秒,我们填补了我国关于车辆(以下简称TC)的实际动作信息数据库。

        什么,我们需要了解发生了什么与怎么回事? B>
        1。分段路线。
        2.协调站。
        B>

        我们把这些路线,并停止GIS系统的,对待它们以这样的方式,以获得分段路由

        好了,现在我们知道谁,是怎么回事,所以现在是时候开始构建的预测。但在此之前,办理了出院的数字扯远了。

        为了获得它是如何工作显示数字更好的手感:
      • 60海里的包我们从一分钟8无轨电车路线得到。
      • 10毫秒 B>是一站预测的建设。
      • 600毫秒 B>才能处理完毕,平均一个导航包。
      • 500段 B>,平均而言,同一条路线。
      • 5至20辆的平均途中托木斯克。
      • 168停止 B>在托木斯克8无轨电车路线李>
      • 159小时两个人 B> - 这是多少时间,这么多人,我们已经完全实现的算法
         当然,速度非常依赖于铁 - 所有上述数据是从测试虚拟机除去

        来吧,选择一个算法来实现它,并显示结果。

        如何选择算法。 H4>与任何其他时候,我们不推倒重来,努力实现,现有的算法最适合我们的。我铲了很多工作,不是俄罗斯,和俄罗斯的科学家。事实上办法预测并不是那么多,并且所有的算法 - 的两个或三个主要的修改。

        第一步选择了几种算法,似乎我们“更容易。”事实上,任何的基本算法有在的理解和执行相同的复杂性。所有差 - 其中可以考虑,而且可以省略特定的情况。

        我们的开始步骤是研究冉熙贞[1]。文学作品的完整列表,我们给在文章底部。

        所以,第一步,我们选择了在球队中的算法多篇文章和研究论文。船上每抽,实现了所有缺陷,并试图承担的工作,在文章中没有描述的一部分。是的,不是所有的都可以找到。在这种情况下,考虑所选择的算法预测,但并没有考虑如何收集统计信息传递,必须建立在预测的路线。

        第二步,我们有一个集思广益的会议中,试图告诉同事,并解释选择的算法。总体而言,本次活动参加了七人。根据研究结果,回答所有的问题,我们意识到,我们可以实现该算法在有限的时间。

        接下来的把戏。分析划分任务,考核和工作计划。顺便说一句,这种前期工作后,我们得做了很好的评价,更重要的是 - 我们错过了

        什么标准选择算法 H4>当选择一个算法试图找到的执行情况和算法结果的复杂性之间的平衡。其结果是,该算法是基于历史数据,稍微失去基于神经网络的预测准确性的算法,但它更容易实现。我们有一个要求,实现了预测为30的精度 - 60秒,这对于普通乘客完全可以接受

        开发一种处理服务器 H4>的项目做这些项目的侧面的技术部分小题外话的过程。

        在其中我们有一个非常重要的限制开始的条件下,我们必须得到一个工作原型到一定数量。它与展览TECHNOPROM在2014年我们在算法的项目开发和整个客户端的第一部分忍受工作计划的撰写与被连接。如果没有管理和其他必要的事情。
        一个好的项目,为客户,当他看到工作的进展情况,尽可能多。而在我们的情况下,我们的很大一部分时间是离开的算法及其磨合的实施。

        因此,我们决定做一个试验台,一条路线和一个停止。

        该试验台是 HTML + JS + WebSocket的。 B>

        在开发过程中,我们第一次出现在地图和路线上。随后而来的车辆(TC),并更新自己的状态。然后在路径上的车辆的位置。 - 段和通过的百分比。然后,公共汽车站的到达的定时。然后实际的预测和的最后一个步骤是算法柱状图,表示预测误差的发展。

        这种方法使我们能够为客户“现场”监督我们的工作过程。一切都非常透明的。


        进一步详细说明该处理的算法的技术部分。

        业务处理服务器 H4>最初的设计应该为每个城市一个独立的服务器。

        工作和处理服务器功能的过程:

      • 从JMS获取数据。
    • 定位车辆的路线和车辆的基础上,导航数据的状态。
  • 计算统计数据通路分段。
预测的到达而触发的连接停止计时器。 REST API。 的WebSocket API。 ul>要使用Spring的JMS JMS的工作。
对于WebSocket的 - 弹簧的WebSocket
对于REST API - 弹簧WEB

定位在车辆的路线上。


在汽车细分市场中收集的统计数据通道。


施工预测到达停止。


该算法 H4>的算法可以分为以下几部分:

在车辆定位到航线,并确定车辆的状态 统计通道路由段计算和计算路线 到达停止,预测误差的计算定义的传输段的实际时间< / 创建预测
确定的路径上的车辆的位置,并确定车辆的状态 H5>在导航数据的准备运行算法查找沿线车辆的位置。定位车辆包括路线的部分和它的通道的百分比的,并存储在随着车辆的数据库。

该算法的工作方式如下:
<醇>
获取关于从数据库途径和车辆的详细信息。如果车辆不存在,则创建 LI> 搜索线路段在从车辆的当前位置的预定距离。邻近 LI> 对于每一个段,计算车辆的运动和用于段的运动矢量之间的角度 - 使用操作的MongoDB进行搜索。如果这些角度的差异很小,如果不超过一定的误差,则认为所需的段发现 对于经过计算的百分比发现段。为,这是该车辆的段中的位置的凸起,并且百分比从段到投影的开始计算的。 LI> 一旦段在其上的车辆中,决定了的TC的状态。有四个初始状态,当然,前景尚不明朗。路线的初始和最终匹配的第一和最后一个分段。预报 - 意味着车辆的位置被确定。未知 - 如果没有找到段。所有国家都用于构建预测和统计信息。 OL>
的计算
统计计算通行路线段和途径段 H5>该算法的基础是一个统计的实际旅行时间的计算。

路线被分成段,且在操作期间,该系统收集的渡越时间为每个段的统计信息。每个段90具有一个统计值。

分割如下:
在冬季,夏季,淡季 平日和周末 从6:00开始至21:00每隔一小时
 该系统是独立的,可以作为统计数据的增加和预测精度提高。
统计积聚的问题减少到获得旅行时间路径段。这个时间被添加到一个合适的时间间隔,同时考虑到统计权重。变化统计成反比的测量速度。一方面,将尽量减少段的通道临时偏差,另考虑到长远道路上变化了的形势。

该段的实际时间 - 这是最后一次测量通道今天段。随着新的一天的到来,这些数据将被清除。

收集的统计数据 - 这是在文件中描述较差的一部分,这是我们所做的酌情部分

我们的任务 - 获取车辆段的流逝。白天车辆正在存储数据的接收的车辆上的情况的路径和时间上的每个位置。

车辆路线经过完全,即,导通该路线的终点段中的一个。当我们解决这个事实,我们将开始计数的路线的时间段的通道的过程。

审议了段和获取数据的频率,我们已经确定了四种情况:

现状1


情况2


局势3.


情况4


与多个点的车辆和每个时间点的位置,就可以计算出多少时间传递的全部或它的一部分的段。根据不同的情况,我们忽略某些点的车辆位置,例如,如果一个以上的段。

到达一个站和预测误差的计算的定义 H5>在确定的路径上的车辆的当前位置被计算为下一站和事实,即车辆到停止的到来。

我们已经实现了两个版本的算法到来。

果壳中的第一个选项 - 车辆停下来的时候,如果停药后是上段之前立即或马上。与此选项是不工作=),各种不同的站沿所述相邻段的长度,并且如果该段太短,导航数据根本不落入它们的事实。

果壳中的第二个选项 - 车辆停下来的时候,如果是从它一定的距离。有了完整的MongoDB和地理代码,我们有足够的空间来写的适当的问题。多边形的,其中该列表来选择基于接收导航数据,即频率的大小我们选择了填埋的尺寸以最小化其尺寸和因此增加的可能性,这将是该车辆。

在这两种情况下,我们仅考虑那些途径,它标识段上的车辆。

车辆到停止的到来显示在记分牌。

判断为车辆停下来的时候,我们期望从预测实时由MAPE的指数的偏差。关于它的更多细节可以在这里找到

创建预测 H5>随后而来的一天,当我们已经做除了最后所有的作品。其实,建立了预测。

该算法的摘要。
在入口处,我们有包括段的路线。对于每个段,我们知道的统计旅行时间和最后一次电流流通。 统计是根据日,周,一年的时间了一天的时间选择。 最后每个时间段的实际流量来减少错误统计数据。 ul>所以,我们有一组随着时间的推移段,我们必须停止在路线上,设置车辆的路线上。

第一步 - 以确定最近的路由,车辆停了下来,对他来说,我们将建立一个预测

要做到这一点,我们选择从数据库中,之后是为我们做预测停止的车辆。这考虑到车辆的状态如前所定义。
每个TC有途径,在其上位于路线的即段上的一个位置。
每个段具有在车辆的同时移动路线上的序列号。请从关税联盟,其中有较大部分的序列号名单,这将是最接近停了下来。

第二步骤 - 以获得一组的车辆和停止之间的段。正如我们已经知道车辆在该段,每个站“知道”哪些段毗邻。因此,我们有两个区段,并选择它们之间的列表。

第三步 - 算时间
。 我们总结了车辆和停止之间的段的当前静态和时间。从停止进一步的段,越重的统计时间,反之亦然,对于接近停止区段更多的重量在当前段的通路的时间。

次此量在预测当车辆停下来。

作为一个结果 - 我们有一种算法基于历史和实时数据的基础[2],并在其实施略微修改,以提高预测的准确性和这里是:


现在,我们有我们自己的小控制室!随着裸体女人和施工现场=)。

管理的记分牌 H4>我们设想的系统在不同的城市站的网络,庞大而复杂的解决方案。这样的系统不能没有管理和控制工作。



















 



















资料来源:<一href="http://habrahabr.ru/company/eastbanctech/blog/227165/">habrahabr.ru/company/eastbanctech/blog/227165/