使用禁忌搜索如何选择邻居作为旅行推销员?

时间:2019-03-27 10:51:15

标签: pseudocode traveling-salesman tabu-search

当试图了解禁忌搜索如何应用于旅行推销员时,我很难理解邻居是如何产生的。如果我们看一下维基百科的伪代码:

sNeighborhood ← getNeighbors(bestCandidate)
for (sCandidate in sNeighborhood)
    if ( (not tabuList.contains(sCandidate)) and (fitness(sCandidate) > fitness(bestCandidate)) )
        bestCandidate ← sCandidate
    end
end

我最好的候选人是从最近邻居算法生成的路径开始的,此路径的邻居是什么?

说我的路径是A,B,D,C,A,每个索引附近都有可能吗?例如[B,D,C],[A,C,D]等?

然后我们为每个索引消除禁忌列表中的邻居?

如果没有,我的邻居是什么?

在伪代码中,禁忌列表也只会添加新的最佳候选者,那么下一次我们如何选择其他邻居呢?

if (fitness(bestCandidate) > fitness(sBest))
    sBest ← bestCandidate
end
tabuList.push(bestCandidate)

维基百科源代码:

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

1 个答案:

答案 0 :(得分:1)

问题1

is the neighborhood every possibility for each index?

在这种情况下,并非每次都能完成,因为总索引为4,但是当索引数目增加时,它将太复杂。

通常可以通过使用一些启发式方法(例如索引之间的直接距离)来找到邻域。例如,如果path为[A,B,C,F,G,E,D,A],并且为每个索引选择2个最接近的索引,例如,[B,C],[A,F ],[A,D]等。现在可以使用这些索引生成邻里,只使用有效的索引(请记住,每个城市仅被访问一次,而不在禁忌列表中)。

问题2

so then how do we pick a different neighborhood next time?

是的,最佳候选者被推入列表,而不是其邻居,因此它将找到新的邻居,而不会陷入无限循环。

例如,路径X将给出邻居Y和Z,(假设Z是最好的),因此Z将被推入禁忌列表(并且X已经在列表中),因此Z赢得了不会去寻找X,因此会寻找新的更好的邻居。

相关问题