2016-04-13 26 views
0

'deki genetik algoritmalar için belirtildiği gibi değil R için genalg kitaplığı ile çalışıyorum ve bir ikili genel algoritma çalıştırdığımda tüm nesillerimi kaydetmeye çalışıyorum. Kütüphanede bunun için yerleşik bir metot var gibi görünmüyor, bu yüzden benim denemem, değerlendirme fonksiyonundan gelen her kromozomu, x'u kurtarmaktı.Neden gerçek üretim sayısı R

Bu yöntemi test etmek için, değerlendirilen tüm kromozomları görebilmek için değerlendirme işlevine print(x) eklemeye çalıştım. Bununla birlikte, basılı kromozomların sayısı her zaman şüphelendiğim şeyle uyuşmuyor.

Basılı kromozomların sayısının, nüfus büyüklüğünün yineleme sayısına eşit olacağına inanıyorum, ama her zaman denemek gibi görünmüyor.

sorun

Ben kromozomların sayısı iter kez popSize farklı olması durumunda söyleyemem hangi her kromozom ait olduğu nesil (veya yineleme) dan bilmek istiyorum olmasıdır.

Bunun nedeni nedir ve nasıl "nasıl düzeltebilirim". Ya da her kromozomu kurtarmanın başka bir yolu var mı? Aşağıda

her bir deneme (nesil) bir alt kümesi de gibi görünüyor, ben değerlendirme fonksiyonu 2x5 kromozom yazdırmak düşündüm bir örnek, ama yalnızca işlev kodu baktığımızda 8.

library(genalg) 
library(ggplot2) 

dataset <- data.frame(
    item = c("pocketknife", "beans", "potatoes", "unions", "sleeping bag", "rope", "compass"), 
    survivalpoints = c(10, 20, 15, 2, 30, 10, 30), 
    weight = c(1, 5, 10, 1, 7, 5, 1)) 

weightlimit <- 20 

evalFunc <- function(x) { 

    print(x) 

    current_solution_survivalpoints <- x %*% dataset$survivalpoints 
    current_solution_weight <- x %*% dataset$weight 

    if (current_solution_weight > weightlimit) 
     return(0) else return(-current_solution_survivalpoints 
} 


iter = 2 
popSize = 5 
set.seed(1) 
GAmodel <- rbga.bin(size = 7, popSize = popSize, iters = iter, mutationChance = 0.1,elitism = T, evalFunc = evalFunc) 

cevap

1

yazdırır Kromozomlar, belirli bir olasılıkla (sizin durumunuzda 0.1) ve mutasyona uğramış popülasyondan (örnekte popülasyon = 5 kromozomları) seçilmiştir. Değerlendirme fonksiyonu sadece her jenerasyonda mutasyona uğramış kromozomlar için çağrılır (ve tabii ki ilk iterasyondaki tüm kromozomlar için başlangıç ​​değerlerini bilmek). Bu alt küme sizin örnekte Eğer büyük 1 elemanı (eğer yanlışlıkla elitism=TRUE geçti ve DOĞRU örtülü 1 dönüştürülür) olarak tanımladık Seçkinciler grubunu içermez

Not. Her bir nesilde nüfusu tanımak için, monitorFun parametresi aracılığıyla bir monitör işlevini örn. :

# obj contains a lot of informations, try to print it 
monitor <- function(obj) { 
    print(paste(" GENERATION :", obj$iter)) 
    print("POPULATION:") 
    print(obj$population) 
    print("VALUES:") 
    print(obj$evaluations) 
} 

iter = 2 
popSize = 5 
set.seed(1) 
GAmodel <- rbga.bin(size = 7, popSize = popSize, 
        iters = iter, mutationChance = 0.1, 
        elitism = 1, evalFunc = evalFunc, monitorFunc = monitor) 
+0

Çok teşekkürler. Tam olarak aradığım şey buydu. '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' (GAmodel) ''i çalıştırdığımda görebildiğim nesneler mi yoksa daha fazlası mı var – Christoffer

+0

@Christoffer: Sanırım bu, sonuç nesnesinin aynı tür ve özelliklerine sahip bir nesne (temel olarak izleme işlevi her yinelemenin çıktısını gösterir) – digEmAll

+0

@ Christoffer: yine de yazdırmaya çalışın;) – digEmAll

İlgili konular