【问题标题】:Exchanging elements (crossover) between two vectors在两个向量之间交换元素(交叉)
【发布时间】:2017-01-20 09:52:58
【问题描述】:

假设我有:

chromosome_1 <- c('0010000001010000')

chromosome_2 <- c('0100000001001010')

如何实施第 3-5 步

  1. 评估
    • NC1 = 没有。 chromosome_1 中的 1 个
    • NC2 = 没有。 chromosome_2 中的 1 个
    • M = min(NC1, NC2)
  2. range(1, M) 生成一个随机整数NC
  3. 在基因中随机选择NC基因位置 与来自chromosome_1 的等位基因“1”并形成一组s1 的索引 这样选定的位置。

    在基因中随机选择NC基因位置 与来自chromosome_2 的等位基因“1”并形成一组s2 的索引 这样选定的位置。

  4. s = union(s1, s2) 假设 s = 2, 3, 10, 15

  5. 对于s 中的每个索引i

    chromosome_1chromosome_2 交换染色体的等位基因 基因位置i.

以下说明了结果:

我真的很感激任何帮助!

【问题讨论】:

    标签: r vector bioinformatics crossover


    【解决方案1】:

    你可以试试GA package:

    在手册(第 5 页)中,有一个示例。

    ga(type = c("binary", "real-valued", "permutation"),
    fitness, ...,
    min, max, nBits,
    population = gaControl(type)$population,
    selection = gaControl(type)$selection,
    crossover = gaControl(type)$crossover,
    mutation = gaControl(type)$mutation,
    popSize = 50,
    pcrossover = 0.8,
    pmutation = 0.1,
    elitism = base::max(1, round(popSize*0.05)),
    updatePop = FALSE,
    postFitness = NULL,
    maxiter = 100,
    run = maxiter,
    maxFitness = Inf,
    names = NULL,
    suggestions = NULL,
    optim = FALSE,
    optimArgs = list(method = "L-BFGS-B",
    poptim = 0.05,
    pressel = 0.5,
    control = list(fnscale = -1, maxit = 100)),
    keepBest = FALSE,
    parallel = FALSE,
    monitor = if(interactive())
    { if(is.RStudio()) gaMonitor else gaMonitor2 }
    else FALSE,
    seed = NULL)
    

    例如,填充、选择、交叉、变异和监控算子分配新功能。在我的研究中,我使用了自己的突变和监控功能。例如;

    myga <- ga(type = "binary",
    fitness, ...,
    min, max, nBits,
    mutation = myMutationFunction
    popSize = 50,
    pcrossover = 0.8,
    pmutation = 0.1,
    maxiter = 100,
    run = maxiter,
    monitor = myMonitorFunction
    
    myMutationFunction <- function (x) {
    #...
    }
    
    myMonitorFunction <- function (x) {
    #...
    }
    

    因此,您只需定义自己的函数并将函数名称赋予 ga 函数。为了便于参考,您可以查看默认功能。您可以在默认函数中看到必要的参数和返回值。

    【讨论】:

    • 对不起,我已经编辑了我的问题以使事情变得清晰。参考手册第 21 页,注意交叉函数有两个参数,objectparents,它们是什么意思?
    【解决方案2】:

    可能不是最简单的解决方案,但它确实有效

    set.seed(12345)
    
    ## Step 1
    a <- c(0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0)
    b <- c(0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,0)
    m <- min(sum(a==1), sum(b==1))
    
    ## Step 2
    random_int <- sample(1:m, 1)
    
    ## Step 3
    random_a <- sample(which(a == 1), random_int)
    random_b <- sample(which(b == 1), random_int)
    #all <- sort(union(random_a, random_b))
    
    ## Step 4
    ## for demo purpose (assume it as the random output)
    all <- c(2,3,10,15)     
    
    temp_a <- a[all]
    temp_b <- b[all]
    
    ## Step 5
    ##crossover
    b[all] <- temp_a
    a[all] <- temp_b
    
    ## Output
    > a
     [1] 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0
    > b
     [1] 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多