123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- package gago
- import (
- "testing"
- )
- var (
- validSelectors = []Selector{
- SelElitism{},
- SelTournament{3},
- SelRoulette{},
- }
- invalidSelectors = []Selector{
- SelTournament{0},
- SelTournament{-1},
- }
- )
- func TestSelectionSize(t *testing.T) {
- var (
- rng = newRandomNumberGenerator()
- indis = newIndividuals(30, NewVector, rng)
- selectors = []Selector{
- SelTournament{
- NContestants: 3,
- },
- SelElitism{},
- }
- )
- for _, selector := range selectors {
- for _, n := range []int{3, 10, 20} {
- var selected, _, _ = selector.Apply(n, indis, rng)
- if len(selected) != n {
- t.Error("Selector didn't select the expected number of individuals")
- }
- }
- }
- }
- func TestSelElitism(t *testing.T) {
- var (
- rng = newRandomNumberGenerator()
- indis = newIndividuals(30, NewVector, rng)
- selector = SelElitism{}
- )
- indis.Evaluate()
- for _, n := range []int{1, 2, 10, 30} {
- var _, indexes, _ = selector.Apply(n, indis, rng)
- for i, index := range indexes {
- if index != i {
- t.Error("SelElitism didn't select the expected individuals")
- }
- }
- }
- }
- func TestSelTournament(t *testing.T) {
- var (
- rng = newRandomNumberGenerator()
- indis = newIndividuals(30, NewVector, rng)
- )
- indis.Evaluate()
- var selected, _, _ = SelTournament{len(indis)}.Apply(1, indis, rng)
- if selected[0].Fitness != indis.FitMin() {
- t.Error("Full SelTournament didn't select the best individual")
- }
- }
- func TestBuildWheel(t *testing.T) {
- var testCases = []struct {
- fitnesses []float64
- weights []float64
- }{
- {[]float64{-10, -8, -5}, []float64{6.0 / 11, 10.0 / 11, 1}},
- {[]float64{-2, 0, 2, 3}, []float64{6.0 / 13, 10.0 / 13, 12.0 / 13, 1}},
- }
- for _, test := range testCases {
- var weights = buildWheel(test.fitnesses)
- for i := range weights {
- if weights[i] != test.weights[i] {
- t.Error("buildWheel didn't work as expected")
- }
- }
- }
- }
- func TestSelRoulette(t *testing.T) {
- var (
- rng = newRandomNumberGenerator()
- indis = newIndividuals(30, NewVector, rng)
- sel = SelRoulette{}
- )
- indis.Evaluate()
- for _, n := range []int{0, 1, 10, 30} {
- var selected, _, _ = sel.Apply(n, indis, rng)
- if len(selected) != n {
- t.Error("SelRoulette didn't select the right number of individuals")
- }
- }
- }
- // TestSelectorsValidate checks that each selector's Validate method doesn't
- // return an error in case of a valid model and that it does for invalid models.
- func TestSelectorsValidate(t *testing.T) {
- // Check valid selectors do not raise an error
- for _, sel := range validSelectors {
- if sel.Validate() != nil {
- t.Error("The selector validation should not have raised an error")
- }
- }
- // Check invalid selectors raise an error
- for _, sel := range invalidSelectors {
- if sel.Validate() == nil {
- t.Error("The selector validation should have raised error")
- }
- }
- }
|