selection_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package gago
  2. import (
  3. "testing"
  4. )
  5. var (
  6. validSelectors = []Selector{
  7. SelElitism{},
  8. SelTournament{3},
  9. SelRoulette{},
  10. }
  11. invalidSelectors = []Selector{
  12. SelTournament{0},
  13. SelTournament{-1},
  14. }
  15. )
  16. func TestSelectionSize(t *testing.T) {
  17. var (
  18. rng = newRandomNumberGenerator()
  19. indis = newIndividuals(30, NewVector, rng)
  20. selectors = []Selector{
  21. SelTournament{
  22. NContestants: 3,
  23. },
  24. SelElitism{},
  25. }
  26. )
  27. for _, selector := range selectors {
  28. for _, n := range []int{3, 10, 20} {
  29. var selected, _, _ = selector.Apply(n, indis, rng)
  30. if len(selected) != n {
  31. t.Error("Selector didn't select the expected number of individuals")
  32. }
  33. }
  34. }
  35. }
  36. func TestSelElitism(t *testing.T) {
  37. var (
  38. rng = newRandomNumberGenerator()
  39. indis = newIndividuals(30, NewVector, rng)
  40. selector = SelElitism{}
  41. )
  42. indis.Evaluate()
  43. for _, n := range []int{1, 2, 10, 30} {
  44. var _, indexes, _ = selector.Apply(n, indis, rng)
  45. for i, index := range indexes {
  46. if index != i {
  47. t.Error("SelElitism didn't select the expected individuals")
  48. }
  49. }
  50. }
  51. }
  52. func TestSelTournament(t *testing.T) {
  53. var (
  54. rng = newRandomNumberGenerator()
  55. indis = newIndividuals(30, NewVector, rng)
  56. )
  57. indis.Evaluate()
  58. var selected, _, _ = SelTournament{len(indis)}.Apply(1, indis, rng)
  59. if selected[0].Fitness != indis.FitMin() {
  60. t.Error("Full SelTournament didn't select the best individual")
  61. }
  62. }
  63. func TestBuildWheel(t *testing.T) {
  64. var testCases = []struct {
  65. fitnesses []float64
  66. weights []float64
  67. }{
  68. {[]float64{-10, -8, -5}, []float64{6.0 / 11, 10.0 / 11, 1}},
  69. {[]float64{-2, 0, 2, 3}, []float64{6.0 / 13, 10.0 / 13, 12.0 / 13, 1}},
  70. }
  71. for _, test := range testCases {
  72. var weights = buildWheel(test.fitnesses)
  73. for i := range weights {
  74. if weights[i] != test.weights[i] {
  75. t.Error("buildWheel didn't work as expected")
  76. }
  77. }
  78. }
  79. }
  80. func TestSelRoulette(t *testing.T) {
  81. var (
  82. rng = newRandomNumberGenerator()
  83. indis = newIndividuals(30, NewVector, rng)
  84. sel = SelRoulette{}
  85. )
  86. indis.Evaluate()
  87. for _, n := range []int{0, 1, 10, 30} {
  88. var selected, _, _ = sel.Apply(n, indis, rng)
  89. if len(selected) != n {
  90. t.Error("SelRoulette didn't select the right number of individuals")
  91. }
  92. }
  93. }
  94. // TestSelectorsValidate checks that each selector's Validate method doesn't
  95. // return an error in case of a valid model and that it does for invalid models.
  96. func TestSelectorsValidate(t *testing.T) {
  97. // Check valid selectors do not raise an error
  98. for _, sel := range validSelectors {
  99. if sel.Validate() != nil {
  100. t.Error("The selector validation should not have raised an error")
  101. }
  102. }
  103. // Check invalid selectors raise an error
  104. for _, sel := range invalidSelectors {
  105. if sel.Validate() == nil {
  106. t.Error("The selector validation should have raised error")
  107. }
  108. }
  109. }