【问题标题】:How to sort edges of path based on start and end point?如何根据起点和终点对路径边缘进行排序?
【发布时间】:2026-02-17 12:30:02
【问题描述】:

我对每辆卡车的路径都有疑问。从我的模型中,我得到每条卡车路径的输出都是错误的。我想根据起点和终点订购我的边列表。

trucks =  {0: (10, 1),1:(7,1),2: (3, 10),3:(7,4)} # truck_number:(start_point, end_point) 

我需要更改的输入:

  path = {0: [(2, 1), (5, 2), (6, 5), (10, 6)],
    1: [(2, 1), (5, 2), (6, 5), (7, 6)],
    2: [(2, 5), (3, 2), (5, 6), (6, 10)],
    3: [(5, 4), (6, 5), (7, 6)]}

我需要的输出

output_i_need ={0: [(10, 6), (6, 5), (5, 2), (2, 1)],
                1: [(7, 6), (6, 5), (5, 2), (2, 1)],
                2: [(3, 2), (2, 5), (5, 6), (6, 10)],
                3: [(7, 6), (6, 5), (5, 4)]}

python 中是否有任何库可以对我的边列表进行排序?

【问题讨论】:

  • 为什么你的路径不止一次通过边缘? (例如(6,5)或(5,2))
  • 很遗憾,我得到的图数据集是这样的。 (6,5) 或 (5,2) 是边。例如,卡车 0 从节点 1 的 10 开始。基于此信息,我们需要将 path 字典排列为 {0: [(10, 6), (6, 5), (5, 2), (2, 1)],....}
  • 为什么路径不止一次越过特定的边缘?例如,边缘 (6,5) 在您的路径中出现了 3 次!
  • 我相信卡车和它们各自的路径是独立的,因此对于特定卡车不会有重复的边。
  • @ravenspoint:6.5 在不同的卡车路径中。所以不同的卡车可能有相同的边缘

标签: python sorting graph networkx


【解决方案1】:

我不知道有什么库,但是如果将边列表转换为映射 edge_start 到 edge_end 的字典,编写一个函数来重新排序边列表很容易。

trucks =  {0: (10, 1),1:(7,1),2: (3, 10),3:(7,4)} # truck_number:(start_point, end_point)
paths = {0: [(2, 1), (5, 2), (6, 5), (10, 6)],
    1: [(2, 1), (5, 2), (6, 5), (7, 6)],
    2: [(2, 5), (3, 2), (5, 6), (6, 10)],
    3: [(5, 4), (6, 5), (7, 6)]}

def reordered(l, start, end):
    d = dict(l)
    result = []
    while start != end:
        result.append((start, d[start]))
        start = d[start]
    return result

new_paths = { truck: reordered(path, trucks[truck][0], trucks[truck][1])
              for truck,path in paths.items() }

print(new_paths)
# {0: [(10, 6), (6, 5), (5, 2), (2, 1)],
#  1: [(7, 6), (6, 5), (5, 2), (2, 1)],
#  2: [(3, 2), (2, 5), (5, 6), (6, 10)],
#  3: [(7, 6), (6, 5), (5, 4)]}

【讨论】:

    最近更新 更多