# metaFlow **Repository Path**: metacrowd/metaFlow ## Basic Information - **Project Name**: metaFlow - **Description**: 交通仿真模拟器 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 1 - **Created**: 2022-06-01 - **Last Updated**: 2025-02-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # metaFlow_Server ## 一、运行所需内容获取 ``` git clone https://gitee.com/metacrowd/metaFlow.git ``` 于 example 文件夹内处获取 server 与 client 文件夹 **或** 由 发行版处获取 server.zip 与 client.zip ## 二、配置 1.配置 Java 环境,输入 java -version 后显示 Java 版本即为配置成功 2.pip install thrift==0.16.0 引入 thrift 依赖库 3.将 server 与 client 文件夹需调用它的项目的主文件夹内 ## 三、使用 基础调用可参考 example/runTest.py **使用流程:** 训练前需运行服务器端程序: ``` java -jar server/metaFlow_Server-0.1.0.jar 8080 # 8080 端口号可修改,但需同步修改 client/metaFlow.py 内 port 的值 ``` 终端输出 *metaFlow Server Running* 后运行训练程序即可。 针对大型路网可添加 -Xss、-Xms 参数提高运行效率,例: ``` java -Xss40m -Xms4g -jar server/metaFlow_Server-x.x.x.jar 8080 ``` engine 初始化: ``` python import client.metaFlow as engine ...... eng = engine.Engine("/your/path/to/configFile/", thread_num) ``` 使用结束后关闭:ctrl+c 如采用后台运行,则: ``` jps # 查看服务器程序对应进程号 kill 进程号 ``` ## 四、迁移 metaFlow 采用与 cityFlow 同类型输入文件格式,兼容 cityFlow 各类 API,修改调用 env 类型后即可完成迁移。迁移例见 example/anon_env.py ## 五、配置文件 configFile 格式 ``` { "interval": 1, // 每 step 的时间间隔 "seed": 42, // 随机数种子 "dir": "src/test/resources/manhattan/", // roadnetFile 与 flowFile 所在文件夹相对地址 "roadnetFile": "manhattan.json", // roadnet 文件名 "flowFile": "manhattan_31217.json", // flow 文件名 "rlTrafficLight": false, // 是否开启强化学习接口 "laneChange": true, // 是否开启变道 "saveReplay": true, // 是否保存 "roadnetLogFile": "replay_manhattan.json", // 保存的 roadnet 文件名,用于可视化 "replayLogFile": "replay_manhattan_31217_LaneChange.txt" // 保存的 log 文件名, 用于可视化 "vehicleRecord": false, // 可选,开启部分 API,详见 example/metaFlow.py "allowPassingCross": false // 可选,开启后车辆在路口中被阻拦时允许满足穿过 } ``` ## 六、API *注:可于 client/metaFlow.py 内查看* **初始化 engine:** ``` python import client.metaFlow as engine ...... eng = engine.Engine("/your/path/to/configFile/", thread_num) ``` **Engine 相关 API** 模拟推进一步 ``` next_step() ``` 结束模拟 ``` close_engine() ``` 获取当前的模拟时间,返回 double ``` get_current_time() ``` 获取当前 engine 信息,返回 string ``` get_engine_log() 返回 string 格式如下: -------------------------------------------------------------------- now step: 3600, interval: 1.0 thread number: 8 active vehicle cnt: [63, 16, 16, 64, 49, 0, 0, 50] active path cnt: [14, 2, 2, 14, 12, 0, 0, 12] Intersection: 12, Road: 24, Lane: 144 now vehicle: 711, active percentage: 36.29% finished vehicle: 6103, laneChange Vehicle:0 average travel time: 339.67 s -------------------------------------------------------------------- ``` 重置模拟状态 ``` reset() ``` 修改随机数和种子,seed: int ``` set_rnd_seed(seed) ``` **路网相关 API** 获取路网内正在行驶的车辆数,返回 int ``` get_vehicles_count() ``` 获取完成已完成设定路程的车辆数,返回 int ``` get_finished_vehicles_count() ``` 获取完成已完成设定路程的车辆数,返回 int ``` get_finished_vehicles_count() ``` 获取完成路程的车辆的平均通行时间,返回 double ``` get_average_travel_time() ``` 获取当前 step 新进入路网的车辆 id, 返回 list<string>,需 config 文件内设置 "vehicleRecord: true" ``` get_new_enter_vehicles_id ``` 获取当前 step 完成 route 的车辆 id, 返回 list<string>,需 config 文件内设置 "vehicleRecord: true" ``` get_new_finished_vehicles_id() ``` 获取每条车道上的车辆数, 返回 list<string, int> ``` get_lane_vehicles_count() ``` 获取每条 Lane 上的处于等待状态的车辆数, 返回 list<string, int> ``` get_lane_stop_vehicles_count() ``` 获取每个路口中的车辆数, 返回 list<string, int> ``` get_intersection_vehicles_count() ``` 获取每条车道上车辆的 id, 返回 list<string, list<string>> ``` get_lane_vehicles_id() ``` 获取所有车辆距所在车道起点的距离, 返回 list<string, double> ``` get_vehicles_relative_distance() ``` 获取指定道路间上个绿灯平均每秒通过的车辆数,返回 double ``` get_roadLink_passCar_perSecond(id) ``` 将对应路口的信号灯状态调整为 phase_id 对应的状态,需 config 文件内设置 "rlTrafficLight: true" ``` set_traffic_light_phase(inter_name, current_phase_index) ``` 增添指定车道间的连通 ``` add_laneLink(intersectionId, startRoadId, index1, endRoadId, index2) ``` 删除指定车道间的连通 ``` del_laneLink(intersectionId, startRoadId, index1, endRoadId, index2) ``` 设定指定道路是否可通行,canGo: bool ``` set_road_canGo(roadId, canGo) ``` 设定指定车道是否可通行 ``` et_lane_canGo(roadId, index, canGo) ``` 获取道路长度,返回 double ``` get_road_length(roadId) ``` 获取道路历史通行数据,返回 map<string, list<double>>:车辆在 list[0] 进入道路,在 list[1]离开,需 config 文件内设置 "vehicleRecord: true" ``` get_road_record(roadId) ``` **车辆相关 API** 获取指定车辆信息,返回 map<string, string> ``` get_vehicle_info(vehicleId) 格式如下: { leader=flow_4_0, usualNegAcc=4.5, offSet=0.0, maxPosAcc=2.0, length=5.0, maxSpeed=16.67, generateTime=4.0, maxNegAcc=4.5, relativeDistance=39.87894188108467, isChanging=false, laneChangeType=Discretionary, leaderGap=25.00499913454057, width=2.0, curPath=road_1_2_1_3, curSpeed=16.669999423027043, usualPosAcc=2.0, routeList=[road_1_0_1, road_1_2_1], routeType=LENGTH, minGap=2.5, headwayTime=1.5, enterRoadNetworkTime=4.0, nowDir=0 } ``` 将指定格式车辆插入路网 ``` push_vehicle(vehicleId, basicInfo, routeList) 格式如下: vehicle:string basicInfo: map<string, double>: 含 length、width、maxPosAcc、maxNegAcc、usualPosAcc、usualNegAcc minGap、maxSpeed、headwayTime、turnSpeed、yieldDistance routeList: list<string> ``` 设置对应车辆路程, anchorId: list<string> ``` change_vehicle_routeList(vehicleId, anchorId) ``` **其他 API** 设置是否记录车辆轨迹,需 config 文件内设置 "saveReplay: true" ``` set_save_replay(open) ``` 修改车辆轨迹存储文件,需 config 文件内设置 "saveReplay: true" ``` set_replay_file(replay_file) ``` **源码运行**: 1.配置 Java 与 gradle 2.导入 IDEA 后 src/test/java/ 文件内均可运行