假设我有一组目的地和另一组相应的起源。我需要将每个目的地与一个原点连接起来。一组车辆从每个目的地开始朝向各自的目的地。每辆车的速度都提供。
在网络中,在任何时间都不允许两辆朝相反方向移动的车辆在特定道路上行驶,简而言之,道路上不应有任何碰撞,如果这种情况到达,两者中的任何一个可以在道路上碰撞的车辆可以等到其他车辆通过或者走另一条路径到达目的地。
图表可以被认为是道路网络,图表中的每条边都代表道路,图中的顶点可以被认为是边缘的交点。
目的是计算每辆车到达目的地所需的最短时间,以及每辆车到达目的地所需的路径,以满足上述所有限制。
关于解决这个问题的想法?
答案 0 :(得分:2)
即使在以下同时限制的任何组合下,决定所有车辆是否能够以最多某个给定的k个时间单位完成行程的问题是NP难的:所有车辆以单位速度行驶,每个边缘都有长度1,k = 3. NP难的问题意味着几乎可以肯定没有解决每个实例的多项式时间算法。为了表明这一点,我将减少NP难问题3SAT:在这个问题中,我们给出了一个布尔表达式,其形式为n个子句的连词(AND),每个子句都是3个文字的分离(OR),每个文字都是变量或否定(NOT)。总共有m个变量,我们可以将它们分配给TRUE或FALSE;我们的任务是确定整个表达式是否可满足 - 也就是说,是否存在对m个变量赋值TRUE或FALSE,导致整个表达式为TRUE。
假设我们有一个带有n个子句和m个变量的3SAT实例。我们可以构造一个问题实例,其中每个变量都成为一个边缘,沿着该边缘的流量方向(从左到右或从右到左)对应于变量的值(TRUE或FALSE)。每个子句成为连接到这些可变边缘中的3个的两端的小工具。直观地说,每个子句 - 小工具都会从一个起始点开始给出一辆车(想想这个位于左侧),这三个选项中有一个可以达到相应的终点(想想这个位于右侧)。具体做法是:
我现在声称原始3SAT实例是可以满足的,当且仅当问题的刚刚构造的实例具有持续时间最多为3的解决方案。
首先,我将展示如果3SAT实例是可满足的,那么对于刚刚构造的问题实例,存在持续时间3的解决方案。在这种情况下,我们可以假设存在令人满意的赋值Y,所以对于每1< = i< = m,令y_i是在某种这样的令人满意的分配中对变量x_i的赋值。现在在刚刚构造的实例中,将每个边缘事件定向在远离s_j的某些s_j上,每个边缘都在t_j上朝向t_j发生,每个变量边缘如下:如果y_i = TRUE,则定向边缘(u_i,v_i)从u_i到v_i,而OTOH如果y_i = FALSE,则将边缘从v_i定向到u_i。由于假设Y是令人满意的赋值,我们知道每个子句包含至少1个计算为TRUE的文字:也就是说,在每个子句中至少有一个包含变量x_i的文字z,使得z为正,x_i = TRUE,或z为负数,x_i = FALSE。这意味着,对于每个子句j,从s_j到t_j的至少一条路径与上面建立的边的方向一致。显然,如果汽车只是沿着上述方向给出的方向穿过边缘,那么在相反的方向上永远不会有两辆汽车越过边缘,因此这种汽车旅行不会相互干扰。由于从s_j到t_j的这些路径都具有长度3并且没有相互干扰,所有行程可以同时完成3个步骤。
现在,我将展示如果刚刚构造的问题实例的解决方案的持续时间最多为3,那么对原始3SAT实例存在令人满意的分配。假设对刚构建的实例有这样的解决方案:那么显然,每次旅行必须以最多3个时间单位完成。对于从s_j到t_j的汽车,它必须使用入射在s_j上的3个边中的至少1个,并且3个边中的至少1个入射在t_j上,因此它必须至少需要2个时间单位;此外,因为我们删除了包含变量及其否定的任何子句,所以对于任何j,没有顶点与s_j和t_j相邻,因此至少需要一个边缘,这意味着3个时间单位是我们希望的最短路径(因为每个边缘需要1个时间单位)。因此,解决方案中的每次旅行都必须采用3个时间单位,沿着3边路径,由于汽车从另一个方向进入而没有停留。请注意,这条路径上的中间支路必须是单个可变边缘,因为从某些u_i到v_i或反之亦然的其他方式涉及"加倍后退"通过至少2个边缘。特别是,对于从s_j开始的旅程,它必须是对应于条款j中的3个文字的3个不同的可变边缘之一。具体来说,让第j个子句中的文字为a,b和c。设x_i为文字a中的变量。如果a是正数,那么"从u_i到v_i"是从s_j开始的旅行的3个允许腿之一,否则(即,如果a是否定的)"从v_i到u_i"是。同样地,对于剩余的文字b和c。所以,到目前为止,我们已经确定:
我们按如下方式为3SAT实例构建解决方案:对于每个变量x_i,如果边缘(u_i,v_i)被一个或多个汽车从u_i越过v_i,则将y_i赋予TRUE;如果一个或多个汽车从v_i到u_i越过,则为Y_i分配FALSE;否则(如果边缘根本没有交叉),任意地将任一值赋给y_i。我们需要展示两件事:没有赋值变量TRUE和FALSE,并且赋值使表达式的值为TRUE。
首先,通过上述规则可以将变量x_i分配为TRUE和FALSE的唯一条件是,如果至少一辆汽车在每个方向上遍历边缘(u_i,v_i)。假设这是正确的矛盾:一些可变边缘(u_i,v_i)在解决方案中通过2次不同的汽车行程在相反的方向上交叉。然后显然,两辆车中至少有一辆必须暂停至少1次,让另一辆车通过这个边缘。但是解决方案需要至少4个时间步骤,这与我们假设最多3个时间步长的解决方案相矛盾,因此必须是如果任何汽车越过边缘(u_i,v_i),那么它们都是相同的方向,因此每个变量最多分配一个TRUE或FALSE。
其次,对于每个1< = j< = n,我们可以将3SAT实例的第j个子句重新解释为"汽车可以使用其中一个从最近3个时间单位从s_j行进到t_j中间的腿对应于条款j"中的文字,其中"对应的"使用方式与之前相同。注意,根据这种解释,3SAT实例是(a)等同于上面要点中的声明,我们已经确定它是真的,并且(b)仍然正式等同于原始的3SAT问题(因为我们所做的一切给出了对其变量和子句的解释。
由此可见,我们刚刚从问题实例的解决方案构建的3SAT问题的变量赋值没有矛盾,并产生值TRUE:即3SAT公式是可以满足的。
我们现在已经确定问题的答案是肯定的,并且#3;这个3SAT表达式是否存在令人满意的作业?"这个问题的答案是肯定的#34;是否有办法让所有汽车从他们的起点到达目的地的时间分别为3个或更少?"以及后一个问题的答案是肯定的对前者的答案是肯定的。因此,对任何一个问题的否定答案也意味着对另一个问题没有答案:也就是说,问题是等同的。我们在给定的3SAT实例的多项式时间内构造了你的问题实例,所以如果有一些算法可以在多项式时间内解决你的问题,它也可以用来解决多项式中的任何 3SAT实例时间 - 首先构造您的问题的这样一个实例,调用此算法将该实例解析为子例程,然后返回答案。因此,你的问题至少和3SAT一样难,即NP难。