在 GA 中绘制最小化图

Plotting minimization graph in GA

GA 包最大化了自然界中的适应度函数。我知道对于使用 GA 的最小化问题,您需要在适应度函数中将适应度乘以 -1。

##calling the ga() function
my_ga <- ga(...)

在为最小化问题绘制图形 (plot(my_ga)) 时,我得到了一个显示最大化模式的图形:

我试图通过改变 plot() 中的 ylim 来反转 y 轴,我得到了这个(这是我想要的,负 y 轴除外):

## explicitly defining the y-axis
x <- seq(1.1,1.4, 0.05)
plot(my_ga, ylim=rev(range(-x)))

但我发现这种方法根本没有效率,有没有更快的方法 - 将 y 轴更改为正值并隐式确定范围,使用 GA 包绘制最小化图?

顺便说一句,忽略这个例子中收敛不好的地方

[编辑] - 添加源代码

library(clusterSim)
library(GA)

## data
data(data_ratio)
dataset2 <- data_ratio

## fitness function
DBI2 <- function(x) {
        cl <- kmeans(dataset2, centers = dataset2[x==1, ])
        dbi <- index.DB(dataset2, cl=cl$cluster, centrotypes = "centroids")
        score <- -dbi$DB  

        return(score)  

}

k_min <- 5

## initialization of populaton
initial_population <- function(object) {
        init <- t(replicate(object@popSize, sample(rep(c(1, 0), c(k_min, object@nBits - k_min))), TRUE))
        return(init)
}

## mutation operator
my_mutation <- function(object, parent){

        pop <- parent <- as.vector(object@population[parent, ])
        difference <- abs(sum(pop) - k_min)
        ## checking condition where there are more cluster being turned on than k_min
        if(sum(pop) > k_min){
                ## determine position of 1's
                bit_position_1 <- sample(which(pop==1), difference)
                ## bit inversion
                for(i in 1:length(bit_position_1)){
                        pop[bit_position_1[i]] <- abs(pop[bit_position_1[i]] - 1)
                } 
        } else if (sum(pop) < k_min){
                ## determine position of 0's
                bit_position_0 <- sample(which(pop==0), difference)
                ## bit inversion
                for(i in 1:length(bit_position_0)){
                        pop[bit_position_0[i]] <- abs(pop[bit_position_0[i]] - 1)
                }

        } 

        return(pop)
}

my_ga<- ga(type = "binary", 
        population = initial_population, 
        fitness = DBI2, 
        selection = ga_rwSelection,
        crossover = gabin_spCrossover,
        mutation = my_mutation,
        pcrossover = 0.8,
        pmutation = 1.0,
        popSize = 100, 
        maxiter = 100,
        seed = 212,
        nBits = nrow(dataset2))


plot(my_ga)

好吧,我们可以通过翻转对象本身中数据的符号来作弊。这是一个帮助函数来做到这一点

flip_ga_y <- function(x) {
    x@summary <- x@summary*-1
    x
}

然后你可以像这样绘制你的样本数据

plot(flip_ga_y(my_ga), ylim=c(1.1,1.4))

请注意,您必须指定 ylim,因为该函数对它看起来的标志方向做出了一些强有力的选择。但是这个returns