【问题标题】:Use one or multiple random number generators for genetic algorithms?为遗传算法使用一个或多个随机数生成器?
【发布时间】:2014-11-15 17:24:41
【问题描述】:

我正在使用 Java 编程语言实现遗传算法。如您所知,算法中有一些随机事件,如轮盘选择、交叉、突变等。为了在这些事件之间生成更好的概率分布,哪种方法应该更好,使用唯一的 Random 对象或创建一个单独的每个事件的随机对象?

【问题讨论】:

    标签: java random genetic-algorithm


    【解决方案1】:

    使用单个对象。随机数生成器被设计成有很长的周期——使用相同的种子实例,你会得到一个很好的随机数字序列。如果您不断地创建和销毁它们,那么您只会在播种过程中获得多少随机性,甚至可能没有。想象一下,如果您的 RNG 是从系统时钟播种的,并且您每秒执行数千次,会发生什么情况。

    【讨论】:

      【解决方案2】:

      使用全局存储的单个 Random,并在需要随机性的任何地方引用它。此外,使用已知种子对其进行初始化,并将该种子连同遗传算法的结果一起写入文件。

      除了 deong 提到的好处之外,如果您发现一些有趣的输出,这可以让您准确地重新运行整个程序。遗传算法看到一个有趣的结果然后无法重现它可能会非常令人沮丧,因为这是一个罕见的结果。如果你有种子,你可以确定地重新运行程序。

      如果您希望每次运行都使用一个新种子,您可以这样做:

      long seed = new Random().nextLong();
      log("Seed for the current run is: " + seed);
      Global.setRandom(new Random(seed));
      

      这样您每次都会获得一个新的随机种子,但如果需要,您仍然可以重建给定的运行。

      请注意,Random 对象不应在两个不同的运行之间共享。在每次运行开始时,您应该创建一个新的随机对象并记下种子。

      【讨论】:

      • 但是,如果您需要(出于某种原因)多次运行算法并且希望它并行运行(每次独立运行但同时运行多次),则每次运行都需要单独的 RNG .但是对于单次运行的 GA,单次 RNG 是最好的选择。
      • @Gandalv 实际上,我应该澄清一下。每次运行都应该有它自己的新鲜 Random 对象。如果您在运行之间共享对象,则它们不再具有确定性。
      猜你喜欢
      • 2015-08-03
      • 2023-01-03
      • 1970-01-01
      • 2012-01-05
      • 2015-02-16
      • 2011-09-18
      • 2011-02-08
      • 1970-01-01
      • 2016-07-22
      相关资源
      最近更新 更多