从“算法设计手册”中不了解最近对启发式

时间:2012-07-12 19:52:36

标签: algorithm graph-theory

几乎完全相同question。但是我仍然不明白,这种启发式工作原理是什么以及顶点通过的顺序是什么。书中还有一张图片:enter image description here

这显示了最近neghbor启发式和我认为是最近对启发式的比较。从图片中我可以假设在顶部图片上,首先选择了0点,但是在底部图片上选择了最左边或最右边的一个。因为没有任何关于第一点选择的说法(也是最近对启发式没有做任何动作),我可以假设任何算法结果都不错,如果没有,它将不会给你底部图片考虑一下,从什么开始。

现在我只是想知道,最近对启发式的步骤是什么。可以理解类似于底部图片的图片以及与每次迭代相关联的数字以及解释。

以下是从该帖子中获取的书籍的link

4 个答案:

答案 0 :(得分:12)

我没有这本书,但它显示了最近邻启发法与此数据最优解的比较。此处显示的数据为(-21,-5,-1,0,1,3,11)。

混淆可能是在“本地”贪婪算法和“全局”贪婪算法之间(缺少更好的词)。上面显示的最近邻居是严格本地的。 “机器人”从0开始并选择转到1,因为它是最近的路径。机器人位于1,找到下一个最近的点是-1。然后机器人在-1,下一个最近的点是3,依此类推。

最接近的一对更全球化。它一次查看所有最佳边缘。因此,算法从0开始,找到四个正好相隔1个单位(0,1),(1,0),( - 1,0)和(0,-1)。它会添加两个不同的对来创建图形(-1,0,1)。这可以是有针对性的,也可以是非针对性的。

然后它会重复,并注意到(1,3)是下一个最小边缘,依此类推,直到它到达最佳解决方案。

不同之处在于,在最近邻居的情况下,机器人只能查看它当前所在位置的邻居。在最接近的情况下,您可以查看所有边缘以选择最小的边缘。

答案 1 :(得分:7)

我同意这本书中的内容并不十分清楚(因为读者在我的版本中遇到了这一点,这有点令人沮丧)。

我认为这里的难点不在最近对启发式本身。关键是注意到启发式本身不应该是解决问题的方法!只有一部分(可能是最重要的部分)的算法从未在书中完全描述过(可能因为这是一个错误的算法)。使用启发式算法,您可以得到应该连接的顶点对,但不应该是它们应该连接的顺序。为此,需要更多的东西。

为了完整起见,这是本书中的问题陈述

  

问题:机器人游览优化

     

输入 n S 集合在平面上

     

输出:访问集合 S

中每个点的最短周期巡视

现在,最近对启发式,如书中所定义并引用here,只能为您提供连接的集合/列表,而不是游览本身,因此不是所需解决方案要获得巡回赛,你必须做更多的事情。使用此策略的整体(有缺陷的!)解决方案如下所示:

1) Initialize the output list of vertexes to visit as the empty list (call it RET).
2) Obtain the list of connections (vertex pairs) given by ClosestPair (let it be L)
3) If L is empty, jump to 12
4) Remove an arbitrary connection from L (call it C1).
5) Choose an arbitrary vertex from C1 (call it V1)
6) Append V1 to RET
7) Remove from L the other connection that contains V1 (call it C2)
8) Choose the other vertex from that connection (call it V2)
9) append V2 to RET
10) Set V1=V2
11) If L is not empty, jump back to 7
12) return RET

或伪代码

Alg(P): # P is the input set of points
    RET = []
    L = ClosestPairs(P)
    if(L.empty()):
        return RET
    C1 = L.getAndRemoveRandomElement()
    V1 = C1.getRandomVertex()
    RET.append(V1)
    while(!L.empty()):
        C2 = L.getAndRemoveElementContaining(V1)
        V2 = C2.getTheOtherVertex(V1)
        RET.append(V2)
        V1 = V2
    return RET

答案 2 :(得分:1)

我正在经历理解该启发式方法的相同问题,我的回答可能会帮助其他面临相同问题的人。

机器人需要的是一条封闭的路径,该路径访问所有点,然后循环回到其原始位置。有一条声明提到过早终止,该声明坚持认为路径应该是完整的(访问所有点,即,我们不应该连接一些顶点对以使它们创建更小的闭合路径)。

现在通过下面的示例

Figure 1.3

在这里,通过使用最接近对启发式,我们将找到一条路径,该路径连接一条线中的所有点,然后将其余端点彼此连接(-21,11)。因此,无论机器人从0还是-21或11开始,它都将以相同的距离行进(它将返回到其起始位置以进行下一次迭代)。该距离将是最佳距离。

但是在以下情况下,上述方法失败

Figure 1.4

在这里,最接近的配对路径原来是左侧的图像,而最佳路径应该是右侧的图像,因此启发式方法无法给出正确的解决方案。

答案 3 :(得分:0)

TL; DR-据我了解,“不良”方法将越来越远的未访问点直接相互连接,从而在多弧中浪费了更多的焊料,并最终将最后一个点连接回第一点“ 0”。

“更好”的方法一次从中心1点沿任一方向向外移动,因此仍然来回移动,但仅沿“数字线”在直接相邻的点之间放置焊料。

单个静态图像中的插图和说明确实不清楚。他没有解释虚线的含义(是焊接的吗?仅仅是运动吗?似乎不一致)。同意这么早在所谓的“清晰”算法书中遇到问题真令人沮丧...

“最接近的邻居”和“最接近的一对”示例似乎都在点0上来回跳来跳去,这就是第一种方法不好的原因。他甚至说第二种方法也应该左右交替使用,那么有什么更好的方法呢?因为您仅将相邻的点直接彼此连接,所以逐步建立完整的线。

“不好的”示例(据我了解):

1. 0 connects to 1
2. 1 jumps over 0 & connects to -1
3. -1 jumps over 0 & connects to 3
4. 3 jumps over 0 & connects to -5
5. -5 jumps over 0 & connects to 11
6. 11 jumps over 0 & connects to -21
7. -21 connects back to 0, completing the cycle. 

这些“跳车”在0前后来回移动,但不要将这些点连接成一条直线。您将获得/ 6条不同的“焊接连接线”。

“更好”的最接近示例:

1. 0 connects to 1.
2. 0 connects to -1
3. 1 connects to 3
4. -1 connects to -5
5. 3 connects to 11
6. -5 connects to -21
7. -21 connects to 11 
8. Unstated, the robot arm apparently travels back to 0 afterward?

这些值也会在0上来回移动,但是在每一步中将现有直线每次一次递增一点。不用6弧焊,您只需用一条线焊起来,然后是最外面的端点的第二个连接点。