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