= 50 # 种群的数量(染色体总数)
NP = 2 # 变量的维度(基因数)
D = 500 # 最大进化代数(迭代次数)
G = 0.4 # 初始变异因子(缩放因子)
F0 = 0.25 # 交叉概率
CR = 10 # 变量上限
xmax = -10 # 变量下限
xmin = 1e-7 # 迭代停止阈值 theta
文字部分回头补上
参数设置
随机初始化种群
= matrix(runif(NP*D, min = xmin, max = xmax), nrow = NP, ncol = D) # 初始种群
data
= matrix(vector(length = NP*D), nrow = NP, ncol = D) # 变异种群(空矩阵)
v
= matrix(vector(length = NP*D), nrow = NP, ncol = D) # 选择种群(空矩阵) u
目标函数
<- function (x) {
Ob # 将这个复杂的函数拆解成
<- (sin(sqrt(sum(x^2))) + 0.001) / (sqrt(sum(x^2)) + 0.001)
term1 <- exp(0.5*sum(cos((2*pi*x))))
term2
# 将各部分合并起来得到最终的目标函数
+ term2 + 10
term1
}# 这是向量化的目标函数(x是向量)
适应度与适应度增量
<- c()
fitness_trace <- apply(data, MARGIN = 1, FUN = Ob)
FITNESS 1] <- min(FITNESS)
fitness_trace[
<- c() delta_fitness
差分进化循环
for (i in 1:G) {
<- i
iteration
# 变异操作
# 自适应变异因子
= exp(1 - G/(G+1-i))
lamda = F0*(2^lamda)
FN # 提取3个不同行的染色体(行索引也不能等于m)进行变异
<- c(1:NP)
temp for (m in 1:NP) {
<- sample(temp[-m], size = 3, replace = FALSE)
indx <- data[indx[1], ] + FN*(data[indx[2], ] - data[indx[3], ]) # 差分变异
v[m, ]
}
# 交叉操作
<- sample(1:NP, size = 1) # 整数随机数
r for (n in 1:D) {
<- runif(1) # 1个介于0-1之间的随机数
cr
if (cr <= CR | n == r) {
= v[ , n] # 所有个体的第n维变量
u[ , n] else {
} = data[ , n]
u[ , n]
}
}
# 边界值判定
for (n in 1:D) {
for (m in 1:NP) {
if (u[m, n] < xmin | u[m, n] > xmax) {
= runif(1)*(xmax - xmin) + xmin
u[m, n]
}
}
}
# 选择操作
<- apply(u, MARGIN = 1, FUN = Ob)
fitness for (m in 1:NP) {
if (fitness[m] > FITNESS[m]) {
= u[m, ]
data[m, ]
}
}
# 监视适应度与适应度增量
+1] <- min(FITNESS)
fitness_trace[i<- fitness_trace[i+1] - fitness_trace[i]
delta_fitness[i]
<- apply(data, MARGIN = 1, FUN = Ob)
FITNESS
# 迭代停止判定
#if (!is.null(delta_fitness[i])) {
#if (delta_fitness[i] < theta) break
#}
}
我很想在迭代的最后加入代码:
if (!is.null(delta_fitness[i])) {
if (delta_fitness[i] < theta) break
}
用以判定停止条件。即当前后两次迭代的适应度的增量(差值)小于给定的阈值 theta
时终止循环。但在几次试验后发现效果并不好:迭代不超过 10 次就停止了,而输出值并不理想。
可视化
适应度
plot(x = 0:iteration, y = fitness_trace, type = "l")
适应度增量
plot(x = 1:iteration, y = delta_fitness, type = "l")