遗传算法,无需重复

时间:2019-01-31 13:54:37

标签: r igraph genetic-algorithm

我正在编写一种遗传算法(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以生成正确的排列类型?

1 个答案:

答案 0 :(得分:0)

现在看,您有两个实现方案: 1.GA选择机制。 2.无更换策略。 GA选择的理论是,当您拥有父选择时,您可以随机进行,而alao可以通过应用某种技术来做到这一点,您似乎已经完成了所需的操作。
没有替代的理论是,您必须将剩余人口数比以前减少一。 概率(新)= 1 /(概率(旧)-1) 因此,如果将循环部分中的总体上限调整为一,则可以实现结果。

希望这是您所需要的正确方向的提示。