【问题标题】:Trying to find the fastest way to navigate a set of edges in a graph试图找到在图中导航一组边的最快方法
【发布时间】:2020-04-14 19:31:00
【问题描述】:

我不确定应该使用哪种算法来完成这项任务。我有一个节点图。一些节点与需要遍历的加权线相连。但是,每个节点都连接有加权的双向线。只有一些线必须遍历,而其他线仅用于导航。我需要找到一条路径来遍历所有这些必需的行(双向),但只能遍历一次。我知道我必须从哪个节点开始。

现实世界的问题是我有一个需要从 CNC 图案切割的边缘列表。我正在尝试减少 CNC 机器切割这种图案所花费的时间。我知道我总是想从原点开始,但我不在乎图案在哪里结束,只要图案中的所有小块都被剪掉即可。我知道切割碎片的每个边缘需要多长时间,并且机器足够精确,它可以抬起头部并从那个位置开始到任何一点。我的图并不大,一般情况下可能多达 100 个节点。

这与旅行推销员不同,因为我不必在同一个地方开始和结束,而且我被允许(并且被要求)多次点击一个节点。

Djikstras 算法不起作用,因为我需要遍历所有节点才能切割所有边...我不只是想找到从 A 点到 B 点的最快方式。

奖励,我需要用 C# 实现它,但即使我只知道什么算法,我也可以将它编程。

这是我需要剪下的图案的示例图片。请注意,我忘记给一个对角线和一个弧线分配权重,对角线可以是 50,弧线可以是 75:

【问题讨论】:

  • 每个形状都有开始和结束?不确定图表是否是这里最好的方法。这些形状已经布置在工作表上,或者这也是优化问题的一部分?
  • 啊,等一下,您已经计算出每个停止起点之间的距离,这些是边权重吗?
  • 正确...边缘是加权的,实际上是从节点 A 到节点 B(或任何节点)所需的时间。形状大多是矩形,但偶尔在矩形内有弧线。
  • 形状是否共享边缘?也许举个例子有助于澄清这个问题。
  • 是的,他们可以共享一条边,所以只需要剪切一次。我会提供一张被剪掉的东西的图片,我只需要把它拼凑起来。

标签: c# algorithm graph-algorithm


【解决方案1】:

我相信这可以作为路由检查问题的案例来解决。

https://en.wikipedia.org/wiki/Route_inspection_problem

您需要确保该图存在欧拉回路,这可以通过运气或将奇数顶点连接在一起来实现。

【讨论】:

  • 这个解决方案对我来说是正确的。在这种情况下,问题变成了如何将顶点连接在一起以完成循环,要么全部为偶数,要么原点和另一个奇数。这可以看作是稳定室友问题的一个例子,它也有一个多项式解。 en.wikipedia.org/wiki/Stable_roommates_problem
  • 我想说这个问题本质上归结为中国邮递员问题,我有无向边,我可以有一个只有 1 条路径的顶点。我想,最后,我可以摆脱我追踪的时间,然后转到下一个点。仍在尝试提出 C# 解决方案,这当然不是小事。
  • 最后......我最终找到了所有奇数顶点,然后在最短的奇数顶点之间绘制了一条人工边,然后使用 Fleury 算法跟踪路径。它就像一个魅力,而且非常快。
【解决方案2】:

我认为这仍然会归结为旅行商问题。 TSP does not get any easier by removing the return-to-origin rule or allowing multiple visits.

因此没有多项式解决方案,您最好的选择可能是approximate solution

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 2013-11-22
    • 2013-06-30
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2020-05-21
    • 2013-12-06
    • 2010-12-07
    相关资源
    最近更新 更多