上一节我们介绍了登山算法,它是一种局部优化算法,这一篇我们来说说其他两种优化算法。
##随意行走算法
随意行走算法(Random Walking Algorithm):也称为“酒鬼步法”,从一个随机位置开始,迈随机的步数。
public class RandomWalk<G, X> extends OptimizationAlgorithm<G, X> {
public Individual<G, X> solve(final IObjectiveFunction<X> f) {
Individual<G, X> best, pnew;
best = new Individual<>();
pnew = new Individual<>();
//创建一个随机候选结果pnew
pnew.g = this.nullary.create(this.random);
pnew.x = this.gpm.gpm(pnew.g);
pnew.v = f.compute(pnew.x);
//将当前最优结果赋值为候选结果pnew
best.assign(pnew);
while(!(this.termination.shouldTerminate())){
//每次都是修改候选结果pnew!!!
pnew.g = this.unary.mutate(pnew.g, this.random);
pnew.x = this.gpm.gpm(pnew.g);
pnew.v = f.compute(pnew.x);
if(pnew.v <= best.v){
best.assign(pnew);
}
}
return best;
}
}
你是否已经注意到了随意行走算法和登山算法的差异!(Hill Climbing迭代时每次修改的都是当前最优结果best,而Random Walking每次修改的是候选结果pnew!)
##随机采样法
随机采样法(Random Sampling Algorithm): 并不使用在优化过程中得到的信息,而是每次都随机产生一个候选结果与最优结果比价。
public class RandomSampling<G, X> extends OptimizationAlgorithm<G, X> {
public Individual<G, X> solve(final IObjectiveFunction<X> f) {
Individual<G, X> best, pnew;
best = new Individual<>();
pnew = new Individual<>();
best.g = this.nullary.create(this.random);
best.x = this.gpm.gpm(best.g);
best.v = f.compute(best.x);
while(!(this.termination.shouldTerminate())){
//每次都是创建新的候选结果!!!
pnew.g = this.nullary.create(this.random);
pnew.x = this.gpm.gpm(pnew.g);
pnew.v = f.compute(pnew.x);
if(pnew.v <= best.v){
best.assign(pnew);
}
}
return best;
}
}
##总结
现在已经有三个算法了,那么什么时候选用哪一种优化算法是最有效的呢?当然是在我们可以充分利用每一次迭代的结果做进化的时候!在后面,我们将探讨三个算法的性能优劣。