用于有效绘制一组线的算法

时间:2013-08-30 01:37:34

标签: algorithm

我发现以下算法在线提问,但找不到任何有效的解决方案 谷歌访谈时询问了这个问题。问题是这样的:

给定一系列要绘制的线(每条线具有起点和终点),
给出一种算法,帮助您在最短的时间内绘制线条 没有必要仅从起点绘制线条。

有一种方法将每一行视为图中的一个节点 并且2个节点之间的边缘是第一行的结束节点之间的距离 和第二行的起始节点。在此之后,如果我们计算最小生成树,则 它会给出最佳答案。

但是我不确定这是否会一直提供最佳解决方案,因为它假定了这一点 线仅在一个方向上绘制。

任何人都可以提供有关如何解决此类问题的提示吗?

5 个答案:

答案 0 :(得分:5)

假设Steve314在评论中对笔式绘图仪的解释是正确的(如OP所述),那么问题就在于旅行商问题的某种推广,这已知是NP完全的。

证明:如果所有线都具有长度0,即减少到点,那么问题是:笔必须触摸每个点,并且必须最小化笔行进的总距离。这正是欧几里德旅行商问题。

所以你应该寻找一种近似算法(你无法有效地找到最佳解决方案)。部分approximation algorithms for the Euclidean TSP基于miminum生成树,可以进行修改以解决您的问题。也可以证明生成的算法会给出一条不超过最佳路径长度X(= 2?)倍的路径。

编辑:这是一个完整的例子,改编自维基百科的“最简单”度量TSP近似解算法

  1. 将您想要绘制的线条解释为无顶(可能是断开连接)图形的边缘,其顶点是指定的端点
  2. 完成包含所需边缘的最小连通(跨越)图形(使用Prim算法)
  3. 转换为有向图并找到Eulerian circuit
  4. 这应该给你一个解决方案(按照适当的路径绘制边缘),最多只有最佳路径的两倍。它可以通过多种方式进一步优化,例如,通过获取快捷方式并在不需要绘制下一个边缘时(仅次或根本)跳过路径中的顶点。

答案 1 :(得分:1)

对于最小生成树,您将不得不使用Djikstra算法,该算法将选择最短路径并将其与递归连接到同一节点的所有其他路径进行比较,直到处理完所有节点。实际上我只是重读了你的问题,因为你的路径不必从某一点开始,你可以使用与上面有相同想法但从任何节点开始的Prim。两者都使用优先级队列,允许广度优先搜索。

答案 2 :(得分:1)

这是一个非常讨厌的问题。它是最短的哈密顿路径,但你有一个 ton 的边缘(所有边缘(u,v),其中u是某条线的端点,v是不同线的起点),以及距离不对称。 TAOCP 4A中描述的优雅的基于ZDD的方式并不适用于我认为 - 它会在所有这些边缘被淹没。

这是一个想法(不是最优的,但无论如何它似乎是一个相当不错的主意),借鉴TSP:

For every line s
    Schedule = empty sequence
    For every line n
        insert n in the optimal position in Schedule
    Apply 2-opt (see TSP) to the Schedule
Take the best Schedule.

对2-opt非常小心。它通常用于对称距离情况,可以让您优化“距离变化”计算。你不能在这里做。

这是另一个想法,大量借鉴TSP:

解决了大量的ILP问题。对于每个节点st(不相等):

  • 每个边缘的布尔变量。
  • 权重是这些边的长度。
  • 不是ns的每个节点t都会给出“与n == 2”相邻的所有边的总和的约束
  • 对于节点st,该总和等于1
  • 懒洋洋地添加约束,整个事物必须是一个连接的组件,即:
    • 检测连接的组件。如果有1,这是一个解决方案。
    • 如果每个连接组件的数量超过1个:
    • 如果它包含st,请添加约束条件,即与该连接组件相邻的所有边的总和必须为1.
    • 否则,该金额必须为2。

充分利用所有这些解决方案。可能需要一段时间。

答案 3 :(得分:0)

不确定我是否完全理解您的问题。一种方法可以从您的绘图区域开始,例如640X480图像。然后对于图像中的每个位置,检查像素(x,y)是否位于至少一条线上(您只需要使用线方程式和epsilon的某个合适值来满足一条线),如果是这样,则输出a 1,否则为0.绘制所有线条。

答案 4 :(得分:0)

使用不相交的数据结构。完成集合的并集后,它将立即求解最小生成树。 https://en.m.wikipedia.org/wiki/Disjoint-set_data_structure