我正在使用Google Maps和Optaplanner构建车辆路由应用程序的原型。我将基于距离的评分更改为基于持续时间的评分,其中持续时间值是使用车辆的距离/平均速度来计算的。
现在,我想将交通拥堵变量添加到我的应用程序中。交通拥堵变量被实现为从当前位置到另一个位置的附加持续时间值(我使用的是位置图,并且与RoadLocation类中的distance变量一样使用double)。当我尝试运行它时,结果始终与前一个相同。这是第一次运行的结果:
我画了一些红线来表示交通拥堵,然后尝试重新运行求解阶段。这是第二个结果:
结果与前一个相同。我的问题是,将交通拥堵变量应用于车辆路径问题的最佳方法是什么?有没有人有添加此变量的经验?任何意见和建议,将不胜感激。
谢谢并恭祝安康。
最佳答案
本段仅作介绍。如果您想跳过它,那就去做。 ;-)
我采用了类似的方法来解决交通拥堵问题,但这不是一个实时系统。该解决方案每X分钟运行一次,这绝对好。
这给了我在实际optaPlanner计算开始之前预先计算完整道路网络的方式和路线的好处。
这节省了真正计算optaPlanner的时间。
网络由顶点和弧组成。对于每条弧线,您都有权重。
在这里为您开始真正的交易。
假设您针对所有地点以及到达地点的预计算步骤实现了Dijkstra
或A-Star
算法。这些寻路算法正在以最低的“旅行”成本来选弧。对于将被阻塞的每条弧/道路,我们假设距离为DOUBLE.MAX_VALUE
。该值可以解释为“不可驱动”或用剧烈的方式表示:对于当前的解决方案查找过程,两个顶点之间的这种连接甚至不存在。因此,寻路算法将简单地跳过这条路。对于每条可行驶的道路,我们都会计算实际费用,例如距离或经验不足。
optaplanner程序本身仅使用预先计算的寻路机制,例如比较从地点A到地点B的计算距离。
要将distance
变量设置为DOUBLE.MAX_VALUE
,您可以在基于用户的信息,其他提供商(例如google或基于管理员的规则)的信息之间进行选择。随着我在基于用户的内容与基于管理员的操作方面的经验不断发展,我可以推荐两种方式。
让我们讨论基于用户的操作:用户可以将与管理员相同的一组GUI操作标记为“阻塞”。对于下一个optaPlanner迭代,将涉及该标志。如果您拥有用户的GPS数据,则可以获得近似速度。对于GPS测量的每个间隔,您都可以计算该速度。如果速度在道路上(不是交叉路口),并且低于定义的最小速度(例如1mph或2 kmh),那么您可以通过弹出窗口询问用户这是否是交通拥堵,或自动阻止该道路而无需询问用户。如果您选择了弹出对话框,那么许多不同的用户必须在定义的时间段内投票“是”,例如半个小时,那路就堵了。当许多用户再次开车上路并发送该路段的GPS坐标时,您可以解决交通拥堵的问题。
自动方法的主要优点是,您将拥有基于系统的方法,错误率低。
如果您通过管理员采取手动方法,则必须注意实现用于显示道路的GUI和启用/禁用道路的阻塞属性。