【问题标题】:Efficient, max-flow algorithm to route as many people as possible to one location?高效的最大流量算法将尽可能多的人路由到一个位置?
【发布时间】:2021-02-24 02:55:04
【问题描述】:

我正在尝试使用有向图确定一个有效的最大流量算法,其中,给定 n 个航班列表(其中每个条目都有起始城市、结束城市、出发时间、到达时间,以及航班的容量),将从 A 市开始到 B 市结束的路线尽可能多的人。我还希望能够返回一组可以乘坐的航班,以便尽可能多的人从城市 A 到达城市 B。我认为它可能只是 Ford-Fulkerson 算法或类似算法的实现,但我无法以有效的方式将此时间表转换为最大流量实例,尤其是该算法的伪代码在这样做之后会是什么样子。

【问题讨论】:

    标签: algorithm max-flow network-flow ford-fulkerson edmonds-karp


    【解决方案1】:

    您正在考虑的算法可以解决问题,但必须正确构建要处理的图表。

    您的问题是时机。假设您想在 14:00 之前从 AC 的人,我们共有 4 个航班:

    航班 1:A -> B,10:00 -> 11:00,Cap. 100
    航班 2:A -> B,11:00 -> 12:00,Cap. 100
    航班 3:B -> C,11:30 -> 12:30,Cap. 100
    航班 4:B -> C,12:30 -> 13:30,Cap. 100

    您可以在这里看到,您可以填满所有航班,并及时从AC 得到 200,但构建图表需要考虑时间。
    我的建议是你没有一个节点来代表B,而是有几个节点:

    (B, 11:00) - B 11:00。
    (B, 12:00) - B 12:00。
    (B, 12:30) - 3 号航班起飞时。
    (B, 13:30) -当 #4 航班起飞时。

    任何可以从B 起飞的航班都将被添加到图表一次,从相关的B 节点开始。

    B 节点连接到具有无限容量的边缘中的其他B 节点,按时间顺序向前移动。这允许乘客在B 的不同时间之间“等待”。

    这个例子最终会得到以下边列表:

    // 飞行边缘
    [(A, 10:00), (B, 11:00)],章。 100
    [(A, 11:00), (B, 12:00)],章。 100
    [(B, 11:30), (C, 12:00)],章。 100
    [(B, 12:30), (C, 13:00)],章。 100

    // 等待边
    [(B, 11:00), (B, 11:30)],章。无限
    [(B, 11:30), (B, 12:00)],章。无限
    [(B, 12:00), (B, 12:30)],章。无限

    【讨论】:

    • 我不介意在您的示例中让人们在特定时间到达 C 市;我只对让尽可能多的人到那里感兴趣,以及返回人们应该乘坐的航班,以便尽可能多的人可以前往 C 市。
    • 在这个例子中你的等待边表不应该都是字母'B'节点吗?是否可以将其简化为仅链接到下一个相关时间?即 11:00 -> 11:30 -> 12:00 -> 12:30,因此机场的每个到达和离开时间都被捕获为一个节点,并且它们以线性时间顺序链链接。
    • @IanMercer 这就是我的想法,以确保实际上可以从城市 A 到我们构建的图表中的每个其他城市(包括到城市 C)的连接航班。唯一的问题是一种有效地做到这一点的方法,只要给出一个任意顺序的航班列表。我认为可能需要一个嵌套的 for 循环来比较每个航班,这很有效,但这显然不是最有效的方法。
    • @IanMercer - 感谢您的两句话。我已经相应地更新了我的答案。
    • @honethecode265 - 我的解决方案不是关于人们何时到达C,而是更多关于他们没有得到在他们到达之前离开的航班。希望这个想法有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2011-11-27
    • 2013-06-06
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多