水墨中国

实用优化算法(三)Random Walking And Random Sampling

  • 14-10-13
  • Algorithm
  • algorithm

上一节我们介绍了登山算法,它是一种局部优化算法,这一篇我们来说说其他两种优化算法。

##随意行走算法

随意行走算法(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;
  }
}

##总结

现在已经有三个算法了,那么什么时候选用哪一种优化算法是最有效的呢?当然是在我们可以充分利用每一次迭代的结果做进化的时候!在后面,我们将探讨三个算法的性能优劣。

comments powered by Disqus