前言
以前一份代码的阅读,2019华为软挑
三、数据读入后怎么跑呢?
思路:
1、创建地图类,将地图中每个路口到其他路口最短路径保存。
2、将所有车,路口,路对象指针封装进地图类。
3、使用FLOYD将所有车辆行驶路径确定下来,跑不就出结果了么…
有那么简单就好了。实验中所有车辆一起出发,立即造成交通堵塞。
咋办?说白了,交通规则怎么能不遵守呢…
1、编写交通规则算法。(交通规则逻辑太难了,我们一辆一辆跑,第一辆到终点开始第二量,依次跑完,这样不会造成堵塞吧。排在第N名,看样子这样不行)
2、老老实实写规则吧。(做到现在居然才过了1周)
3、画程序执行(交通规则)逻辑图。
代码如下(示例):
code的思路:
//模拟交通规则
bool DynamicMap::TrafficRules()
{
int dex = systemRunningTimes;
while (!allCarsFinished)
{ //一个时间片更改一次路径
//---第一步,遍历每个节点上的道路的车辆状态---
std::vector<Cross>::iterator cross_iter = m_cross_list.begin();
for (; cross_iter != m_cross_list.end(); cross_iter++)
{
}
//----第二步:处理路口上和道路上所有处于等待状态的车辆---
int lastWaitingCarsNumber = -1;
//记录被锁了多少次
int unLockedCount = 0;
//只有当所有的节点车都不处于等待状态,才进行下一步
std::vector<int> allWaitingCrossIndex = GetWaitingCrossIndex();
while (!allWaitingCrossIndex.empty())
{
//遍历所有处于等待的路口
//更新allWaitingCross
//判断死锁
//解死锁
}
if (UnLock_Falied == true)
return false;
//驱使车库里边的车出来,理论先按出发时间升序调度,再按照路口id升序调度,最后按照车辆id升序调度h
//1、检查路上一共有多少辆车在跑
//2、路上的车小于Setting_MAX_Car_MUN辆就继续发,发到Setting_MAX_Car_MUN辆车
//通过路上和车库车数总和,判断是否所有车都到了终点
if (sumRunnningCars == 0)
{
int carsNumberInGarage = 0;
//得到所有节点车库还有多少车没有发
if (carsNumberInGarage == 0)
{
//所有车库没车了
saveAnswer("config2/answer.txt");
return true;
}
}
}
}
然后开始填函数了,大家一起分工,怼起来了。
bool DynamicMap::TrafficRules()
{
//此处省略无数行代码。
}
总结
em…,看完了,整体来说这个交通规则逻辑比较难盘,能盘清逻辑基本就不难了,但是没有一个视觉效果,调试起来真不爽。然后就有了下一章。
四、怎么看效果?
没啥思路,有个大神分享了自己的QT源码。拿过来可视化自己的算法。Em…
这是地图整个的可视化样子:
这是具体的信息:
车辆不同颜色表示不同优先级的车辆。数据都显示在可视化的窗口中,棒棒哒。。。
下面详细分析一下QT的代码吧:
主要的架构:
1、画板是QGraphicsView类的view对象
2、内容是写在QGraphicsScene类的scence对象
3、元素是QGraphicsItem类的item对象
(只摘抄一丁丁丁的代码。)
int main()
{
class myclass : public QGraphicsItem
{
public:
myclass();
~myclass();
}
QGraphicsItem* item = new myclass();myclass继承(实现多态)
item->setPos(x,y);
QGraphicsScene* scene;(scene是个QGraphicsScene对象)
scene->clear();(清理原画板)准备刷新显示下一步
scene->addItem(QGraphicsItem* item);
view->setScene(scene);(view是个QGraphicsView对象)
}
感谢陪我参加比赛的同学。写一个博客记录一下。