// SetFloat returns the float corresponding to gene 'i' // igene -- is the index of gene/float in [0, Nfltgenes] func (o *Individual) SetFloat(igene int, x float64) { if o.Nbases > 1 { values := make([]float64, o.Nbases) rnd.Float64s(values, 0, 1) sum := la.VecAccum(values) for j := 0; j < o.Nbases; j++ { o.Floats[igene*o.Nbases+j] = x * values[j] / sum } return } o.Floats[igene] = x }
// SimpleChromo splits 'genes' into 'nbases' unequal parts // Input: // genes -- a slice whose size equals to the number of genes // nbases -- number of bases used to split 'genes' // Output: // chromo -- the chromosome // // Example: // // genes = [0, 1, 2, ... nbases-1, 0, 1, 2, ... nbases-1] // \___________________/ \___________________/ // gene # 0 gene # 1 // func SimpleChromo(genes []float64, nbases int) (chromo []float64) { ngenes := len(genes) chromo = make([]float64, ngenes*nbases) values := make([]float64, nbases) var sumv float64 for i, g := range genes { rnd.Float64s(values, 0, 1) sumv = la.VecAccum(values) for j := 0; j < nbases; j++ { chromo[i*nbases+j] = g * values[j] / sumv } } return }