individuals_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package gago
  2. import (
  3. "math"
  4. "testing"
  5. )
  6. func TestNewIndividuals(t *testing.T) {
  7. var rng = newRandomNumberGenerator()
  8. for _, n := range []int{1, 2, 42} {
  9. var indis = newIndividuals(n, NewVector, rng)
  10. if len(indis) != n {
  11. t.Error("newIndividuals didn't generate the right number of individuals")
  12. }
  13. }
  14. }
  15. func TestCloneIndividuals(t *testing.T) {
  16. var (
  17. rng = newRandomNumberGenerator()
  18. indis = newIndividuals(20, NewVector, rng)
  19. clones = indis.Clone(rng)
  20. )
  21. for _, indi := range indis {
  22. for _, clone := range clones {
  23. if &indi == &clone || indi.ID == clone.ID {
  24. t.Error("Cloning did not work as expected")
  25. }
  26. }
  27. }
  28. }
  29. func TestEvaluateIndividuals(t *testing.T) {
  30. var indis = newIndividuals(10, NewVector, newRandomNumberGenerator())
  31. for _, indi := range indis {
  32. if indi.Evaluated {
  33. t.Error("Individual shouldn't have Evaluated set to True")
  34. }
  35. }
  36. indis.Evaluate()
  37. for _, indi := range indis {
  38. if !indi.Evaluated {
  39. t.Error("Individual should have Evaluated set to True")
  40. }
  41. }
  42. }
  43. func TestMutateIndividuals(t *testing.T) {
  44. var (
  45. rng = newRandomNumberGenerator()
  46. indis = newIndividuals(10, NewVector, rng)
  47. )
  48. indis.Evaluate()
  49. indis.Mutate(1, rng)
  50. for _, indi := range indis {
  51. if indi.Evaluated {
  52. t.Error("Individual shouldn't have Evaluated set to True")
  53. }
  54. }
  55. }
  56. func TestIndividualsSortByFitness(t *testing.T) {
  57. var indis = newIndividuals(10, NewVector, newRandomNumberGenerator())
  58. // Assign a fitness to each individual in decreasing order
  59. for i := range indis {
  60. indis[i].Fitness = float64(len(indis) - i)
  61. }
  62. indis.SortByFitness()
  63. // Check fitnesses are in increasing order
  64. for i := 1; i < len(indis); i++ {
  65. if indis[i-1].Fitness > indis[i].Fitness {
  66. t.Error("Individuals are not sorted")
  67. }
  68. }
  69. }
  70. func TestGetFitnesses(t *testing.T) {
  71. var (
  72. indis = Individuals{
  73. Individual{Fitness: 0.0},
  74. Individual{Fitness: 1.0},
  75. Individual{Fitness: 2.0},
  76. }
  77. target = []float64{0.0, 1.0, 2.0}
  78. fitnesses = indis.getFitnesses()
  79. )
  80. for i, fitness := range fitnesses {
  81. if fitness != target[i] {
  82. t.Error("getFitnesses didn't work as expected")
  83. }
  84. }
  85. }
  86. func TestFitMin(t *testing.T) {
  87. var testCases = []struct {
  88. indis Individuals
  89. min float64
  90. }{
  91. {Individuals{
  92. Individual{Fitness: 1.0},
  93. }, 1.0},
  94. {Individuals{
  95. Individual{Fitness: 2.0},
  96. Individual{Fitness: 1.0},
  97. }, 1.0},
  98. {Individuals{
  99. Individual{Fitness: 1.0},
  100. Individual{Fitness: -1.0},
  101. }, -1.0},
  102. }
  103. for _, test := range testCases {
  104. if test.indis.FitMin() != test.min {
  105. t.Error("FitMin didn't work as expected")
  106. }
  107. }
  108. }
  109. func TestFitMax(t *testing.T) {
  110. var testCases = []struct {
  111. indis Individuals
  112. max float64
  113. }{
  114. {Individuals{
  115. Individual{Fitness: 1.0},
  116. }, 1.0},
  117. {Individuals{
  118. Individual{Fitness: 2.0},
  119. Individual{Fitness: 1.0},
  120. }, 2.0},
  121. {Individuals{
  122. Individual{Fitness: 1.0},
  123. Individual{Fitness: -1.0},
  124. }, 1.0},
  125. }
  126. for _, test := range testCases {
  127. if test.indis.FitMax() != test.max {
  128. t.Error("FitMax didn't work as expected")
  129. }
  130. }
  131. }
  132. func TestFitAvg(t *testing.T) {
  133. var testCases = []struct {
  134. indis Individuals
  135. mean float64
  136. }{
  137. {Individuals{
  138. Individual{Fitness: 1.0},
  139. }, 1.0},
  140. {Individuals{
  141. Individual{Fitness: 1.0},
  142. Individual{Fitness: 2.0},
  143. }, 1.5},
  144. {Individuals{
  145. Individual{Fitness: -1.0},
  146. Individual{Fitness: 1.0},
  147. }, 0.0},
  148. }
  149. for _, test := range testCases {
  150. if test.indis.FitAvg() != test.mean {
  151. t.Error("FitAvg didn't work as expected")
  152. }
  153. }
  154. }
  155. func TestFitStd(t *testing.T) {
  156. var testCases = []struct {
  157. indis Individuals
  158. variance float64
  159. }{
  160. {Individuals{
  161. Individual{Fitness: 1.0},
  162. }, 0.0},
  163. {Individuals{
  164. Individual{Fitness: -1.0},
  165. Individual{Fitness: 1.0},
  166. }, 1.0},
  167. {Individuals{
  168. Individual{Fitness: -2.0},
  169. Individual{Fitness: 2.0},
  170. }, 4.0},
  171. }
  172. for _, test := range testCases {
  173. if test.indis.FitStd() != math.Sqrt(test.variance) {
  174. t.Error("FitStd didn't work as expected")
  175. }
  176. }
  177. }