最近的块,每种颜色中的一种,但在不同的行上

时间:2013-06-02 07:48:25

标签: algorithm computer-science traveling-salesman

假设我有一个房间有3种不同颜色的块,标记为A,B和C: Picture 1

我的目标是找到离Lolo最近的三个街区,这样我就有一个A,一个B和一个C.另外,每个街区和Lolo本身必须在不同的行上: Picture 2

例如,可以不使用第1行上的块,因为Lolo在该行上: Picture 3

如果我们选择Lolo上方的A块,则不能使用第0行的其他块: Picture 4

对于此示例,正确答案是这些块: Picture 5

我很容易找到离Lolo最近的三个街区;但是,我很难应用额外的约束(每个字母之一,而不是在同一行)。这感觉就像旅行商问题的变化。

找出这些街区的有效方法是什么? (即使是正确方向的一点,也会非常感激!)谢谢!

2 个答案:

答案 0 :(得分:1)

我认为你应该使用DFS

你以下一种方式建立G:

  1. Lolo是根
  2. 选择没有已经访问过的颜色的可用块,添加到G,重量是距离Lolo的距离
  3. 将所有区块设置为与不可用的同一行
  4. 如果有更多可用块转到2
  5. 如果没有可用的块返回Lolo,并选择不是Lolo的直接儿子的块
  6. 构建图形后,您可以运行深度为3的DFS并选择成本最低的路径。

    这将为您提供最低距离。

    还有其他限制吗?它需要多快才能运行?

答案 1 :(得分:1)

贪心解决方案:

应该完成下面所有块的选择,使其符合行约束。

  1. 选择尚未挑选的最近的区块(比如这是A)。
  2. 选择最近的非A区块(比如这是B区)。
  3. 选择最接近的非A,非B(因此为C)块。
  4. 记录这段距离。
  5. 如果在与B相同的行中有更接近的C,则选择该C以及下一个最接近的B并记录距离。
    • 对于3种以上的颜色,您只想在另一行中选择下一个最接近的B。
  6. 如果最近的未打开的块超过bestDistanceSoFar/3,则停止,否则从1开始重复。
  7. 返回最佳距离。
  8. 为此,我建议为每种颜色设置一个排序列表。

    我认为这是最佳的,但为什么需要一些思考。

    <强>预处理:

    如上所述,您可以删除Lolo所在的同一行中的所有块,但也可以删除Lolo中与同一行中相同类型的另一个块相比的所有块,这在这种情况下并不是很多,但仍然如此。

    Pic

    附加说明:

    鉴于你只有3种颜色,蛮力的运行时间将是O(n 3 ),这比O(n!)或O(2 < TSP的sup> n 。

    对蛮力的明显优化是将所有颜色分开,这将导致O的运行时间(n 1 n 2 n 3 )其中n i 是具有第i种颜色的块的数量。