毕业设计思路篇(四)之生成车辆
路上没车,仿真主循环再完整也只是空转。
思路篇(三) 把 route.txt 读进 v_Route 之后,就要往路网里「撒车」了。入口就一行 generateVehicle(Map_Graph),内部干两件事:定本批要生成多少辆车;每辆车绑一条路线、一个起点道路,挂到对应 Road::m_queVehicle 队列尾部。后面 思路篇(五) 的 runSimulation 只认道路上的车,不会帮你补发车。
generateVehicle(Map_Graph);
1. 随机车辆总数
当时计划按随机数决定本回合生成几辆车,代码里先把 <random> 搭好了,但数量还没接上随机分布,笔记里自己标了待完善:
- 此处未随机,待完善
std::random_device rd;
std::mt19937 mt(rd());
random_device 播种、mt19937 当引擎,后面可以挂 uniform_int_distribution 控制车辆总数和路线下标。答辩前如果仍写死数量,记得和演示用的路网规模匹配——车太多单路 m_queVehicle 挤爆,太少又像没仿真。
2. 遍历车辆,为车辆设立起点和路线
对每辆待生成的车,从 v_Route 取一条路径副本,起点取路径第一个道路 id(队首),当前位移、时间戳先置 0,再推进该道路的等待队列。
a. 在道路向量中随机选一条路径
同样留了随机选的口子,调试阶段直接取下标 3 的路线:
- 此处未随机,待完善
auto route = v_Route[3];
route 是 queue<int> 的副本(或等价拷贝),后面构造 Vehicle 时会带走一份,不会改动 v_Route[3] 本身。正式版本应对 v_Route.size() 取模或按分布抽样,并跳过空队列。
b. 以该路径的首序列为起点
Vehicle 构造函数参数里:n_VehicleNum 是车辆编号;route 是剩余路径;0, 0 一般是初始距离和时间;route.front() 是当前所在道路 id。创建后直接 push_back 到 G.m_Road_v[route.front()].m_queVehicle,表示车出现在这条路的路网队列里,还没开始位移。
Vehicle car(n_VehicleNum, route, 0, 0, route.front());
G.m_Road_v[route.front()].m_queVehicle.push_back(car);
这里有个隐含前提:route.front() 必须是合法道路下标,且该路在图里确实存在——这又回到 思路篇(一) 构图和 番外篇 算路是否一致。我遇到过 route.txt 里第一条边和当前拥堵模型不匹配的情况,车能生成但第一步就卡灯,排查时要同时看路线和 思路篇(二) 的 roadID 映射。
发车逻辑到此为止。批量生成无非是外层再套一个循环,每辆车间隔若干时间戳可以在 Vehicle 里加字段,那是后话。下一步进 runSimulation,看车怎么动、怎么等红灯。
版权声明: 本文首发于 指尖魔法屋-毕业设计思路篇(四)之生成车辆(https://blog.thinkmoon.cn/post/140-graduation-design-notes-cplusplus/) 转载或引用必须申明原指尖魔法屋来源及源地址!