models_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package gago
  2. import "testing"
  3. var (
  4. // Valid models
  5. validModels = []Model{
  6. ModGenerational{
  7. Selector: SelTournament{1},
  8. MutRate: 0.2,
  9. },
  10. ModSteadyState{
  11. Selector: SelTournament{1},
  12. KeepBest: false,
  13. MutRate: 0.2,
  14. },
  15. ModSteadyState{
  16. Selector: SelTournament{1},
  17. KeepBest: true,
  18. MutRate: 0.2,
  19. },
  20. ModDownToSize{
  21. NOffsprings: 5,
  22. SelectorA: SelTournament{1},
  23. SelectorB: SelElitism{},
  24. MutRate: 0.2,
  25. },
  26. ModRing{
  27. Selector: SelTournament{1},
  28. MutRate: 0.2,
  29. },
  30. ModSimAnn{
  31. T: 10,
  32. Tmin: 1,
  33. Alpha: 0.3,
  34. },
  35. ModMutationOnly{
  36. NChosen: 3,
  37. Selector: SelTournament{1},
  38. Strict: false,
  39. },
  40. ModMutationOnly{
  41. NChosen: 3,
  42. Selector: SelTournament{1},
  43. Strict: true,
  44. },
  45. }
  46. // Invalid models
  47. invalidModels = []Model{
  48. ModGenerational{
  49. Selector: nil,
  50. MutRate: 0.2,
  51. },
  52. ModGenerational{
  53. Selector: SelTournament{0},
  54. MutRate: 0.2,
  55. },
  56. ModGenerational{
  57. Selector: SelTournament{1},
  58. MutRate: -1,
  59. },
  60. ModSteadyState{
  61. Selector: nil,
  62. KeepBest: false,
  63. MutRate: 0.2,
  64. },
  65. ModSteadyState{
  66. Selector: SelTournament{0},
  67. KeepBest: true,
  68. MutRate: 0.2,
  69. },
  70. ModSteadyState{
  71. Selector: SelTournament{1},
  72. KeepBest: true,
  73. MutRate: -1,
  74. },
  75. ModDownToSize{
  76. NOffsprings: -1,
  77. SelectorA: SelTournament{1},
  78. SelectorB: SelElitism{},
  79. MutRate: 0.2,
  80. },
  81. ModDownToSize{
  82. NOffsprings: 5,
  83. SelectorA: nil,
  84. SelectorB: SelElitism{},
  85. MutRate: 0.2,
  86. },
  87. ModDownToSize{
  88. NOffsprings: 5,
  89. SelectorA: SelTournament{0},
  90. SelectorB: SelElitism{},
  91. MutRate: 0.2,
  92. },
  93. ModDownToSize{
  94. NOffsprings: 5,
  95. SelectorA: SelTournament{1},
  96. SelectorB: nil,
  97. MutRate: 0.2,
  98. },
  99. ModDownToSize{
  100. NOffsprings: 5,
  101. SelectorA: SelTournament{1},
  102. SelectorB: SelTournament{0},
  103. MutRate: 0.2,
  104. },
  105. ModDownToSize{
  106. NOffsprings: 5,
  107. SelectorA: SelTournament{1},
  108. SelectorB: SelElitism{},
  109. MutRate: -1,
  110. },
  111. ModRing{
  112. Selector: SelTournament{0},
  113. MutRate: 0.2,
  114. },
  115. ModRing{
  116. Selector: SelTournament{1},
  117. MutRate: -1,
  118. },
  119. ModSimAnn{
  120. T: 1,
  121. Tmin: 10,
  122. Alpha: 0.3,
  123. },
  124. ModSimAnn{
  125. T: 10,
  126. Tmin: -1,
  127. Alpha: 0.3,
  128. },
  129. ModSimAnn{
  130. T: 10,
  131. Tmin: 1,
  132. Alpha: -1,
  133. },
  134. ModMutationOnly{
  135. NChosen: -1,
  136. Selector: SelTournament{1},
  137. Strict: false,
  138. },
  139. ModMutationOnly{
  140. NChosen: 3,
  141. Selector: nil,
  142. Strict: false,
  143. },
  144. ModMutationOnly{
  145. NChosen: 3,
  146. Selector: SelTournament{0},
  147. Strict: false,
  148. },
  149. }
  150. )
  151. // TestGenerateOffsprings checks that GenerateOffsprings works as intended by
  152. // producing the desired number of offsprings.
  153. func TestGenerateOffsprings(t *testing.T) {
  154. var (
  155. rng = newRandomNumberGenerator()
  156. indis = newIndividuals(20, NewVector, rng)
  157. )
  158. for _, n := range []int{0, 1, 3, 10} {
  159. var offsprings, _ = generateOffsprings(n, indis, SelTournament{1}, rng)
  160. if len(offsprings) != n {
  161. t.Error("GenerateOffsprings didn't produce the expected number of offsprings")
  162. }
  163. }
  164. }
  165. // TestModelsValidate checks that each model's Validate method doesn't return
  166. // an error in case of a valid model and vice-versa
  167. func TestModelsValidate(t *testing.T) {
  168. // Check valid models do not raise an error
  169. for _, model := range validModels {
  170. if model.Validate() != nil {
  171. t.Error("The model validation should not have raised an error")
  172. }
  173. }
  174. // Check invalid models raise an error
  175. for _, model := range invalidModels {
  176. if model.Validate() == nil {
  177. t.Error("The model validation should have raised error")
  178. }
  179. }
  180. }
  181. // TestModelsConstantSize checks that each model doesn't change the size of a
  182. // population when applied.
  183. func TestModelsConstantSize(t *testing.T) {
  184. var rng = newRandomNumberGenerator()
  185. for _, n := range []int{1, 2, 3, 42} {
  186. for _, model := range validModels {
  187. var pop = newPopulation(n, NewVector, randString(3, rng))
  188. // Check the size of the population doesn't change for a few iterations
  189. for i := 0; i < 5; i++ {
  190. model.Apply(&pop)
  191. if len(pop.Individuals) != n {
  192. t.Error("A model application changed the population size")
  193. }
  194. }
  195. }
  196. }
  197. }