Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 通过最大流约束查找未加权图中的最短路径_Algorithm_Graph_Shortest Path - Fatal编程技术网

Algorithm 通过最大流约束查找未加权图中的最短路径

Algorithm 通过最大流约束查找未加权图中的最短路径,algorithm,graph,shortest-path,Algorithm,Graph,Shortest Path,我的问题是,我想找到图中顶点S和T之间的最短路径(最可能的路径),但我也有一个流约束,因为问题状态为: -你有很多蚂蚁(或其他什么)/很多房间/它们之间有很多链接,我必须让我的蚂蚁一次旋转一圈,从S到我的图表,到达T,但是除了S和T,所有房间一次只能包含一只蚂蚁,而且蚂蚁在几圈内可能不会卡在一个房间里 所以我有一个流量图,所有边的容量都是1(考虑到每个房间里不超过一只蚂蚁) 在这里,我最终遇到了一个最大流和最短路径之间的问题,因为两条路径之间可能存在一些快捷方式,有时如果我只有一条或几条蚂蚁,那

我的问题是,我想找到图中顶点S和T之间的最短路径(最可能的路径),但我也有一个流约束,因为问题状态为:

-你有很多蚂蚁(或其他什么)/很多房间/它们之间有很多链接,我必须让我的蚂蚁一次旋转一圈,从S到我的图表,到达T,但是除了S和T,所有房间一次只能包含一只蚂蚁,而且蚂蚁在几圈内可能不会卡在一个房间里

所以我有一个流量图,所有边的容量都是1(考虑到每个房间里不超过一只蚂蚁)

在这里,我最终遇到了一个最大流和最短路径之间的问题,因为两条路径之间可能存在一些快捷方式,有时如果我只有一条或几条蚂蚁,那么最好只选择一条路径(选择快捷方式)并将我的蚂蚁发送到一个文件中,但对于一定数量的蚂蚁,最好选择两条路径,不要走捷径,把我的蚂蚁两个接两个,每条路一个,这样我的蚂蚁从S到T的转弯次数就最少了

到目前为止,我已经找到了一些关于最短路径的好算法,但他们总是给我错误的答案,因为他们可以找到阻塞流,这意味着选择一条最短路径,而不是两条更好的路径,为了避免这个问题,我研究了最大流问题,使用了类似ford fulkerson的算法,因为我可以跟踪阻塞流,并通过精确查看是否值得根据我的蚂蚁反转一个快捷方式来反转它们,但没有重量的概念,所以所有的快捷方式(将由max flow algo反转,因为快捷方式是唯一可能导致阻塞流的东西)都是反转的,但是随机的,所以这很难证明,但我很确定这也是错误的,我认为这是一种比最短路径算法更好、更精确的方法,但我确信它在100%的情况下仍然是不正确的,特别是在包含大量shorcut的图中


是的,这是学校作业,我不想让你做作业,但我真的很想深入研究这门学科,我是所有图形方面的初学者,所以我对任何能帮助我的算法都感兴趣,或者任何能帮助我的算法都感兴趣

我认为您在寻找最大流量算法方面走的是正确的道路。您可以尝试以下三步方法:

  • 重建图形以合并您的约束(每个房间只有一只蚂蚁)。这可以通过将每个房间的顶点v替换为两个顶点v_1,v_2和一个容量为1的有向边e(v_1,v_2)来实现。v的所有传入边都连接到v_1。v的所有输出边都连接到v_2。这样,在任何时间点,只有一只蚂蚁可以通过v(e(v_1,v_2))。两个房间之间的每个初始边的容量也为1
  • 运行。这将告诉您要使用哪些边以最大化流量。事实上,这应该为您提供从S到T的所有不同路径(没有两条路径共享一个房间)
  • 一旦你有了不同的路径,你就可以计算出它们的长度,从中可以直接计算出从S到T的所有蚂蚁所需的步数

  • 不确定我是否理解这个问题。让我重申一下。您希望通过图(顶点=房间,边=房间之间的链接)从顶点S到顶点T获得N只蚂蚁。每个顶点(S和T除外)在一个时间点只能容纳1只蚂蚁。从一个房间到下一个房间需要一个时间步。要让所有蚂蚁从S到T需要多少时间步?是的,就是这样!时间步长正是我试图最小化的,我想让我的蚂蚁以尽可能少的时间步长从S到T,如果我试图表达我的问题,我会说,根据我的蚂蚁数量,我如何知道一条较短的路径是否比两条较长的路径好。这可能是一个非常有趣的问题,但你没有详细说明,我们无法告诉你真正需要什么。也许最初向你提问的人会更仔细,也许你可以使用更多他们使用的词语。关于你在评论中的最后一个问题:如果你真的必须尽快让N只蚂蚁从S到T,当你有很多蚂蚁时,你将使用最大流量,当你减少到更少的蚂蚁时,你将停止使用更长的路径。当你只有一只或几只蚂蚁时,你只会使用最短路径。我很抱歉,但我认为你所说的正是我的问题,只有一只蚂蚁==只找到最短路径,很多蚂蚁==所有不同的路径都可能,但在这两者之间,我如何才能找到准确的答案,因为每个问题都有两个不同的问题和解决方案(最短路径和最大流量)(示例),这里是一个简单的快捷方式示例,但想象一个更复杂的图,其中有许多不同的路径/快捷方式,它们可能具有不同的长度等,如果我仍然不清楚,请回答。如果你照上面的捷径图,当只有一只蚂蚁时,准确答案是3(意思是通过走捷径,我花了三步时间让所有蚂蚁通过s到T),如果我有10只蚂蚁,正确答案是8(意思是不走捷径,我花了8步时间让我所有的蚂蚁通过我的图表),但这是一个简单的图,所以我正在寻找一种方法,将其推广到更复杂的图。是的!但我认为有一个小问题,因为,你将有所有不同的路径,但有时为了最小化时间步长,采取shorcut可能是一个真正的收益,例如,你运行Ford-fulkerson算法,你最终得到一个有向图wich包含两条路径(两条不同的最短路径),但可能有一条路径穿过另外两条路径,wich非常小,所需时间也会更少。你是对的。福特富尔克森只会最大化不同路径的数量