【问题标题】:How to find a path between two points connected by lines如何找到由线连接的两点之间的路径
【发布时间】:2022-08-19 17:09:06
【问题描述】:

我尝试为工作中的潜在项目开发此代码,我认为Dijkstra 可以提供帮助,但不知道如何开始。[![在此处输入图像描述][1]][1]

我有一个名为myListLine 对象列表,每行都有EndPoint1EndPoint2 作为Point2Dcordinates (x,y) 和Name 作为string。所以列表有 L1、L2、L3、L4、L5、L6、L7 和 L8,如示例图像所示。点 A、B、C、D 和 E 是这些线的点,它们始终不是两条线之间的连接点。

我想写一个方法,给我一个连接两点的线(或线的名称)的列表,例如:

List<string> FindPath(Point2D P1, Point2D P2): (A, E): L1, L3, L6, L7, L8
List<string> FindPath(Point2D P1, Point2D P2): (B, D): L2, L3, L5

编辑:我想找到所有可能的路径,尽管 99.9% 的时间只有 1 条可能的路径。

  • 我投票结束这个问题,因为这个问题属于 Stack Exchange 上的 \"Computer Science\"、\"Theoretical Computer Science\" 或 \"Computational Science\" 站点。
  • @Matt 这种算法问题在 S/O 上相当普遍,在这里受到欢迎。 OP 的错误是包含 c# 标记,我将对其进行编辑以删除。请删除您的投票以结束此操作。或者,如果你觉得我错了,我们可以在 Meta 上进行确认。
  • @Matt 算法在这里特别被称为欢迎:stackoverflow.com/tour
  • @Dave - 谢谢你的澄清。我删除了我的近距离投票。

标签: algorithm math graph-theory


【解决方案1】:

您正在谈论一个名为 graph 的数据结构,它是一组节点(点),由边缘(线段)。

图表有几种风格。他们可以定向的或者无向的, 他们可以通过循环的, 或者无环.

有向图有单向边:边ab 只能用于从ab,不能用于从ba无向图,另一方面,有 2 路边:只要两个节点相连,你就可以从一个节点到另一个节点。

循环图允许循环,遍历图可以将您返回到您已经访问过的节点(abca 是一个循环);无环图不允许这样的循环。如果您的图表是循环的,当你遍历它时,你需要跟踪你访问过哪些节点,这样你就可以检测和处理循环。如果不这样做,您将陷入无限循环。

此外,两者节点边缘可能带有附加信息,例如“成本”,使它们成为加权图.谷歌和苹果的地图被建模为这样的加权图。每个交叉口都是一个节点,交叉口之间的每个街道段都是一条边。边缘携带的附加信息(权重)是平均速度、开始/结束地址等信息。

如果您需要在图中的两个节点之间找到shortest path,您可能需要一个加权图(其中边带有一个距离.与否:也许“最短路径”被定义为AB 之间的最少中间节点数。

因此,您需要正确的模型:

  • 一个节点, 和
  • 一个边缘,由 2 定义节点它连接。

可以(有时完全放弃节点集,并仅根据其边定义图很有用:

一旦你有了它,从图中的任意两点找到一条路径实际上非常容易。算法是这样的:

  • 如果存在边AB,您可以从节点A 到节点B。否则...
  • 你可以从节点A 到节点B 如果
    • 存在一条边AX,并且
    • 你还没有访问节点X,并且
    • 你可以[递归地]从节点X到节点B

这就是它的全部内容。

【讨论】:

    【解决方案2】:

    我假设您需要找到从一点到另一点的最短路径。因此你需要做一个 BFS*). 首先将点转换为图形。该图可以是格式

    // The key is the point and the it contains the list of all 
    // the neighbours
    Map<Point2D, List<Point2D>> graph = new HashMap<>();
    

    然后使用队列和访问矩阵来跟踪访问点。循环遍历分数时,请确保将它们添加到答案列表中。 有关 BFS 的更多详细信息,请参见此处:https://www.geeksforgeeks.org/print-paths-given-source-destination-using-bfs/


    *)Breadth First Search Algorithm

    【讨论】:

    • 你能解释一下缩写 BFS 是什么意思吗?在您提供的链接中,我找不到它。请注意,BFS 是矛盾的,请参见此处:acronyms.thefreedictionary.com/BFS(找到 64 种不同的含义)。我只能猜你的意思是“最佳优先搜索”。它也可能意味着“广度优先搜索算法”。请确认。
    • @Matt 我说的是广度优先搜索
    • 感谢您的回复,我已在您的答案中添加了注释。
    【解决方案3】:

    您可以通过将其视为图形来解决此问题。每个 x 是一个顶点,你的线是边。然后要找到 P1 和 P2 之间的路径,从 P1 运行 BFS。

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2016-08-20
      • 2010-10-17
      • 1970-01-01
      相关资源
      最近更新 更多