1

我想在 matlab 中实现禁忌搜索以优化 Ackley 基准函数,因为我对如何为这个连续函数生成邻域感到困惑。统一的随机数是否足够,或者我必须选择步长?谢谢帮助

4

1 回答 1

1

来自维基百科的伪代码:

1  sBest ← s0
2  bestCandidate ← s0
3  tabuList ← []
4  tabuList.push(s0)
5  while (not stoppingCondition())
6    sNeighborhood ← getNeighbors(bestCandidate)
7    bestCandidate ← sNeighborHood.firstElement
8    for (sCandidate in sNeighborHood)
9      if ( (not tabuList.contains(sCandidate)) and (fitness(sCandidate) > 
       fitness(bestCandidate)) )
10       bestCandidate ← sCandidate
11     end
12   end
13   if (fitness(bestCandidate) > fitness(sBest))
14     sBest ← bestCandidate
15   end
16   tabuList.push(bestCandidate)
17   if (tabuList.size > maxTabuSize)
18     tabuList.removeFirst()
19   end
20 end
21 return sBest

检查第 9 行。禁忌搜索的整个想法是有一个以前访问过的位置的列表,以阻止搜索转到那些以前访问过的位置。

如果将当前位置的随机扰动用作其邻居,则从另一个位置到达完全相同的邻居的概率实际上是 0。这欺骗了拥有禁忌列表的目的,因为第 9 行中的条件 1 几乎总是正确的。

我想最好将搜索空间离散化为每个维度的 10 或 50 个间隔。

于 2018-04-27T08:56:52.547 回答