Как построить алгоритм мутации для GA в R - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь построить свой алгоритм мутации для GA.

Он должен работать так: с вероятностью Pm мутация проходит - мы рисуем два рода a & b.После этого мы меняем их порядок или последовательность между этими двумя (если они не соседи).Если мутация не проходит - мы ничего не делаем.

Допустим, у нас есть потомство [010110], если мутация начинается, мы выбираем AB = [2,5], который указывает на [0 {1} 01 {1} 0].Мы делаем обратное и получаем [011010].

Я строю что-то вроде этого:

for(i in 1 : popSize){
  genomeMutId <- which(runif(2, Dim*cel)>pMut

   for(j in 1:length(genomeMutId)){
    drawn <- runif(1,genomeMutId[j],lenght(genomeMutId))
    iter <- 0
    for(k in genomeMutId[j]:drawn) {
      tmpValue <- nextGeneration[i, k]
      nextGeneration[i, k] = nextGeneration[i, drawn-iter]
      nextGeneration[i, drawn-iter] = tmpValue 
      iter <- iter + 1
    }
   }
}

К сожалению, это не работает должным образом.Какие-либо предложения?Может быть, я использую образец вместо runif?

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Мне пришлось реализовать функцию мутации для моего GA, которая оптимизирует расположение ветроэлектростанции.Все функции экспортированы, так что вы можете проверить их:

library(windfarmGA)
## Create 4 random individuals with binary values
a <- cbind(bin=sample(c(0,1),20,replace=TRUE,prob = c(70,30)),
           bin.1=sample(c(0,1),20,replace=TRUE,prob = c(30,70)),
           bin.2=sample(c(0,1),20,replace=TRUE,prob = c(30,70)),
           bin.3=sample(c(0,1),20,replace=TRUE,prob = c(30,70)))

a

## Mutate the individuals with a low percentage
aMut <- mutation(a,0.1)
## Check which values are not like the originals
a==aMut

## Mutate the individuals with a high percentage
aMut <- mutation(a,0.4)
## Check which values are not like the originals
a==aMut

mutation

Это не совсем то, что вы хотите, но, возможно, это поможет вам туда добраться.

0 голосов
/ 20 мая 2018

Вы можете сделать это следующим образом:

offspring <- c(0,1,0,1,1,0,1,1,0,1)

# given an offspring vector (e.g. 0,1,0,0,1,0)
# choose 2 cut points AB and invert the values between them
getNewOffspring <- function(offspring){
  AB <- sort(sample.int(length(offspring),2))
  if(AB[2] - AB[1] > 2){
    subSqIdxs <- seq.int(from=AB[1]+1,to=AB[2]-1)
    offspring[subSqIdxs] <- rev(offspring[subSqIdxs])
  }
  offspring
}

Пример использования:

getNewOffspring(c(0,1,0,1,1,0,1,1,0,1))
# e.g. with AB being 3,8
> 0 1 0 1 0 1 1 1 0 1

РЕДАКТИРОВАТЬ:

Предполагая, что список потомков хранится в списке под названиемoffspringsList вы можете извлечь случайное число для каждого потомства, чтобы решить, какой из них должен быть видоизменен, а затем вызвать предыдущую функцию:

offspringsToMutate <- which(runif(lenght(offspringsList)) > pM)

for(offspringIndex in seq_len(length(offspringsToMutate))){
   mutated <- getNewOffspring(offspringsList[[offspringIndex]])
   offspringsToMutate[[offspringIndex]] <- mutated
}
# now the list contains the mutated offsprings
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...