Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require(GA)
- require(globalOptTests)
- #### Wykorzystywane funkcje: Bohachevsky2, GoldPrice, Branin
- function_name = "Bohachevsky2"
- #### Liczba serii
- series_amount = c(1,2,3,4)
- #### Liczba iteracji dla usredniania wynikow
- for_avg_iterations = 15
- #### Rozmiar populacji
- population_size = c(5, 25, 50, 100, 125, 150, 175, 200)
- population_size_default = 50
- #### Liczba generacji
- generation_size = c(5, 25, 50, 100, 125, 150, 175, 200)
- generation_size_default = 100
- #### Selekcja elitarna
- elitism_range = seq(0, 1, by = 0.05)
- elitism_default = 0.05
- #### Prawdopodobienstwo krzyzowania
- pcrossover_range = seq(0, 1, by = 0.1)
- pcrossover_default = c(0,1,0,1)
- #### Prawdopodobienstwo mutacji
- pmutation_range = seq(0, 1, by = 0.1)
- pmutation_default =c(0,0,1,1)
- #### Funkcja zwracajaca przedzial zmiennych
- get_bounds <- function(p.n) {
- return(seq(getDefaultBounds(function_name)$lower[p.n], getDefaultBounds(function_name)$upper[p.n],length.out = 100))
- }
- #### Funkcja zwracajaca wartość funkcji z globalOptTests
- fun <- function(x1, x2) {
- # Oblicz wartość funkcji o zadanej nazwie
- result <- goTest(c(x1, x2), function_name, TRUE)
- return(result)
- }
- get_max_value_from_series <- function(result_values_in_series) {
- max_range_val<-0
- for(result_vector_idx in series_amount){
- for(val in result_values_in_series[result_vector_idx,1]){
- max_vector_val = max(val)
- if(max_vector_val>max_range_val){
- max_range_val = max_vector_val
- }
- }
- }
- return (max_range_val+max_range_val*4/10)
- }
- #### Obliczenie zakresu zmiennych
- x1_range <- get_bounds(1)
- x2_range <- get_bounds(2)
- #### Oblicz wartosci funkcji do wykresu
- f <- outer(x1_range, x2_range, Vectorize(fun))
- #### Narysuj wykres 3D
- persp3D(x1_range, x2_range, f, theta = -45, phi = 25,
- nlevel = 36, shade = 0.33,
- color.palette = jet.colors,
- xlab = "x1",
- ylab = "x2",
- zlab = "f(x1, x2)")
- #### Przebieg algorytmu dla wartości domyślnych
- generic_alghoritm <- ga(type = "real-valued",
- fitness = function(x) - fun(x[1], x[2]),
- min = c(getDefaultBounds(function_name)$lower[1],
- getDefaultBounds(function_name)$lower[2]),
- max = c(getDefaultBounds(function_name)$upper[1],
- getDefaultBounds(function_name)$upper[2]),
- popSize = population_size_default, maxiter = generation_size_default,
- pmutation = pmutation_default, pcrossover = pcrossover_default,
- elitism = elitism_default)
- #### Podsumowanie i wykres
- summary(generic_alghoritm)
- plot(generic_alghoritm)
- # Wykres konturowy
- filled.contour(x1_range, x2_range, f, color.palette = jet.colors,
- plot.axes = {
- axis(1); axis(2);
- points(generic_alghoritm@solution[,1], generic_alghoritm@solution[,2],
- pch = 3, cex = 2, col = "white", lwd = 2)
- }
- )
- #### Funkcja usredniajaca wyniki zadana ilosc razy
- avg <- function(p.popSize, p.maxiter, p.pmutation,
- p.pcrossover, p.elitism) {
- # Suma rozwiazan
- solution = 0
- result.generic_alghoritm <- NULL
- for (i in seq(1, for_avg_iterations, by = 1)) {
- result.generic_alghoritm <- ga(type = "real-valued",
- fitness = function(x)
- -fun(x[1], x[2]),
- min = c(getDefaultBounds(function_name)$lower[1],
- getDefaultBounds(function_name)$lower[2]),
- max = c(getDefaultBounds(function_name)$upper[1],
- getDefaultBounds(function_name)$upper[2]),
- popSize = p.popSize,
- maxiter = p.maxiter,
- pmutation = p.pmutation,
- pcrossover = p.pcrossover,
- elitism = p.elitism)
- solution = solution + fun(result.generic_alghoritm@solution[,1],
- result.generic_alghoritm@solution[,2])
- }
- #### Zwroc usrednione rozwiazanie
- return(solution / for_avg_iterations)
- }
- #### Badanie GA przy zmiennej populacji
- results.popSize.series <- as.list(numeric(4*1))
- dim(results.popSize.series) <- c(4,1)
- for(s in series_amount){
- results.popSize <- NULL
- for (j in population_size) {
- results.popSize <- c(results.popSize,
- avg(j, generation_size_default, pmutation_default[s],
- pcrossover_default[s], elitism_default))
- }
- results.popSize.series[[s,1]] <- results.popSize
- }
- #### Rysunek dla badanie GA przy zmiennej populacji
- a = data.frame(x = population_size, f = results.popSize.series[[1,1]])
- plot(a, ylim = c(getGlobalOpt(function_name), get_max_value_from_series(results.popSize.series)),
- yaxs="r", xaxs="r", type="o", col="blue",
- main="Wykres wartości funkcji dla zmieniającego się rozmiaru populacji",
- xlab="Rozmiar populacji", ylab="Wartość funkcji")
- abline(getGlobalOpt(function_name), 0, col = "green")
- lines(population_size, results.popSize.series[[2,1]], col = "red")
- points(population_size, results.popSize.series[[2,1]], col = "red")
- lines(population_size, results.popSize.series[[3,1]], col = "grey")
- points(population_size, results.popSize.series[[3,1]], col = "grey")
- lines(population_size, results.popSize.series[[4,1]], col = "steelblue")
- points(population_size, results.popSize.series[[4,1]], col = "steelblue")
- legend( x="topleft",
- legend=c("S1: krz=0, mut=0","S2: krz=1, mut=0","S3: krz=0, mut=1","S4: krz=1, mut=1"),
- col=c("red","green","grey","steelblue"), lwd=1, lty=1,
- pch=c(NA,NA) )
- #### Testy liczby generacji
- results.maxiter.series <- as.list(numeric(4*1))
- dim(results.maxiter.series) <- c(4,1)
- for(s in series_amount){
- results.maxiter <- NULL
- for (j in generation_size) {
- results.maxiter <- c(results.maxiter,
- avg(population_size_default, j, pmutation_default[s],
- pcrossover_default[s], elitism_default))
- }
- results.maxiter.series[[s,1]] <- results.maxiter
- }
- #### Wykres dla paramatru: liczba generacji
- b = data.frame(x = generation_size, f = results.maxIter.series[[1,1]])
- plot(b, ylim = c(getGlobalOpt(function_name), get_max_value_from_series(results.maxIter.series)),
- yaxs="r", xaxs="r", type="o", col="blue",
- main="Wykres wartości funkcji dla zmieniającej się liczby generacji",
- xlab="Liczba generacji", ylab="Wartość funkcji")
- abline(getGlobalOpt(function_name), 0, col = "green")
- lines(generation_size, results.maxIter.series[[2,1]], col = "red")
- points(generation_size, results.maxIter.series[[2,1]], col = "red")
- lines(generation_size, results.maxIter.series[[3,1]], col = "grey")
- points(generation_size, results.maxIter.series[[3,1]], col = "grey")
- lines(generation_size, results.maxIter.series[[4,1]], col = "steelblue")
- points(generation_size, results.maxIter.series[[4,1]], col = "steelblue")
- legend( x="topleft",
- legend=c("S1: krz=0, mut=0","S2: krz=1, mut=0","S3: krz=0, mut=1","S4: krz=1, mut=1"),
- col=c("red","green","grey","steelblue"), lwd=1, lty=1,
- pch=c(NA,NA))
- #### Testy prawd. mutacji
- results.pmutation.series <- as.list(numeric(4*1))
- dim(results.pmutation.series) <- c(4,1)
- for(s in series_amount){
- results.pmutation <- NULL
- for (j in pmutation_range) {
- results.pmutation <- c(results.pmutation,
- avg(population_size_default, generation_size_default, j,
- pcrossover_default[s], elitism_default))
- }
- results.pmutation.series[[s,1]] <- results.pmutation
- }
- #### Wykres dla paramatru: prawd. mutacji
- c = data.frame(x = pmutation_range, f = results.pmutation.series[[1,1]])
- plot(c, ylim = c(getGlobalOpt(function_name), get_max_value_from_series(results.pmutation.series)),
- yaxs="r", xaxs="r", type="o", col="blue",
- main="Wykres wartości funkcji dla zmieniającego się prawd. mutacji",
- xlab="Prawd. mutacji", ylab="Wartość funkcji")
- abline(getGlobalOpt(function_name), 0, col = "green")
- lines(pmutation_range, results.pmutation.series[[2,1]], col = "red")
- points(pmutation_range, results.pmutation.series[[2,1]], col = "red")
- lines(pmutation_range, results.pmutation.series[[3,1]], col = "grey")
- points(pmutation_range, results.pmutation.series[[3,1]], col = "grey")
- lines(pmutation_range, results.pmutation.series[[4,1]], col = "steelblue")
- points(pmutation_range, results.pmutation.series[[4,1]], col = "steelblue")
- legend( x="topleft",
- legend=c("S1: krz=0, mut=0","S2: krz=1, mut=0","S3: krz=0, mut=1","S4: krz=1, mut=1"),
- col=c("red","green","grey","steelblue"), lwd=1, lty=1,
- pch=c(NA,NA) )
- #### Testy prawd. krzyzowania
- results.pcrossover.series <- as.list(numeric(4*1))
- dim(results.pcrossover.series) <- c(4,1)
- for(s in series_amount){
- results.pcrossover <- NULL
- for (j in pcrossover_range) {
- results.pcrossover <- c(results.pcrossover,
- avg(population_size_default, generation_size_default, pmutation_default[s],
- j, elitism_default))
- }
- results.pcrossover.series[[s,1]] <- results.pcrossover
- }
- #### Wykres dla paramatru: prawd. krzyzowania
- d = data.frame(x = pcrossover_range, f = results.pcrossover.series[[1,1]])
- plot(d, ylim = c(getGlobalOpt(function_name), get_max_value_from_series(results.pcrossover.series)),
- yaxs="r", xaxs="r", type="o", col="blue",
- main="Wykres wartości funkcji dla zmieniającego się prawd. krzyżowania",
- xlab="Prawd. krzyżowania", ylab="Wartość funkcji")
- abline(getGlobalOpt(function_name), 0, col = "green")
- lines(pcrossover_range, results.pcrossover.series[[2,1]], col = "red")
- points(pcrossover_range, results.pcrossover.series[[2,1]], col = "red")
- lines(pcrossover_range, results.pcrossover.series[[3,1]], col = "gray")
- points(pcrossover_range, results.pcrossover.series[[3,1]], col = "gray")
- lines(pcrossover_range, results.pcrossover.series[[4,1]], col = "steelblue")
- points(pcrossover_range, results.pcrossover.series[[4,1]], col = "steelblue")
- legend( x="topleft",
- legend=c("S1: krz=0, mut=0","S2: krz=1, mut=0","S3: krz=0, mut=1","S4: krz=1, mut=1"),
- col=c("red","green","grey","steelblue"), lwd=1, lty=1,
- pch=c(NA,NA) )
- #### Testy selekcji elitarnej
- results.elitism.series <- as.list(numeric(4*1))
- dim(results.elitism.series) <- c(4,1)
- for(s in series_amount){
- results.elitism <- NULL
- for (j in elitism_range) {
- results.elitism <- c(results.elitism,
- avg(population_size_default, generation_size_default, pmutation_default[s],
- pcrossover_default[s], j))
- }
- results.elitism.series[[s,1]] <- results.elitism
- }
- #### Wykres dla paramatru: selekcja elitarna
- e = data.frame(x = elitism_range, f = results.elitism.series[[1,1]])
- plot(e, ylim = c(getGlobalOpt(function_name), get_max_value_from_series(results.elitism.series)),
- yaxs="r", xaxs="r", type="o", col="blue",
- main="Wykres wartości funkcji dla zmieniającej się selekcji elitarnej",
- xlab="Elityzm", ylab="Wartość funkcji")
- abline(getGlobalOpt(function_name), 0, col = "green")
- lines(elitism_range, results.elitism.series[[2,1]], col = "red")
- points(elitism_range, results.elitism.series[[2,1]], col = "red")
- lines(elitism_range, results.elitism.series[[3,1]], col = "grey")
- points(elitism_range, results.elitism.series[[3,1]], col = "grey")
- lines(elitism_range, results.elitism.series[[4,1]], col = "steelblue")
- points(elitism_range, results.elitism.series[[4,1]], col = "steelblue")
- legend( x="topleft",
- legend=c("S1: krz=0, mut=0","S2: krz=1, mut=0","S3: krz=0, mut=1","S4: krz=1, mut=1"),
- col=c("red","green","grey","steelblue"), lwd=1, lty=1,
- pch=c(NA,NA))
- #### Testy selekcji elitarnej dla zmiennego prawdopodobienstwa mutacji i krzyzowania
- temp <- NULL
- for (j in pmutation_range) {
- for (k in pcrossover_range) {
- temp <- c(temp, avg(population_size_default, generation_size_default, j, k, 0))
- }
- }
- results.mutation.crossing <- matrix(temp, nrow = length(pcrossover_range), ncol = length(pmutation_range))
- filled.contour(pmutation_range, pmutation_range, results.mutation.crossing, color.palette = jet.colors,
- plot.title = title(main = "Wykres cieplny dla zmiennych \nprawdopodobieństw mutacji i krzyżowania",
- xlab = "prawdopodobieństwo krzyżowania", ylab = "prawdopodobieństwo mutacji"))
- #### Testy selekcji elitarnej dla zmiennego prawdopodobienstwa mutacji i krzyzowania
- temp <- NULL
- for (j in population_size) {
- for (k in generation_size) {
- temp <- c(temp, avg(j, k, 0.1, 0.1, 0))
- }
- }
- results.mutation.crossing2 <- matrix(temp, nrow = length(generation_size), ncol = length(population_size))
- filled.contour(generation_size, population_size, results.mutation.crossing2, color.palette = jet.colors,
- plot.title = title(main = "Wykres cieplny dla zmiennych \nwielkosci populacji i ilosci generacji",
- xlab = "ilosc generacji", ylab = "wielkosc populacji"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement