如何找到经过一组集合的最短路径?

时间:2019-02-14 13:03:18

标签: algorithm graph-theory set-theory

我有一个算法问题,其中有许多无序元素集,我需要找到穿过所有这些集的最短路径(这些集的有序组合)。可能有数千套。

例如,让以下4个无序集合:
A = abcdefg
B = cd
C = abch
D = defi

最短路径大小为 11

一种可能的解决方案是:
P = CADB = habcgdeficd
| P | = 11

请注意,集合可能与路径中的相邻集合共享元素!
可能还存在属于不同集合的重复元素(如上例所示:通过在中添加 B ,在 P 中复制了“ c”和“ d” CAD )。

请根据算法建议找到最短路径。
谢谢!

2 个答案:

答案 0 :(得分:0)

您有一个图形:

  • 节点是集合;
  • 如果A-BA具有相交但不是彼此的子集,则边缘B存在;
  • 如果边缘A-B存在,则距离A-BA并集B的大小。

您正在寻找涵盖所有节点的最短路径。这是travelling salesman problem的一种变体,无需重新开始。

一些阅读: What is the problem name for Traveling salesman problem(TSP) without considering going back to starting point?

编辑: 我尝试总结评论和答案中讨论的内容。

  1. 问题中尚不清楚的是:如果一个集合是另一个集合的超集,您将怎么办?我以为您想将这两个集合分开,这就是为什么我这样写:“如果A和B具有相交但不是彼此的子集,则边缘A-B存在”。对于TSP,如果边缘不存在,则在A和B组之间使用无限距离。这适用于子集/超集。

  2. 路径是有序的(根据路径的定义),但是集合是无序的。这就是为什么这不是Shortest常见超字符串问题的(平凡的)变体。字符串是有序的,集合号是

  3. 在上面定义的距离下,TSP想法也不起作用,因为:

    • 距离的定义不好:当交叉点增大时,距离应严格减小。一个解决方案是max(len(S)) - len(A ^ B)
    • 更重要:不允许在集合的“两面”使用相同的字母。例如。 “ abc”与“ bcd”的距离不能为1,与“ eb”的距离为2,因为如果选择路径“ a-bc-d”,则边缘“ abc”-“ eb”不会不再存在。也许贪婪的选择可以解决问题,但我不确定。

答案 1 :(得分:0)

这个问题可以简化为Shortest common superstring problem

的变体