【问题标题】:Uniform Crossover for Genetic Algorithms in JavaJava中遗传算法的统一交叉
【发布时间】:2017-08-01 21:20:24
【问题描述】:

如何在 Java 中为遗传算法实现统一交叉方法?

目前,我正在使用 2 个需要在程序继续之前互连的 ArrayList。下面是我一直使用的方法的开始:

private void UniformCrossOver(int ListOne,int ListTwo)
{
...
}

我现在的立场是,我假设我需要再制作 2 个 ArrayList,它们会将数据拆分成,但我不知道从哪里开始进行交叉。我会使用以新数组的大小为定义键的 for 循环吗?

非常感谢您的帮助。

【问题讨论】:

  • 您需要一个ArrayList 来存储结果。在每一点,您以 0.5 的概率从两个输入 ArrayLists 之一中随机选择一个元素。您可以使用随机数生成器在 0 和 1 之间进行选择,例如 (Random::nextInt(0,2))。您将结果元素存储在结果 arrayList 中。
  • 好的。那么这是否意味着我需要创建递增的for 循环,该循环为ArrayList 中的每个元素运行。即:随机数生成器是决定新节点是从父节点 A 还是父节点 B 获取的不确定因素?
  • 是的。如果两个输入列表的长度不同(我不确定在您的场景中是否有可能),您必须决定在这种情况下该怎么做。
  • Uniform Crossover in Java的可能重复

标签: java algorithm computer-science genetic-algorithm


【解决方案1】:

如果交叉后不需要父母,则不必创建新的数组列表。只要您的染色体大小相同,这应该可以工作

public void uniformCrossover(ArrayList<Integer> a, ArrayList<Integer> b){
    for (int i = 0; i <a.size(); i++) {
        if(Math.random() < crossoverProbability){
            int tmp = a.get(i);
            a.set(i, b.get(i));
            b.set(i, tmp);
        }
    }
}

【讨论】:

    【解决方案2】:

    你可以使用数组来实现它

    //Some example chromosomes
    int[] chromosomeA = {1, 1, 0, 1};
    Int[] chromosomeB = {1, 0, 0, 0};
    
        for(int i = 0; i < chromosomeA.length; i++){
           int a = chromosomeA[i];
           if(new Random().nextInt(2) == 0){
             chromosomeA[i] = chromosomeB[i];
             chromosomeB[i] = a;
           }
        }
    

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 2015-07-15
      • 2016-08-31
      • 1970-01-01
      • 2017-03-16
      • 2015-07-03
      • 2016-09-16
      • 1970-01-01
      相关资源
      最近更新 更多