【问题标题】:Different paths on the same route with overlapping同一路线上的不同路径重叠
【发布时间】:2017-03-14 22:13:55
【问题描述】:

我在 A 和 B 之间有一段旅程,有不同的路径来结束它。路径由初始公里和最终公里定义:

path 0 -> (0, 10)
path 1 -> (10, 25)
path 2 -> (10, 15)
path 3 -> (15, 20)
path 4 -> (20, 30)
path 5 -> (25, 35)
path 6 -> (30, 35)
path 7 -> (35, 40)
path 8 -> (40, 50)

如您所见,有些路径是重叠的。其实我们可以得到重叠路径的列表:

path 0 -> NONE
path 1 -> 2,3,4
path 2 -> 1
path 3 -> 1
path 4 -> 1,5
path 5 -> 4,6
path 6 -> 5
path 7 -> NONE
path 8 -> NONE

我想要得到的是所有可能的路线,路线中没有重叠的路径,但应该只走一条。有没有可以解决这个问题的算法?我尝试使用递归或使用堆栈之类的辅助数据结构来实现,但我发现很难获得包含最终可能路线的列表,我也尝试解决问题并尝试获得丢弃的路径列表,这是:

route 0-2-3-4-6-7-8 -> [1,5] discarded
route 0-2-3-5-7-8 -> [1,4,6] discarded
route 0-1-6-7-8 -> [2,3,4,5] discarded
route 0-1-5-7-8 -> [2,3,4,6] discarded

【问题讨论】:

    标签: algorithm recursion data-structures routing overlap


    【解决方案1】:

    是的。这是一个简单的图形问题。不要将这些视为重叠的路径,而是要意识到里程碑是不相交的节点。例如,如果您处于里程碑 20,那么您唯一可以向前移动的是 30 - 与其他细分市场重叠根本不重要。如果您将它们视为飞往编号城市的航线,也许效果会更好。

    您可以查看各种图遍历算法来选择算法。这一点很简单:您只有一个决策点,即里程碑 10。一旦您做出选择,剩下的路线就确定了。

    你能从那里拿走吗?

    【讨论】:

    • 能写个伪代码或者给我这个算法的参考吗?我看不到如何走一条路线,然后回到之前的重叠路径以获取剩余路线,依此类推,直到我拥有所有可能的路线。谢谢。
    • 这通常超出了 StackOverflow 的响应。您在哪里停留在您查找的算法的伪代码上?在发布该评论之前,您至少应该经历过“图遍历算法”,不是吗?其中许多带有伪代码。从 Dijkstra 的算法开始,然后从那里分支出来?
    • 实际上,我不想要“图遍历”,我尝试的是遍历重叠列表并查看当前路径是否有重叠,如果有,我将其保留为新的路由(递归)并保留重叠路径以在以下步骤中丢弃它们。然后,当我找到一条具有新重叠路径的路径时,我创建另一条路线(递归),依此类推,直到我完成路线并获得路线。最后,我必须获得所有路线,但我的方法中缺少一些东西,因为我得到了无限递归或丢弃的路径列表没有正确更新。可以帮忙上传一些代码吗?
    • 是的!如果您需要 code 方面的帮助,请将其发布在问题的正文中。请参阅Minimal, complete, verifiable example 以确保您触及正确格式代码问题的所有要点。
    • 但是,请注意,这种寻路与图遍历是同构的。
    【解决方案2】:

    终于,我得到了代码! (可能是可以改进的):

    from copy import deepcopy
    
    discarded_overlapped = []
    def overlap(overlapped,discarded):
        if all(x is None for x in overlapped):
            discarded.sort()
            if discarded not in discarded_overlapped:
                discarded_overlapped.append(discarded)
            return
        for i in range(len(overlapped)):
            if not overlapped[i] == None:
                overlapped_copy = deepcopy(overlapped)
                discarded_copy = deepcopy(discarded)
                for j in overlapped[i]:
                    if j not in discarded:
                        discarded_copy.append(j)
                        overlapped_copy[j] = None
                overlapped_copy[i] = None
                overlap(overlapped_copy,discarded_copy)
    
    
    Data = [None,[2,3,4],[1],[1],[1,5],[4,6],[5],None,None]
    overlap(Data,[])
    print(discarded_overlapped)
    # [[2, 3, 4, 6], [2, 3, 4, 5], [1, 5], [1, 4, 6]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2016-10-07
      • 2023-04-09
      • 2014-02-26
      • 1970-01-01
      相关资源
      最近更新 更多