Попытка запустить GA в R, получить Error в if (any (x <0)) {: пропущенное значение, где требуется TRUE / FALSE - PullRequest
0 голосов
/ 02 ноября 2019

Я относительно новичок в R, и мне нужно настроить генетический алгоритм, чтобы найти уравнение, которое будет производить определенное количество простых чисел.

install.packages("GA")
install.packages("matlab")
library(GA)
library(matlab)

f <- function(x)
{
  #initialize fitness score
  score <- 0 
  #set test values for k
  k <- seq(from = 1, to = 100,by = 1)
  #test if the result of the formula (k^2 + ak + b) is a prime number using test k values
  for (i in k) {
    if (isprime(i ^ 2 + x[1] * i + x[2]) == 2) {
    score = score + 1
    }
  }
  #return fitness score
  return(score)
}

lbound <- 2
ubound <- 1000

GA <- ga(type="real-valued",fitness=f,popSize = 10,pcrossover = 0.8,pmutation = 0.1, maxiter=30, run=20, lower = lbound, upper = ubound)

Когда я пытаюсь запустить часть GA, яполучить следующее сообщение об ошибке:

> GA <- ga(type="real-valued",fitness=f,popSize = 10,pcrossover = 0.8,pmutation = 0.1, maxiter=30, run=20, lower = lbound, upper = ubound)

 Error in if (any(x < 0)) { : missing value where TRUE/FALSE needed 

Любые предложения о том, что я могу делать неправильно?

Спасибо

1 Ответ

0 голосов
/ 02 ноября 2019

Ошибка в вашем коде возникает из-за того, что он пытается найти x [2], когда он не существует.

Если вы читаете пример Rastrigin для функции GA - виньетка, для 2 значений вам нужно 1. укажите функцию с 2 входами и 2. используйте обертку для этой функции

f <- function(x1,x2)
# two variables
{
  #initialize fitness score
  score <- 0 
  #set test values for k
  k <- seq(from = 1, to = 100,by = 1)
  #test if the result of the formula (k^2 + ak + b) is a prime number using test k values
  for (i in k) {
    if (isprime(i ^ 2 + x1 * i + x2) == 2) {
    score = score + 1
    }
  }
  #return fitness score
  return(score)
}

lbound <- 2
ubound <- 1000

GA <- ga(type="real-valued",
#the wrapper is here
fitness=function(x)f(round(x[1]),round(x[2])),
popSize = 10,
pcrossover = 0.8,pmutation = 0.1, maxiter=30, 
run=20, lower = rep(lbound,2), upper = rep(ubound,2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...