洒水车问题(路线有单向有双向)

在一个城市的某社区中,需要定期对社区道路进行洒水。下图是这个社区的街道示意图,其中“点”表示街道的交汇处,“边”表示需要洒水的街道,“边”上的数字表示每条街道的长度

(单位:m)。注意:洒水车只能按箭头方向行驶。

假定洒水车每次从“点”1处出发,每个方向的车道恰好只完成一次洒水任务,最后将洒水车停在“点”1处,假设洒水车的容量足够大,能够不需要中途加水就完成所有路面的洒水任

务。由于有些街道是单行线,因此有时候可能需要多次经过一条街道(每条街道的每个方向只洒水一次)。请为洒水车选择一条最佳路线,使得完成所有街道洒水任务所需的路程最

短。对于双向的街道,需要为每个方向的车道分别进行洒水。

 

记得第一次碰到这个题目是校赛建模的一个题目,当时刚拿到时还是有点懵逼的。后来google到HuangWei的这篇博客,关于中国邮递员问题和欧拉图应用才带给了我一定的思路。

虽然论文都已经交了两个月了,但今天在QQ群里看到一个类似的问题,又想了起,所以把它记录下来。

在洒水车问题上,若部分街道时双向,部分街道时单向时,已经被证明是NPC问题。不过这个题目看起来很巧,因为,我在把它看成两个图后,问题变得简洁多了。

首先,先把双向图抠出来。(手画见笑)

这直接一字画,不用多余的解释。接下来就只剩下单向的图了。

首先在原图上计算每个顶点的入度与出度之差。如果中所有的都有,那么G中已经存在欧拉回路。说明得加上出度。说明得加上入度。

而当,则不能做任何新增路径的端点。

这便成了一个网络流模型。

顶点对应于网络流模型中的源点,它发出个单位的流;顶点对应于网络流模型中的汇点,它接收个单位的流;而的顶点,则对应

于网络流模型中的中间结点,它接收的流量等于发出的流量。在原问题中还要求增加的路径总长度最小,我们可以给网络中每条边的费用值 设为图中对应边的长度。这样,在网络

中求最小费用最大流,即可使总费用最小。

在构建路径时,需要先判断,一个顶点周围四条边的大小。在这里,可将6顶点和9顶点看成一个整体。(图为经过构建网络流后,粗线是构建的路径)

最后可求出两个图的路径总和为5990。

posted @ 2016-08-28 16:17  clairvoyant  阅读(1289)  评论(0编辑  收藏  举报