时间:2024-05-04
李文韬,谢小红,孙晓燕
(1.南宁师范大学计算机与信息工程学院,南宁 530299;2.广西财经学院管理科学与工程学院,南宁 530003)
随着5G 时代到来和自动化水平的提高,无人驾驶汽车得到了越来越多的关注。研究人员认为无人驾驶汽车的使用是解决交通拥堵的关键[1]。但是,无人驾驶汽车上路后,交通路网的特性是否有显著变化?整个路网的交通流量是否会提高?这些问题尚不十分明确,虽然目前已有大量的理论模型讨论无人驾驶汽车对交通路网的影响[2],但是仅有少数的数据支持[3]。因为目前无人驾驶汽车还处于实验阶段,采集实际的数据是不现实的,但是可以采用实验室实验的方法[4]分析无人驾驶汽车上路后的交通路网特性的改变,为今后出台更合理的含无人驾驶汽车的交通管理政策提供有力的科学依据。
交通出行选择行为的实验室实验经常用于验证交通流经典理论和悖论[5],评估尚未实施的交通管理政策[6]。开展实验前,构建稳定高效的实验平台是必不可少的先决条件。目前已有一些经典的选择行为实验平台,例如z-Tree[7],其最大的功能是能够提供一个免费的开放式实验平台,在实验过程中数据会自动备份即使主机崩溃,重新连接服务器即可继续实验,该实验平台允许内嵌其他编程语言,开发者可以根据需求进行二次开发。但是,对于比较复杂的实验场景,开发者需要耗费大量的时间对z-Tree 功能模块进行修改且移植性不强,因此许多科研人员开始借鉴z-Tree 的功能开发合适自己实验的平台软件。
本文采用 Web 应用框架[8]中的 Django[9]、MySQL 数据库[10]技术、Nginx 反向代理服务器[11]以及 AJAX 交互技术[12]加上多并发和多线程对前端数据的处理构建了含无人驾驶汽车的交通出行选择行为实验平台。使用Django 框架无需独立SQL 语句,框架本身提供完善ORM 数据交互模型,任何计算机都可以安装此实验平台作为实验服务器。该实验平台主要特点是安全系数高、数据高并发处理、交互友好且易于二次开发,有助于研究者便捷使用并对无人驾驶汽车的交通出行选择行为做进一步的研究。
系统架构如图1 所示,实验被试者通过管理员提供的用户名及密码在浏览器上登录实验界面。实验过程中每一轮实验被试者提交出行行为选择后页面会向服务器发送AJAX 请求,后台通过处理并反馈给被试者上一轮数据。由于多名被试者同时进行,已完成出行行为选择的被试者需等待尚未提交选择的被试者才可进行下一轮的选择,实验数据需以队列形式交由服务器处理,并接收所有被试者处理和请求,计算数据信息反馈给被试者,使其进行下一轮的实验。因此,为了充分利用服务器应用的计算机上所有资源,在服务器部的署上应采用多线程并发服务器,从而提高执行效率和降低资源占用,使服务器性能得到提高。本文主要借鉴了z-Tree 的优点并补足缺点,实现Web 端的无人驾驶汽车的交通出行选择行为实验平台的设计,主要功能是采集科学实验数据为今后构建数学模型提供有利的科学依据。
图1 系统架构图
管理员界面设计使用EasyUI+Jquery,主要是管理前台数据与后台数据库的交互。界面可以在实验开始前设置参数和被试者人数,并监控整个实验过程,且每3 秒通过AJAX 请求对后台人员信息、完成轮数和提交情况更新至前端。管理员界面的实验状态框中有实验进度总览、登录情况列表、提交情况列表三个选项卡,分别可以查看实验的进度情况,其中登录情况列表选项卡和提交情况列表选项卡可以更为详细地看到人员信息。实验结束后,实验研究者在实验数据栏中的数据导出将本次实验的数据以Excel 形式或文本形式导出。
被试者界面主要是根据研究者的需求对实验参数等进行设置包括出行时间及自动驾驶车辆选择行为等的交通实验,被试者通过用户界面可以接受不同的交通实验。同时,研究者也可以对被试者界面灵活修改选择内容和反馈信息,例如每个被试者上一轮选择、出行时间以及得分(报酬);或者显示所有被试者的选择结果等信息。
后台框架基于Django,使用MTV 架构进行平台搭建,为保证数据安全传输,使用JSON 数据格式对实验数据进行传输,首先通过Nginx 定位服务器集群,然后根据Uwsgi 进行地址转发,Django 对收到请求进行Urls 匹配找到对应视图函数,视图函数调用无人驾驶出行选择算法,待数据进行处理后放入MySQL 数据库。算法执行完毕后,视图会返回模板信息和计算结果一并反馈到被试者界面使其查看相关信息,被试者再根据反馈的信息进行下一轮实验选择。实验流程图如图2 所示。
图2 实验流程图
Web 应用框架(Web Application Framework)是一种支持多语言相结合的开发框架,常用来支持网络应用程序、动静态网站及网络服务等的开发。实验平台之所以采用Web 框架是是为了打破传统的面对面的数据收集,更为方便实验研究者和被试者。本文采用的Django 框架是由Python 语言编写而成,其采用了MTV 架构模式,即模型M、模板T 以及视图V,该模式既可以降低应用系统各部分之间的耦合程度,也有利于各开发人员的分工合作,增强应用系统的可维护性及可扩展性。MTV 结构如图3 所示。
其中模型Model:主要负责业务对象和数据库对象,处理与数据相关的所有事务,包括如何存取以及如何验证有效。Model 是数据库中的唯一标识以及最权威的信息源,并包括实验中所有需要储存的数据字段。为了创建模型,Djang 会根据Model 在数据库中创建相对应表,通常每个Model 与数据库中的表示一一对应的,再通过python manage.py makemigrations 和py⁃thon manage.py migrate 两个语句进行数据迁移,这就实现了不需要SQL 语言就可以创建数据库的ORM 操作。模版Template:主要负责把实验页面呈现给被试者,模板的设计方式实现MVT 中VT 的解耦,VT 有着N:M 的关系,一个V 可以调用任意T,一个T 可以供任意V 使用,使用Template 方法可以动态地生成HTML并包含所需HTML 输出的动静态部分内容插入的模板特殊语法。视图View:主要负责业务逻辑,View 往往可以看作是Model 和Template 之间的桥梁,在需要的时候调用适当Model 和Template 的相关逻辑,用于封装请求和响应的逻辑,从数据库中将数据处理后反馈给前端,也会将用户的实验数据写到数据库中。
图3 MTV框架结构图
此外,Django 还有一个urls 路由分发器,其作用是将每一个被试者的页面请求分发给各个不同的View处理,View 再根据需求调用对应的Model 和Template呈现给被试者。
AJAX 是一种用于快速创建动态交互网站的异步技术。其技术可以使页面动态完成异步更新,页面效果比较友好不会出现卡顿现象,换而言之就是在不刷新页面情况下,通过后台与服务器进行少量的数据传输,从而实现对网页的部分数据异步更新。
在本文中采用AJAX 技术主要是为了在不刷新整个页面的同时动态获取实验被试者登录情况、提交情况以及被试者的实验界面能够有良好的交互环境。当所有的被试者在每一个轮中都提交本轮的出行行为选择后,通过AJAX 的异步技术向后台传输数据,后台计算完本轮的所有数据并存入数据库后才会将上一轮的反馈信息呈现给用户并进行下一轮的出行行为选择。平台交互如图4 所示。
图4 平台交互图
在交互的过程中由于数据传输格式不同,JSON 数据格式在编码难度、解码难度、运行速度、数据体积、描述性等方面优于XML 数据格式,因此选用JSON 格式作为实验应用平台与被试者客户端的数据传输格式比较合适。
Nginx 是异步框架的网页服务器,其功能丰富可作为HTTP 服务器和反向代理服务器,负责接被请求,主要特点是并发能力强、内存占用少和处理异步请求等优点,支持高达50000 并发连续响应。在服务器硬件配置同等,并发处理需求较高的情况下,与Apache 相比,Nginx 是本实验服务器的最佳选择。
uWSGI 是一种Python 通讯协议,也是对开发人员比较友好的服务器,其主要特点是超快的性能、低内存占用、可多App 管理,与Nginx 搭配使用,其遵循网络层传输协议并对网络端口进行以及收发HTTP 协议数据。通讯过程是客户端发送的HTTP 请求被Nginx 服务器接收后将请求转发给uWSGI,然后uWSGI 再将请求转发给实现uWSGI 协议的应用程序,即Django。本文使用Nginx+uWSGI 处理高并发,可以大大地扩展实验被试者的人数,缓解服务器的承载问题。
在本实验平台我们将采用多并发处理,主要是因为在多个被试者同时发出请求时,会出现资源竞争问题,那么为了解决该问题,平台使用到了多并发处理,其处理时具有各个进程间相互独立的特点,多进程也可以充分利用CPU 多核服务对多数据进行处理,这符合被试者之间数据不相通、多并发处理的需求。进程的主要优点是占用资源少、速度快,各进程排队进行处理,有效地避免了资源竞争问题。多并发处理流程如图5 所示。
图5 多并发处理流程图
进程池可一次性开辟多个,被试者的请求按先后顺序进入队列中排队等待处理,由于最优处理数量与硬件相关,所以研究者尽可能使用配置较高的计算机。在并发处理进程时,当一个被试者的请求处理完成后程序会把相应数据存入MySQL 数据库内,同时释放资源等待处理下一个被试者的数据。
由于在实验的进行过程中,被试者提交请求的顺序是乱序,所以平台采用多线程处理。而线程在程序中是独立的、并发的执行流,与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。其主要特点是进程之间是不可以共享内存的,但线程之间共享内存却非常容易;在操作系统创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多;实现多任务处理的线程之间资源共享与Python 多线程利用CPU 进行数据处理,多线程处理I/O 流较为密集的任务时效率颇高。因此,使用多线程来实现多任务并发执行比使用多进程的效率要高。Python 语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式。而被试者请求会队列中进行排队,各个线程的任务都将源源不断地从等待处理队列中提取请求并进行数据处理,再将处理的结果逐个存放到已完成队列中,最后从该队列提取数据一并存入MySQL 数据库中。这样既提升了实验整体速率,被试者的等待时间也可以减少,多线程模型如图6 所示。
本文采用Django 和Nginx 框架构建了含无人驾驶汽车的交通出行选择行为实验平台,此平台具有耦合性低、可扩展性强等优点,为实验研究者提供友好的管理环境,也易于二次开发。经过测验,未发生异常,表明平台鲁棒性较好,为后续开展实验提供先决条件。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!