Ошибка: числовое выражение имеет 6 элементов: только первый использованный и предупреждение в GA - PullRequest
0 голосов
/ 05 марта 2020

Вот мой код, и мне интересно, почему появляются предупреждающие сообщения о том, что «количество заменяемых элементов не кратно длине замены»?

    library(GA)
    library(readxl)
    > data1 <- 
    read_excel("C:/Users/nadiahalim/OneDrive/CS954/Scheduling/data1.xlsx")
    > View(data1)
    > data1

вывод для data1

# A tibble: 6 x 4
   Jobj    Pj    Dj    Wj
  <dbl> <dbl> <dbl> <dbl>
1     1    25    61     3
2     2     7   102     7
3     3    42    86     1
4     4    36    44     3
5     5    18   150     1
6     6    29   134     4

Я хочу переставить Jobj так, чтобы это дало минимальное время завершения, обозначенное Cj. Циклы for использовались в моем коде следующим образом:

Cj=0
i<- sample(data1$Jobj)
for(i in 1:i){
fitness <-function(j){
for(j in data1$Jobj){
Cj[j] <- data1$Pj[j]+sum(Cj[j-1])
}
print(Cj)
}
fitness()

Вывод для этого кода

numerical expression has 6 elements: only the first used[1]  25  32  74 110 128 157
[1]  25  32  74 110 128 157
[1]  25  32  74 110 128 157
[1]  25  32  74 110 128 157
[1]  25  32  74 110 128 157

Затем я запускаю код GA:

GA <- ga(type = "permutation", fitness = fitness, lower = 1, upper = 6, maxiter= 5, run = 20, optim = TRUE)

вывод для GA следующим образом, а в предупреждении указано, что количество заменяемых элементов не кратно длине замены

    number of items to replace is not a multiple of replacement length[1]  25  32  74 110 128 157
number of items to replace is not a multiple of replacement lengthGA | iter = 3 | Mean = 25 | Best = 25
[1]  25  32  74 110 128 157
number of items to replace is not a multiple of replacement length[1]  25  32  74 110 128 157
number of items to replace is not a multiple of replacement length[1]  25  32  74 110 128 157

, тогда я использую вывод

summary(GA)

для сводной GA

-- Genetic Algorithm ------------------- 

GA settings: 
Type                  =  permutation 
Population size       =  50 
Number of generations =  5 
Elitism               =  2 
Crossover probability =  0.8 
Mutation probability  =  0.1 

GA results: 
Iterations             = 5 
Fitness function value = 25 
Solutions = 
      x1 x2 x3 x4 x5 x6
[1,]   4  1  6  3  5  2
[2,]   6  3  1  5  4  2
[3,]   6  2  3  4  1  5
[4,]   3  6  4  1  5  2
[5,]   4  6  2  1  5  3
[6,]   5  3  4  1  2  6
[7,]   2  1  6  3  5  4
[8,]   4  1  6  3  2  5
[9,]   3  6  1  2  5  4
[10,]  3  6  2  1  5  4
 ...                   
[35,]  4  5  6  2  1  3
[36,]  3  4  5  6  2  1

Когда я бегу за сводкой (GA), мне кажется, что это работает, но мне любопытно получить предупреждение. Я был бы признателен, если кто-нибудь мог бы помочь мне по этому поводу. Заранее спасибо.

1 Ответ

0 голосов
/ 06 марта 2020

То, что вы пытаетесь сделать в функции fitness, может быть легко достигнуто без for l oop.

Например, вывод, который вы получаете из for l oop

#[1] 25  32  74 110 128 157

и используя cumsum мы получаем то же самое.

cumsum(data1$Pj)
#[1]  25  32  74 110 128 157

Однако основная проблема заключается в том, что функция fitness должна возвращать только одно значение, а не вектор значений, таких как cumsum. Так что если вы измените функцию на что-то вроде этого

fitness <- function(j) sum(j)

Вы можете сделать:

fitness(data1$Pj)
#[1] 157

library(GA)
GA <- ga(type = "permutation", fitness = fitness, lower = 1, upper = 6, 
         maxiter= 5, run = 20, optim = TRUE)

, который не возвращает предупреждение.

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