我正在编写一种遗传算法(GA),以查找我的社交网络数据(一个iGraph对象)中的某个排列。我正在使用R库GA,但是它生成的排列包含重复且其长度是变化的,而我希望排列不包含重复且长度相同。
我知道突变和交叉功能会导致这种现象,但是我无法找到解决方法。我尝试实现一种适应度函数,该函数对“不良”排列的评分较低,但这会导致错误(请参见下文)。
cp_GA <- function(g, ratio = 0.2, maxiter = 1000, run = 40, pop = 200) {
library("igraph")
library("GA")
# ratio : ratio of the number of core/all vertices
# this is describing the desired size of the core group
# maxiter: max number of iterations for the GA
# run : max number of runs with the same fitness
# pop : population size for tha GA
# desired core size:
coresize <- round(vcount(g) * ratio, 0)
fitness_vertex_perm <- function(permutation) {
# this is the fitness function for the GA
# it calculates the density of the core with the current permutation
# the if-else structure prevents permutations with repetitions
if (sort(permutation) == c(1:vcount(g))) {
dens <- edge_density(
induced_subgraph(permute(g, as.numeric(permutation)), 1:coresize, impl =
"auto"))
} else {
dens <- 0
}
return(dens)
}
lowerlimit <- 1:vcount(g)
upperlimit <- vcount(g):1
hint <- order(degree(g), decreasing = TRUE)
maxfitness <- 1
GA <- ga(type = "permutation",
fitness = fitness_vertex_perm,
lower = lowerlimit,
upper = upperlimit,
maxiter = maxiter,
run = run,
maxFitness = maxfitness,
suggestions = hint,
popSize = pop
)
return(GA)
}
在健身功能上方的if else语句检查排列是否正确,但这会导致错误:
testresult <- cp_GA(g, ratio = 0.13, maxiter = 1000, run = 60, pop = 400)
Error in getComplete(control) :
argument "control" is missing, with no default
In addition: Warning message:
In if (sort(permutation) == c(1:vcount(g))) { :
Error in getComplete(control) :
argument "control" is missing, with no default
它不运行if-else,但是会产生排列结果,这对我没有用。
如何设置GA以生成正确的排列类型?
答案 0 :(得分:0)
现在看,您有两个实现方案:
1.GA选择机制。
2.无更换策略。
GA选择的理论是,当您拥有父选择时,您可以随机进行,而alao可以通过应用某种技术来做到这一点,您似乎已经完成了所需的操作。
没有替代的理论是,您必须将剩余人口数比以前减少一。
概率(新)= 1 /(概率(旧)-1)
因此,如果将循环部分中的总体上限调整为一,则可以实现结果。
希望这是您所需要的正确方向的提示。