sumosim
Simulator for sumo robots. Main focus is the development of advanced controller strategies by the means of a genetic algorithm
Tuesday, November 25, 2014
Sumosim uses ScalaJS
Because of all the problems I had using Java-Webstart (Signing makes only sense with certified keys) I switched to ScalaJS. Explore the examples at the Sumosim Homepage if you want to find out how it works.
Wednesday, October 29, 2014
Tuesday, October 21, 2014
Sourcecode
The Sourcecode for sumosim can be found in https://entelijan.net/svn/javaprj/scala/robot/
Monday, October 22, 2012
Results of Breeding
Changing some parameters of the base configuration, and running sessions on that configurations, led to the following results.
Meaning of the columns in the following table:
1. Configuration
2. Session ID
3. Qualification
4 - 11. Generation of the session
The configurations mean:
base: The base configuration
crossoverProb05: Set crossover probability to 5%
crossoverProb09: Set crossover probability to 9%
decMutationProb10: Decreased mutation probablity to 10%
evaluateElite: Use elite selection strategy
grammarRuleFourRules: Generate always 4 rules
grammarRuleThreeRules: Generte always 3 rules
grammarRuleTwoRules: Generate akways 2 rules
incMaxWrapTo5: Increase max wrap to 5
incMutationProb10: Increase mutation probability to 10%
maxDepth15: Set max depth to 15
nodal: Use a nodal mutation strategy
nodalMaxDerivationTreeDepth1: Use a nodal mutation strategy with derivation tree depth of 1
nodalMaxDerivationTreeDepth10: Use a nodal mutation strategy with derivation tree depth of 10
nodalMaxDerivationTreeDepth2: Use a nodal mutation strategy with derivation tree depth of 2
populationSize40: Popuöation size 40
Meaning of the columns in the following table:
1. Configuration
2. Session ID
3. Qualification
4 - 11. Generation of the session
The configurations mean:
base: The base configuration
crossoverProb05: Set crossover probability to 5%
crossoverProb09: Set crossover probability to 9%
decMutationProb10: Decreased mutation probablity to 10%
evaluateElite: Use elite selection strategy
grammarRuleFourRules: Generate always 4 rules
grammarRuleThreeRules: Generte always 3 rules
grammarRuleTwoRules: Generate akways 2 rules
incMaxWrapTo5: Increase max wrap to 5
incMutationProb10: Increase mutation probability to 10%
maxDepth15: Set max depth to 15
nodal: Use a nodal mutation strategy
nodalMaxDerivationTreeDepth1: Use a nodal mutation strategy with derivation tree depth of 1
nodalMaxDerivationTreeDepth10: Use a nodal mutation strategy with derivation tree depth of 10
nodalMaxDerivationTreeDepth2: Use a nodal mutation strategy with derivation tree depth of 2
populationSize40: Popuöation size 40
base | 20120619-194512 | 92,3 31,5 4,1 3,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | ||
20120612-210623 | 97,3 46,8 6,5 5,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120615-192525 | 29,9 29,9 7,0 7,0 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
20120613-104221 | 47,3 24,4 8,9 7,0 | 1 | 10 | 25 | 50 | 100 | 200 | ||||
20120615-210453 | 48,4 19,4 12,3 8,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
20120611-102707 | 39,7 18,3 11,9 8,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120611-184956 | 45,0 23,5 18,7 9,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120613-185311 | 93,7 47,5 13,9 9,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120612-093946 | 48,2 19,4 13,9 9,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120610-233627 | 32,7 19,3 12,2 10,7 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120614-103322 | 32,5 14,1 11,0 11,0 | 1 | 10 | 25 | 50 | 100 | 200 | ||||
20120614-195730 | 23,3 18,3 - 11,9 | 1 | 10 | 25 | 50 | 100 | |||||
20120611-190036 | 395,5 24,4 16,3 12,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
20120610-094257 | 90,4 23,5 13,8 12,2 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120609-102738 | 89,9 32,6 12,2 12,2 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120615-174629 | 226,5 38,7 16,2 12,3 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120609-171239 | 276,8 30,9 15,6 13,5 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120608-233350 | 4446,2 97,3 15,9 13,7 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120610-002640 | 47,8 24,1 19,4 13,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120610-175412 | 248,6 32,6 14,0 14,0 | 1 | 10 | 25 | 50 | 100 | 200 | ||||
20120609-234659 | 23,8 16,1 - 16,1 | 1 | 10 | 25 | 50 | 100 | |||||
20120608-192518 | 1195,5 46,5 19,4 16,2 | 1 | 10 | 25 | 50 | 100 | 200 | ||||
20120613-084231 | 97,2 76,4 29,7 28,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
crossoverProb05 | 20120717-112701 | 15,8 12,1 8,2 7,0 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | |
20120713-104221 | 30,5 30,2 15,7 13,5 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
crossoverProb09 | 20120713-104225 | 191,6 23,6 10,9 8,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | |
20120717-112706 | 987,1 91,4 18,6 15,3 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
decMutationProb10 | 20120615-210453 | 2340,6 807,8 8,9 5,2 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 |
20120615-174629 | 236,9 14,0 9,0 6,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120615-192525 | 32,3 16,1 9,8 7,5 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
20120705-222411 | 1585,1 42,0 18,9 7,5 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120703-221154 | 47,9 16,2 12,2 7,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120702-081329 | 24,2 19,6 12,3 9,0 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120614-195730 | 97,2 23,1 - 9,8 | 1 | 10 | 25 | 50 | 100 | |||||
20120613-185311 | 46,5 24,2 13,9 9,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120705-232615 | 216,7 69,1 14,0 10,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120614-195040 | 31,3 23,2 13,6 12,0 | 1 | 10 | 25 | 50 | 100 | 200 | ||||
20120620-035406 | 45,4 22,9 15,8 13,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120630-151354 | 75,2 75,2 18,6 13,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120702-191056 | 32,6 24,4 18,6 13,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120703-200323 | 46,9 24,1 16,5 14,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120614-103322 | 1595,1 42,5 23,3 18,4 | 1 | 10 | 25 | 50 | 100 | 200 | ||||
20120619-194512 | 49,0 43,9 18,8 18,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
evaluateElite | 20120713-104244 | 23,7 13,8 9,8 9,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | |
20120717-112722 | 43,1 10,9 10,9 10,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
grammarRuleFourRules | 20120721-100435 | 24,0 18,9 12,3 7,5 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 |
grammarRuleThreeRules | 20120725-110357 | 42,6 39,5 4,0 2,7 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 |
20120721-100429 | 617,1 19,5 12,3 7,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
grammarRuleTwoRules | 20120721-100424 | 16,3 14,0 8,2 6,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 |
incMaxWrapTo5 | 20120703-221154 | 30,0 16,4 2,7 2,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | |
20120630-151354 | 94,7 31,1 7,1 5,2 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120702-081329 | 95,5 10,9 9,7 7,0 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120614-180247 | 49,1 19,7 7,1 7,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
20120705-232615 | 191,7 68,5 18,7 7,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120620-035406 | 75,3 65,4 16,3 9,0 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120702-191056 | 32,1 24,1 15,9 10,7 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120705-222411 | 696,9 22,7 18,4 13,5 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120703-200323 | 41,3 23,2 15,6 15,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
incMutationProb10 | 20120614-103322 | 44,1 22,8 3,8 3,3 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 |
20120610-094236 | 31,4 29,6 4,9 3,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120614-122812 | 343,1 32,8 4,7 4,7 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
20120612-210623 | 92,3 39,8 12,1 6,2 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120620-035406 | 32,1 19,6 12,2 6,2 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
20120611-184956 | 24,7 16,4 7,0 6,5 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120611-102741 | 18,3 18,3 10,9 7,0 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120612-093946 | 698,3 19,6 9,0 7,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120613-185311 | 1069,1 24,2 12,2 9,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120611-190036 | 29,8 18,6 13,9 12,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
20120613-104221 | 31,8 16,1 14,0 12,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120613-084231 | 72,0 45,3 13,8 12,2 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120610-234209 | 4481,0 44,0 19,3 13,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
20120610-175427 | 80,1 23,1 14,1 14,0 | 1 | 10 | 25 | 50 | 100 | 200 | ||||
20120611-113733 | 80,4 77,9 22,8 18,5 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
maxDepth15 | 20120717-112732 | 97,4 48,9 6,2 5,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | |
20120713-104245 | 40,6 22,6 15,6 13,4 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
nodal | 20120824-163537 | 221,9 193,6 177,1 152,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 |
20120824-163449 | 392,5 310,1 190,0 171,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 | |
20120827-190453 | 353,4 295,8 188,7 186,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
20120827-190432 | 556,5 258,8 199,0 194,2 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | |||
nodalMaxDerivationTreeDepth1 | 20120809-194653 | 18,4 13,5 13,4 9,6 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 |
20120814-181652 | 79,3 30,2 15,9 15,7 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
nodalMaxDerivationTreeDepth10 | 20120809-194705 | 47,9 14,1 6,1 4,5 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 |
20120814-181704 | 32,2 16,3 12,2 9,0 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
nodalMaxDerivationTreeDepth2 | 20120809-194658 | 76,9 13,6 6,6 3,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | 3000 |
20120814-181658 | 1360,4 48,4 12,3 8,9 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | ||
populationSize40 | 20120713-104234 | 46,0 29,9 9,6 4,1 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 | |
20120717-112713 | 91,1 47,5 10,9 9,8 | 1 | 10 | 25 | 50 | 100 | 200 | 500 | 1000 |
Monday, October 1, 2012
Basic Breeding Session
In order to explore the effects, the parameters of the genetic algorithm have a reference parameter set is needed. After trying around a little bit I have chosen the following parameters
eliteSelectionRepalcementStrategy = DefaultEliteSelectionRepalcementStrategy
fitnessEvaluationStrategy = DefaultFitnessEvaluation
initialiserImpl = RampedHalfAndHalfInitialiser
crossoverOperationImpl = SinglePointCrossover
mutationOperationImpl = IntFlipMutation
selectionRepalcementStrategy = Generational
randomNumberGeneratorImpl = Jre
fitnessFunction = SGevaFitnessFuction
fitnessFunction.canCache = false
fitnessFunction.maxDuration = 200
fitnessFunction.testResultConverterName = TheWinnerTakesItAll
fitnessFunction.opponentResourceName = fcl/ref-001.fcl
fitnessFunction.opponentsCount = 100
outputDirPrefix = base
outputBaseDir = C:\Users\wwagner4\pgm\cygwin\home\wwagner4\sumosim-optimizer
growProb = 0,500
maxDerivationTreeDepth = 50
maxDepth = 10
maxWraps = 0
eliteSize = 10
evaluateElite = false
fixedPointCrossover = false
crossoverProb = 0,800
mutationProb = 0,010
populationSize = 20
generations = 100000
seed = None
Running several breeding sessions with the above parameters leaded to the following fitness value trend. The fitness value is the fitness of the best developed individual in the current generation.
The diagram shows that many sessions start with a fairly good fitness value (below 100) and that the othes have a strong tendency to fall below hundred very quickly (before 10 generations). For the meaning of a fitness value see the post: The winner takes it all
Having a closer look at the low fitness values, shows that there is even a trend to fall below 50 within the first 25 generations.
Fitness values in the first generation
session bestFitness
base-20120614-195730 30.184661
base-20120609-234659 30.91526
base-20120614-103322 32.503989
base-20120610-233627 32.706588
base-20120610-002640 47.75487
base-20120615-192525 69.534912
base-20120611-102707 80.029995
base-20120611-184956 86.826697
base-20120613-104221 87.284369
base-20120609-102738 89.910391
base-20120610-094257 90.352723
base-20120619-194512 92.292769
base-20120615-210453 94.551918
base-20120612-210623 97.246372
base-20120615-174629 226.501808
base-20120609-171239 320.595443
base-20120613-084231 352.821817
base-20120610-175412 365.867119
base-20120611-190036 697.852911
base-20120612-093946 1352.827676
base-20120613-185311 1367.676366
base-20120608-192518 3029.902041
base-20120608-233350 4446.222934
These are the exact fitness values after 25 generations
session bestFitness
base-20120619-194512 4.444169
base-20120615-210453 12.291047
base-20120614-195730 13.675698
base-20120614-103322 14.073996
base-20120609-234659 16.116512
base-20120612-093946 16.271329
base-20120611-102707 16.297538
base-20120613-185311 16.326053
base-20120612-210623 18.963986
base-20120610-094257 19.142386
base-20120610-233627 19.249123
base-20120608-192518 19.58362
base-20120615-192525 22.771596
base-20120608-233350 22.916315
base-20120611-184956 23.50955
base-20120609-171239 23.903934
base-20120610-175412 24.060014
base-20120610-002640 24.060659
base-20120613-104221 24.181404
base-20120611-190036 24.4093
base-20120609-102738 31.385305
base-20120615-174629 37.357823
base-20120613-084231 44.244381
eliteSelectionRepalcementStrategy = DefaultEliteSelectionRepalcementStrategy
fitnessEvaluationStrategy = DefaultFitnessEvaluation
initialiserImpl = RampedHalfAndHalfInitialiser
crossoverOperationImpl = SinglePointCrossover
mutationOperationImpl = IntFlipMutation
selectionRepalcementStrategy = Generational
randomNumberGeneratorImpl = Jre
fitnessFunction = SGevaFitnessFuction
fitnessFunction.canCache = false
fitnessFunction.maxDuration = 200
fitnessFunction.testResultConverterName = TheWinnerTakesItAll
fitnessFunction.opponentResourceName = fcl/ref-001.fcl
fitnessFunction.opponentsCount = 100
outputDirPrefix = base
outputBaseDir = C:\Users\wwagner4\pgm\cygwin\home\wwagner4\sumosim-optimizer
growProb = 0,500
maxDerivationTreeDepth = 50
maxDepth = 10
maxWraps = 0
eliteSize = 10
evaluateElite = false
fixedPointCrossover = false
crossoverProb = 0,800
mutationProb = 0,010
populationSize = 20
generations = 100000
seed = None
Running several breeding sessions with the above parameters leaded to the following fitness value trend. The fitness value is the fitness of the best developed individual in the current generation.
The diagram shows that many sessions start with a fairly good fitness value (below 100) and that the othes have a strong tendency to fall below hundred very quickly (before 10 generations). For the meaning of a fitness value see the post: The winner takes it all
Having a closer look at the low fitness values, shows that there is even a trend to fall below 50 within the first 25 generations.
Fitness values in the first generation
session bestFitness
base-20120614-195730 30.184661
base-20120609-234659 30.91526
base-20120614-103322 32.503989
base-20120610-233627 32.706588
base-20120610-002640 47.75487
base-20120615-192525 69.534912
base-20120611-102707 80.029995
base-20120611-184956 86.826697
base-20120613-104221 87.284369
base-20120609-102738 89.910391
base-20120610-094257 90.352723
base-20120619-194512 92.292769
base-20120615-210453 94.551918
base-20120612-210623 97.246372
base-20120615-174629 226.501808
base-20120609-171239 320.595443
base-20120613-084231 352.821817
base-20120610-175412 365.867119
base-20120611-190036 697.852911
base-20120612-093946 1352.827676
base-20120613-185311 1367.676366
base-20120608-192518 3029.902041
base-20120608-233350 4446.222934
These are the exact fitness values after 25 generations
session bestFitness
base-20120619-194512 4.444169
base-20120615-210453 12.291047
base-20120614-195730 13.675698
base-20120614-103322 14.073996
base-20120609-234659 16.116512
base-20120612-093946 16.271329
base-20120611-102707 16.297538
base-20120613-185311 16.326053
base-20120612-210623 18.963986
base-20120610-094257 19.142386
base-20120610-233627 19.249123
base-20120608-192518 19.58362
base-20120615-192525 22.771596
base-20120608-233350 22.916315
base-20120611-184956 23.50955
base-20120609-171239 23.903934
base-20120610-175412 24.060014
base-20120610-002640 24.060659
base-20120613-104221 24.181404
base-20120611-190036 24.4093
base-20120609-102738 31.385305
base-20120615-174629 37.357823
base-20120613-084231 44.244381
Saturday, September 22, 2012
The Winner Takes it All
Another fitness function.
Before explaining the fitness function, i have to describe how fitness is measured. All robots of a population have to play a fixed amount of games against a reference robot. The number of wins, undecided game and losses is counted for every robot. Depending on these parameters a fitness value for each robot is calculated. This post describes the strategy for calculating the fitness value.
The strategy used favors won games to undecided ones. An example: If you win e.g 5 games of 10 and loose the other 5 games you get a better fitness value, than winning 4 games with 6 undecided games.
For the case of loosing all games, which i normal at the beginning of a breeding session, the length of the game i also considered. A robot that stays longer on the field is denoted fitter than one that is pushed out quickly.
The function in scala:
I have also prepared some Diagrams to show the behavior of the functions.
This diagram shows the dependency of the fitness from the number of won games. The more games are won, the lower is the fitness (what is interpreted as a good fitness)
This diagram show that the fitness value does almost not depend on the number of losses. Except in top-left diagram, that shows the situation of no won match. In that diagram you can also see that the duration of the match has some (little) influence to the resulting fitness. Actually all diagrams contain five different colored lines that show the fitness depending on the mean relative length of the matches. But they are so close to each other, that a distinction is not possible.
Before explaining the fitness function, i have to describe how fitness is measured. All robots of a population have to play a fixed amount of games against a reference robot. The number of wins, undecided game and losses is counted for every robot. Depending on these parameters a fitness value for each robot is calculated. This post describes the strategy for calculating the fitness value.
The strategy used favors won games to undecided ones. An example: If you win e.g 5 games of 10 and loose the other 5 games you get a better fitness value, than winning 4 games with 6 undecided games.
For the case of loosing all games, which i normal at the beginning of a breeding session, the length of the game i also considered. A robot that stays longer on the field is denoted fitter than one that is pushed out quickly.
The function in scala:
def fitness(result: TestResult): Double = {
def downSizeFactor = 1.0 / result.count.toDouble
def winContingent = result.relWinCount
def lossContingent = (1.0 - result.relLossCount * 0.99) * downSizeFactor
def durationContingent = if (result.relWinCount > 0.00000000001) winDurationContingent else noWinDurationContingent
def winDurationContingent = (1.0 - result.relDurationMeanOnWin * 0.99) * downSizeFactor * downSizeFactor
def noWinDurationContingent = (result.relDurationMeanOnLoss * 0.99) * downSizeFactor * downSizeFactor
100.0 / (winContingent + lossContingent + durationContingent) / result.count.toDouble
}
I have also prepared some Diagrams to show the behavior of the functions.
This diagram shows the dependency of the fitness from the number of won games. The more games are won, the lower is the fitness (what is interpreted as a good fitness)
This diagram show that the fitness value does almost not depend on the number of losses. Except in top-left diagram, that shows the situation of no won match. In that diagram you can also see that the duration of the match has some (little) influence to the resulting fitness. Actually all diagrams contain five different colored lines that show the fitness depending on the mean relative length of the matches. But they are so close to each other, that a distinction is not possible.
Thursday, May 17, 2012
SGeva, a scala wrapper around Geva
Geva is a genetic programming algorithm that I am using to optimize the fuzzy language programs that control sumo robots. In order to understand the capabilities of Geva and for a convenient usage in scala programs I wrote this wrapper.
Resources
Usage
Instantiate an Instance of SGeva (WordMatchSGeva in our case) and call the run method.
object WordMatchSGevaRunner extends App { new WordMatchSGeva().run() }
Derive your SGeva from AbstractSGeva and mixin the necessary factories to instantiate the designated Geva modules.
class WordMatchSGeva extends net.entelijan.sgeva.AbstractSGeva with net.entelijan.sgeva.conf.RampedHalfAndHalfInitialiserFactory with net.entelijan.sgeva.conf.DefaultDerivationTreeFactory with net.entelijan.sgeva.conf.SinglePointCrossoverFactory with net.entelijan.sgeva.conf.IntFlipMutationFactory with net.entelijan.sgeva.conf.GenerationalSelectionRepalcementFactory with net.entelijan.sgeva.conf.ProportionalRouletteWheelFactory with net.entelijan.sgeva.conf.StdoutCollectorFactory with net.entelijan.sgeva.conf.JreRandomFactory with ExampleFormatter { // The properties needed for the above defined factories @SGevaProperty def seed = None @SGevaProperty def generations = 100 @SGevaProperty def populationSize = 150 @SGevaProperty def initChromSize = 100 @SGevaProperty def growProb = 0.5 @SGevaProperty def evaluateElite = false @SGevaProperty def eliteSize = 10 @SGevaProperty def mutationProb = 0.01 @SGevaProperty def crossoverProb = 0.8 @SGevaProperty def fixedPointCrossover = false @SGevaProperty def maxWraps = 0 @SGevaProperty def maxDepth = 10 @SGevaProperty def maxDerivationTreeDepth = 50 // The fitness function @SGevaProperty def fitnessFunction = new WordMatchFitnessFunction { def word = "noah" def canCache = true } // The grammar // In scala you can use XML directly inside the sourcecode. I used // that feature to define the grammer without using external resources. // So you can have all the relevant information together in one file def grammarString =::= .text }| ::= | | ::= _ # Vowels and consonats ::= a|o|u|e|i ::= q|w|r|t|y|p|s|d|f|g|h|j|k|l|z|x|c|v|b|n|m ]]>
A fitness function for the WordMatchSGeva. Returnes a fitness value according to the fitness of a program, expressed by the grammar above
/** * The fitness function for the wordmatch. * The code was migrated from geva (java) to scala */ trait WordMatchFitnessFunction extends net.entelijan.sgeva.DoubleValueFitnessFunction { import Individuals.Phenotype def word: String override def toString() = "WordMatchFitnessFunction('%s') cache=%s" format (word, canCache) /** * Compare a string to the word. Each symbol not matching increases the fitness by 1. * Max fitness is max(length of the word, phenotype). * @param p Compared phenotype * @return Number of missmatches */ protected def evaluateFitness(pheno: Phenotype): Double = { val indiWord: String = pheno.getStringNoSpace() if (indiWord == null) word.length() else { val minLength = math.min(indiWord.length(), word.length()) val matchList = (0 to (minLength - 1)).map(i => if (indiWord.charAt(i) == word.charAt(i)) 1 else 0) val matchCount = matchList.foldLeft(0)((a, b) => a + b) val maxFitnessValue = math.max(indiWord.length(), word.length()) return maxFitnessValue - matchCount; } } }
Defines how the results of the SGeva run are recorded. In our case the results are written to standard output as the StdoutCollectorFactory is used in WordMatchSGeva (see above). The StdoutCollectorFactory needs a Formatter to define how to format results.
/** * Define the output of the results */ trait ExampleFormatter extends net.entelijan.sgeva.module.Formatter with net.entelijan.sgeva.module.PopulationStat with net.entelijan.sgeva.module.SGevaProperties with net.entelijan.sgeva.module.FormatterUtil { import scala.collection.JavaConversions._ def printHeader(pw: java.io.PrintWriter) { pw.println("-- Properties -------------------------------------------------------------------------------") sGevaProperties.foreach(p => pw.println("%s = %s" format (p.key, p.value))) pw.println("---------------------------------------------------------------------------------------------") pw.println("%15s\t%15s\t%15s\t%15s\t%s" format ("gen", "best", "mean", "worst", "words")) } def printGenerationData(pw: java.io.PrintWriter, genCount: Int, pop: Individuals.Populations.Population) { val stat = fitness(pop) pop.sort() val indis = pop.getAll() val words = formatList("%9s", "")(indis.map(i => "'%s'" format i.getPhenotype().getStringNoSpace()).toList) pw.println("%15d\t%15.2f\t%15.2f\t%15.2f\t%s" format ( genCount, stat.min, stat.mean, stat.max, words)) } }
Running the program above leads to the following output
-- Properties ------------------------------------------------------------------------------- generations = 100 fitnessFunction = WordMatchFitnessFunction('noah') cache=true randomNumberGeneratorImpl = Jre seed = None initialiserImpl = RampedHalfAndHalfInitialiser crossoverOperationImpl = SinglePointCrossover mutationOperationImpl = IntFlipMutation eliteSelectionRepalcementStrategy = DefaultEliteSelectionRepalcementStrategy selectionRepalcementStrategy = Generational fitnessEvaluationStrategy = DefaultFitnessEvaluation populationSize = 150 initChromSize = 100 growProb = 0,500 evaluateElite = false eliteSize = 10 mutationProb = 0,010 crossoverProb = 0,800 fixedPointCrossover = false maxWraps = 0 maxDepth = 10 maxDerivationTreeDepth = 50 --------------------------------------------------------------------------------------------- gen best mean worst words 1 3,00 4,08 9,00 'ko' 'n' 'oiao' 'co' '__a' '_o' '_o' 'co' '_o__' 'jo' 'co' 'n' 'boi' '__a' 'oeai' 'lox' 'noga_' '_oli' 'oia' '_' 'x' 'm' '_' 'a' '_i_u' '_' '_' '_i' 'e' 'o' '__' '_' 'fi_' 'i' '_' 'hi_' 'xu' 'w' '_' 'u' '_' '_' 'a' 't' 'hixo' 'i' 'aat' '_e' 'e_' 'j' '_' 'z' 'b_s' 'u' '_' '_w' '_e' '_a' 'o' 'j' 'a' '_' '_e_' 'o' 'u' '__' 'a' 'yk' 'c' 'e' 'o' 'o' 'g' 'x' 'y' '_l__' '_' 'o' 'f' '__' '_a' 'q' 'i' 'a' 'w' '_' '__o' '_' '_y' '_i_' 'u_' '_' '__' 'a' 'l' '_' 'ixu' '___' 'i' 'a_' '_' '_' 'ce' '___' 'hade' '_y_' '_' 'z' 'esao_c' '_pocn' 'vv_en' '_w_lo' '__eaee' '_i_l_j' 'z_n_db''oojmkias''i_lae_e''e_vzuoh_''_eedpxud''_eedpgm_o' '_pue' '' '' '' '_' 'a_' 'z___' '_' '_l' '_' 'nog_' 'm_x' 'i' 'a' 'i_l__' '' '_o__' '_' 'zp' '' '_' '' 'e' 'q' '' '' '_' '' '' 2 3,00 3,86 8,00 'oiao' 'i_a' 'oia' 'noga_' 'esa_' 'oia' 'ko' '__a' 'co' 'go' '_o' 'n' 'ko' 'hia' 'jo' 'lox' 'oia' 'n' 'uox' 'noga_' '_o' 'n' 'jo' 'co' 'n' 'boi' '__a' 'oeai' 'lox' 'noga_' '_oli' 'oia' 'g' 'e' 'w' 'w' '_' '_k' '_t' '_l_' 'r' 'e_' 'hade' 'ixu' '__' '_' '_u_t' 'b_s' '_' '_i' '_a' '_' 'b_k' '_' 'u' '__' 'hixo' 'xu' '_e' 'o_i' 'beo' '__u' 'a' 'a' 'a' 'o' '_e' 'x' 'yz' 'a_' 'c_' '_' '_' 'yas' 'o' 'o' 'za' '_j' 'b_y' 'i' 'o' 'i' '_e_' '_u' '_' 'h' 'u' '_' 'o' 'm' 'i_' 'xu' '_e' 'uh' 'd' '_' '___' 'i' '_' '__u' '_' '_' '__i' 'e' 't' 'u' 'l_' 'xu' 'l' 'u' 'o' '_y' 'a' '_ane' 'a' 'a' '__' 'z' '_e_' '__' 'o' 'hi_' 'f_' 'z' 'yh' '_' 'y' 'esao_c' 'k_xud' '_ee_i' 'vv_en''oojmk_e''ojmkias''oi_lae_e' 'oea' 'iu' 'i' 'z' '_poy' '_j' '_poc' 'oz' '_ea''_nfoawy' 'o' '' 'b' '_' '' 3 2,00 3,85 7,00 'no_' 'n' 'ne' 'noga_' 'i_a' '_o' '__a' 'oia' 'ko' '__a' 'p_a' 'ng' 'oia' 'jo' '_o' '__a' 'esa_' '__a' 'uox' 'oiai' 'esa_' 'jo' 'co' 'n' 'boi' '__a' 'oeai' 'lox' 'noga_' '_oli' 'oia' 'v' 'y' '__' 'o' 'd' 's' '_j' '_' 'w' 'xi' '_e' 'i' '_ana' 'e' '_a_i' '_' '__o' '_' '_' 'o' 'z' '_u' 'o__' 'g_' '_' 'u' 'xu' '_' 'o' 'bu' 'eyun' '_' 'c__' 'o' 'v' 'o_' '__i' 'i_l' 'o_' 'xv' 'eai' '_d' 'e_' 'kd' 'a_' '_j' '_l_' 'b_y' 'f_' '_' '_' '_a' 'oiw' '__' 'i' 'i' 'u' 'g' 'gu' 'ke' 'pw' 'i' '_' '_i' 'l' 'ud' 'i' '_' '_' '_a' 'o' 'i' '__' 'j' 'b_s' '__' 'it' 'ea' '__u' 'k_o' 'a' 'o__' '_i' 'k_xud' 'k_xud' 'k_xuh' 'iykye' 'oedeai' 'l_v_en''ojmkiae''oim_ga_' '_' '_' 'y' '' '' 'hao' '__' 'bu' '__' '_o' 'u' 'iu' '' '_' 'a' 'o' '' 'z' 'x' 'e' '_uo' '_' '' 'd' 'hwit' '_oq' '__' 4 2,00 3,74 5,00 'no_' 'no_' 'jo' '_olx' 'nt_w' '_ow' 'nun' 'co' '__a' '__a' '_o' '__a' 'n' 'nxv' 'oga_' 'n' '__a' '__a' 'go' 'lot' 'oeai' 'nog_a' 'ne' 'n' '_ow' 'oia' 'lou' 'n' 'n' 'na_' '_ga_' '_o' 'nogod' 'jo' 'co' 'n' 'boi' '__a' 'oeai' 'lox' 'noga_' '_oli' 'b_s' 't_' 'i_' 'l__' 'ox' 'kd' 'e' 'e' '_' '_' 'u' 'i' 'u' 'f' 'e' 'i' '_g' 'i' 'k__i' '___' 'c_' '__' 'xu' '_n' 'u_' '_n' '_u' '_ai' 'o' '__' 'eyun' 'a' '__i' 'v' '_j' 'u' '_i' 'u' '_' 'o_' '_' '_y' 'o' '_ana' 'ef' 'o' 'k_t' '_u' 'v' '_b_' 'mt' 'i' '_' '_' 'ei' 'ewi' 'ud' '_a_' 'i' 'o' 'fi' 'd' '__' '_' 'od' 'l' '___' 'ea' 'g_' 'c__' '_' '__i' '__o' '_e' '__u' 'a_' 'eyuo' 'f' 'v_en' 'yas' 'j' 'm' 'e' 'oe_' '___' 'i' '_' '__i' 'u' 'c__' 'eyu' 'iu_s' 'w_' 'm' 'f' 't' 'u' 'e' 'u' 'oi__a' 'm_ga_' 'k_xud' 'l_lox' 'iykye' '____a' '_' 'o' 5 2,00 3,76 5,00 'noe' 'no_' 'no_' '_oly' 'lox' '_o' 'io' '_oxw' '_ea' 'oeai' '_ow' 'co' '_o' '__a' '_oy' 'na_' 'loj' '_o' 'low' 'sca' 'noga_' 'nt_g' 'co' '__a' '_o' 'n_' 'lot' 'jo' 'co' 'n' 'boi' '__a' 'oeai' 'lox' 'noga_' 'j' 'iuuy' 'b_s' '_y' '__u' 'l' 'x' '_' '_u_s' 'a_' '__' 'e' 'lbe' '_li' 'ms' 'b_o' 'e' 'j_' 'kd' 'odz' '_a' '_g' '_u' '_io' 'kye' 'oy' 'k_m' 'u' 'f' 'gx' 'i' 'j' 'j' 'xu' 'o' '_' 'o' '_' 'i' 'o' '__o' '__' 'me' 'o' 'be' 'c__' 'oai' '__' '_' 'i' 'p' 'u' 'w' 'ias' 'pw' '__u' 'o' 'o' '_' 'd' '_' 'iu_a' 'ou_' 'o' '_' 'la_' 'l' 'u' 'a' '__u' 'lu' 'a' 'l_' 'eyu_' 't' 'ii' 'u' 'l' 'ga' 'oee_' 'u' '_' '__u' '_' '__' 'ez' 'e' 'o' 'a_' 'xu' 'm' 't' 't' 'oj' 'd' 'x' 'ci' 'leyuo' '__m__' 'l_lox' 'm_ga_' '_avdu' 'ogal' 't' 'u' '' '' 'c' '' 'iu' 'k_' 'baa' 'oiwit' '' 6 2,00 3,83 7,00 'boai' 'no_' 'no_' 'no_' 'noe' '_oiw' 'mo' 'co' '_o' '_oxs' 'lox' '_oy' 'go' 'lon' 'ko' 'n' 'co' 'nno_' 'co' 'ao' 'low' 'n' 'bo_' '_ua' '__a' 'oeai' '_o_' '_o' 'jo' 'co' 'n' 'boi' '__a' 'oeai' 'lox' 'a_' 'm_gx' '__i' 'e' '_l_' 'e' 'cs' 'ce_i' 'r_' 'mu' 'gu__' 'eyco' 'i' 'oai' 'ii' '_l' 'o' 'i' '_' 'o' 'p_' 'd' 'e' 's' 'm' 'eyus' '___' 'f' '_e' 'o' 'e' 'a' 'ca' 'u' 'm' 'u' 'xpw' 'b_u' '__' 'o' 't' '_u_s' '_' 'l' 'u' 'm__' 'y_' '__i' '__j' 'eg' 'sco' '_' 'a_' '_' 'i_' '_' '_' 'ie' 'u' '__o' 'e_' 'l_' 'o_' 'xu' 'kd' 'kd' 'a' '_i' 's' 't' 'ox' 'i' 'be' 'l_' 'i' 'xe' 'l' 't' 'e' 'ca_' 'o' 'oao' 'oj' '_io' 'e' 'z' 'nogaw_' '___' 'k' 'u' 'e' 'he' 'u' '___' 't' '_s' 'iiu' '__u' 'c__' 'a' 't' 'ei' 'am' 'o' 'oee_' '_u_n' 'g' 'g_ga_' 'oet_w' 'i_eai' 'ea_u_s' 'cm_ga_' 'ouoga_''zx_deai' 7 2,00 3,72 7,00 'no_' 'boai' 'no_' 'no_' 'no_' 'noe' 'boai' 'no_' 'n' 'nu' 'io' '_o_a' 'co' 'n' '__a' '_u_h' 'eo' 'aoi' 'bo_' '_oxs' 'ao' 'ni' '_o_j' 'mo' 'aya_' 'co' 'n' 'n' 'lox' 'n' 'lod' '_ois' 'boi' 'jo' 'co' 'n' 'boi' '__a' 'i' 'y' '_u' 'm' 'f' 'e_' 'a' 'u' 'au' 'ow' 'ce_v' 'a_' 'o' '_' 'l_' 'oewb' 'h_' '_' 'eai' 'o' 'u_' 'ea_' 'z' 'r_' '_' 'a' 'j' 't' '_ai' 'ce__' 'i' 'y_' '_' 'c_o' '_' 'aam' '_e' 'o' 'ce' '__o_' '_y' 'ce' '_' '__i' 'g' 'cs' 'e' 'eyco' 'u' 'u' 'c' 'b' 'i' '_ai' 'o_u' 't' '_' 'o' 'i' 'iiu' 'g_z' 'e' 't_i' 'l' 'e' 'u' 'az' '_u' 'b' '_e' 'h' 'e' 'cs' 'b__' 'a' '_u__' '_k' 'ejt' 'cg' 'o' 'ke' '_i' '_xe' 'u' 'ei' 'iv' '_u' 'a' '__e' 'cw' 'g' '__o' 'a' '_' 'kh' '_' 'q' '__u' 'u_ga_' 'g_ga_' '_x_da_''bx_deai' '' '' '_g' '_l' 'u' 'eyu' 'i' 'eyo' '_' 8 1,00 3,84 9,00 'noa' 'boao' 'no_' 'no_' 'no_' 'noe' 'boai' 'no_' 'no_' 'boai' 'no_' 'n_' 'bo_' '_o' '_o_a' '__a' '_oin' 'nu' '_o_' 'oga_' 'nco' 'uo' 'n' 'lod' 'bo_' 'boo' 'dga_' 'jo' 'co' 'il' 'a' '_ai' '_' 'y_' 'f' 't' 'x' 'a' 'ce' 'a' 'j' 'i' 'o__' 'x_i_' 'e' 'g' 'y_' '_y' 'u' 'o' 'u' '_g' 'i' 'g' 'd' 'k' 'jt' 'u' 'yl' 'jn' 'o' 'o' 's' 'i' 'o_o' 's' '___a' '_ut' 'y_' '_e' 'c' 'ca_' 'o' 'o' 'o' 'ku__' '_a_' 'u' 's' 'ha' 'v' 'h_' 'u' '_' 'c' 'e' 'r' 'o' 'uu' 'o_' 'be_' 'g' '_' '_' 'o' 'e_' 'rv' 't' 'e' 'i' '__u' 'o_u' 'e' '_a' 'ykyn' '_' 'a' 'fu' 'u' 'b' 's' 't' 'i' 'in' '_ii' '_' 'o' 'b_' '__' 'i' 'cg' '_' 'h' 'g' 'ea_' 'i' '_' '_a' 'i' 'o' 'ow_' '_wb' 'e' 'a' 'u' 'u' '_x_bt' 'g_ga_' '_uia_' 'h_eai' 'x_deai''zx_deai''h_x_deai''euzx_deai' 'c_' '__i' 'tfoawy' 'aa' '' 9 1,00 3,69 7,00 'noa' 'no_' 'no_' 'no_' '_oa' 'noi' 'boa' 'no_' 'no_' 'noe' 'boai' 'no_' 'no_' 'boai' 'no_' 'boao' 'nuu' 'n_g' 'jo' 'nh_' 'n' 'nw' 'oga_' 'ny_' 'boo' 'lod' 'ne' 'n_' 'uo' 'oga_' '_oi' 'zoi' 'lod' 'boe' 'ro' 'na_' 'a' 'o' 'j' 'u' 'o_' '_' 'a' 'eco' 'i' '_' 's' 'fi' 'm' 'u' 'i' 't' 'o' 'f' 'o' 'od' '__' 'g' 'be_' 'f' 'g' 'o' 'u' 'u' 'n_eai' 'b_' 'oai' 't' 'u' 's' 'v' '_' 'yl' '__o' 'u' '_' 'rc' 'a' 'ee' '_ei' 'g' 'g' 'a' 'e' '__' 'mr' 'hr' 't' 'o' 'yz' 'a' 'a' '_a' 'o' 'a' 'w_' 'kye' '_ai' 'o_u' 'o' 'g' 't_' 'oli' 'nz__j' 'uw' '_uh' '__g' 'ca' 'a' 'j' 'u' 'x' 'b' '_ae' '___a' 'kco' 'h' 'o' '_' 'o' '_' 'm' '_' 'y' 'a' 't' 'o__' 'u_' 'a' 'jm' 'o' 'ba' '_g' 'y' '_kye' 'e_i' 'u' 'a' '_' 'owi' 'a' 'b__' '_uiue''ocaobe_' '_aobe_''_x_deai' 'n' '_' '' 10 1,00 3,63 6,00 'noa' 'noa' 'boa' 'no_m' 'boae' 'no_' 'boai' 'no_' 'no_' 'noe' 'boai' 'no_' 'no_' 'boai' 'no_' 'boao' 'n' 'uot' 'nboi' 'nuo_' 'zo' 'nuu' 'n' 'n_g' '_ea' 'm_a' 'oga_' 'nnw' '_o_' 'n_g' 'nac' 'nkco' 'uo' '_of' 'n_y' 'n' '_eai' '_o' 'nalu' '_o' 'nom__' 'y' 'o_' 'u' 'r' '_' 't' 'ee' 'm' 'e' 'ky' '_mr' 'e_' 'ii' 'e_u' 'o' 'fi' 'b' '_ai' 'y' 'u_' 'o' 'i' 'j' 'e_i' 'g' 'o_' 'oga_w' 'c' 'v' 'cl' 'o' 't' 'a' 'i' 'n_eae' 'ow' '_' '__o' 'y' 'ru' 'ca' 'nz__j' 'owi' 'ox__' 'e__' 'c' '_' 'j' 'g' '_' 'ca' 'ei' 'is' 'd' 'c' 'e_i' 'g' '_' 'j' 't' 't' 'l' 'i' 'g' 'g' '_' 'omr' 'a' '_' 'm' 'w' 'a' 'i' '_' 'm' '__' 'o' 'oce' 'a' 'b_' 'o' 'r' 'ce' 'e' 'o' '_' 'j' 'rr' 'a' 'u' 'np_ui' '____' '_a' 'eae' 'a' 'yb_a' '_i' 'w' '_a' 'uk_xud' 'oedeai' '_x_da_' 'ja' '' 'boa' '' 'la' 'bv' 11 1,00 3,45 9,00 'noa' 'noa' 'noat' 'noa' 'noa' 'noa' 'nsau' 'boa' 'boam' 'boa_' 'no_' 'boa' 'no_' 'boau' 'boau' 'no_' 'n_a' 'no_' 'no_' 'no_' 'no_' 'noe' 'boai' 'no_' 'no_' 'boai' 'no_' 'nac' 'co' 'mot' 'eeae' '_o' 'na__' '_o_' 'n_g' 'n_g' 'nn_s' 'n__' 'nao' 'n' 'nac' 'n' '_o' 'nx__' 'ni' 'uo' 'nj' 'nm_a' '_of' 'n' 'n_g' 'w_' 'e_e' 'e' 'i' 'ku' 'a_i' 'wut' 'b' 'b' '_s' 'e_' 'b' 'a' 's' 'u' 'm__' 'o' '_' '_m__' 'c' 'o' '_l' 'u' 'l' 'j' 'a' 'e_' '__' 'o' 'w' 'z_' 'ce' '_' 'a' 'q' 'np_ua' 'o' 'cu' 'ri' '_' 'u' 'w_' 'i' 'u_' '_e' 'e_' 'c' '_u' 't' 'a' 'g' 'e' 'le' 'at' '_' 'd' 'i' 'anoa' 'wi' '_bo' 'o' 'y' 'tau' 'q' 'i' 'nboao' 'o' 'b_' '_u' '_' 'u' 'u' '_g' 'fi' 'nz__j' 'o_' 'yk' 'uk_b' 'a' '__' 'n_ga_' 'ujm' 'o' 'omr' 'cl' 'c' '_t' '_' 'w_' 'h_' 'nknboi''np_ax_deai' 'bom' '_a' 'u' 'at' 'a' '' 12 1,00 3,49 8,00 'noaq' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'loa' 'no_' 'no_' 'boa_' 'noo' 'yoat' 'no_' 'non' 'noi' 'nom' 'n_a' 'noe' 'boai' 'boau' 'now_' 'no_' 'boa' 'boa' 'no_' 'no_' 'noe' 'boai' 'n' 'noomr' 'nj' 'n' 'n' 'nac' '_o' '__a' '_o' 'eo' 'naq' 'n_m' 'na_m' 'nb__' 'nnoa' 'm_a' 'uo' 'nan' 'n_r' 'n_w' 'yo' 'nk_' 'nm_a' 'n__a' 'n_' 'n_yk' 'na' 'zo' 'o_' 'u' '_r' 'nsu_a' 'bu' 'be' '_' 'oc' '_ei' 'w' 'n_gw_' 'c_' '_' 't' 'n_goo' '_t' 'e_' 'u' 'e' 'o_' 'a' '_' '___' 'u' 'oi' 'a' 'uk_d' '_a' 'b' 'c' 'g' 'caaq_' 'x__' 'o' 'wn' 'at' 'i' 'k' '_' 'eu' '_' 'e' 'na__a' '_' 'x' 'cu' 'n_no_' 't' 'w' 'nz__o' '_a' 'b' 'e_' 'ee' 'e_e' '__' 'ne_oa' 'm' 'bi_' 'za' 'b' 'a' 'o' 'at' 'u' '_' '_t' 'o' 'le' 'u' 'm' 'ba' 'o' 'e' '_' 'm' '__' 'we' 'oa' 'u' '__yu_' 'a_no_' 'np_awu' 'naobe_' 'ujno_''n_gaobe_''nknbboa_''nozx_deai''nnzx_deai' 'a' 'i' 'd' 13 1,00 3,31 6,00 'noa' 'noaq' 'noaq' 'noa' 'noa_' 'noa_' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'boai' 'no_o' 'uoa_' 'no_' 'yoat' 'noyk' 'noc' 'nou' 'not' 'no_' 'no_' 'boae' 'boa_' 'noe' 'n_ai' 'no_a' 'no_' 'no_' 'noe' 'm_a' 'eo' 'x_a' 'n' 'n__' 'n' 'n_' 'n_yb' '_o' 'wpad' 'ns' 'bo_' 'n_r' 'n_vo' 'eo' 'm_a' 'n_' 'p_a' 'nau' 'nax' 'na__' 'nnw' 'nb__' 'cow_' 'yo' 'n__a' 'bo' 'nau' 'nan' 'x' 'e' 'ai' 'ei' 'j' 'na__a' 'aw' 'e' 'wu' '_c' '_a' 'oio' 'es' '_' 'a' 'a' 'bw_' 'unnw' '__' 'u' '_' 'w' 't' '_n' 'c' 'on_g' 'bio_' 'edea' 'at' 'ke' 'ou' 'wi' 'u' 'x_wi' 'ua' 'o_' 'omo_' '_' 'e_' 'e' 'oi' 'o' 'aobe_' '__u' 'a' 'o' 't' 'c_' 'bom_n' 'm__' 'w_' 'dvd' 'uwu' '__' 'w' '_' 'o' 'ba' 'ye' 'z' 'a' 'ne_o_' 'ne_oo' '_' '_' 'ci' 'j' 'ei' 'y' 'owi' 'w' 'myo' '_a' 'o_' '_a' '_a' '_' '__o' 'a' '_a' 'eu' 'a' '_' 'u' 'uk_d' 'x' '__d' 'e' 14 1,00 3,21 5,00 'noai' 'noa' 'noa' 'noaa' 'noa_' 'noam' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'noaq' 'noaq' 'nou' 'noz_' 'nou' 'noo' 'nnau' 'nou' 'no_a' 'nou' 'nog' 'no_e' 'noc' 'n_a' 'no_' 'no_a' 'noe' 'no_o' 'no_' 'non' 'uoao' 'noc' 'noe' 'nax' 'bow_' 'n' 'nnw' '_o_' 'na' 'nonoa' 'nco' 'bo_' 'co' 'n' 'ne_' 'nau' 'nan' 'nan' 'nau' 'n_r' 'nom_a' 'n_i' 'na_u' 'ns' 'nle' 'bo_' 'nao_' 'n_w_' 'woi' 'eo' 'nan' 'n_' 'ns' 'kau' 'bu' '_' 'w' '__o' 'o' 'aobea' 'be' '_' 'ei' 'a__' 'u_' 'wu' 'u' 'b_x' 'nanon' '_' 'm' '_' 'noou__' '_' 'ne_oo' 'qke' 'c' 'a' 'u' 'k_' 'ou' '_' 'w' 'ai' 'oa' 'ke' 'm__' 't' 'u' 'u' '__' 'en' 'au' 'a' 'm__' 'ad' 'p_w' 'x' 'o' 'u' 'uwu' '_' 'emo_' 'o_' 'w' 'x_wi' 'u' 'uk_d' 'g' 'o' 'ue' 'tau' 'r' '_' 'ai' 'wu' 'au' 'xad' '_a' '_' 'owi' 'x' 'e_' 'x_w_' 'f' 'bu' 'p_t' '_w' 'e' 'w' 'm_ke' 'u' 'o_' 'w_' 'w' 15 1,00 3,15 5,00 'noaa' 'noaa' 'noaq' 'noa' 'noak' 'noa' 'noaz' 'noa_' 'noa_' 'noa' 'noaq' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'noaq' 'noaq' 'n_a' 'noo' 'no_' 'noe' 'n_a' 'noow' 'nmat' 'nou' 'n_a' 'nou' 'noe' 'no_o' 'no_a' 'noe' 'nna' 'nco' 'n__o' 'bo_' 'nao' 'noe_a' 'nax' 'yow' 'n_r' 'n_' 'na' 'n' 'wo' 'm_a' 'nec' 'nau' 'nco' 'bo_' 'nm_e' 'n__u' 'n' 'nawi' 'nan' 'n_' 'bou' 'nau' 'nao_' 'ni' 'naj' 'ne_' 'no_wo' '_o' 'nonoa' 'n_y' 'ne_' 'nle' 'nonau' 'n_o_' 'nau' 'n_e' 'nw_' '_' 'en' '_ke' 'mnoo' 't' '_u' 'ke_a' 'oe' '_m_a' 'a_' 'm' 'zm' 'uwu' 'kx' 'm' 'm_u' '_' '_' 'u' 'm_ke' '_' 'c' 'nu_ai' 'w_' 'owi' 'b_x' 'e' '__o' 'oa_' '_' 't' '_' 't' 'g' 'en' '_' 'o' 'eai' 'o' '_' 'uu' 'ow' 'u_i' '_' 'hb_e' 'm_e' '__' 'm_' 'w_' 'w' 'a' 'eu' '_a' 'oeo' 'u_' 'exw_' 'w_' 'w_' 'qkm' 'u' 'ou_' 'u' 'fi' 'oa' 'oa' 'uy' 'w_' '_' '_noom' 'ngelca' 'nuk_xu' 'edcxu''no_deai' 16 1,00 3,01 4,00 'noaq' 'noaa' 'noa' 'noaa' 'noa' 'noaz' 'noaq' 'noat' 'noae' 'noa' 'noa' 'noak' 'noa' 'noam' 'noa' 'noa' 'noa_' 'noa_' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'noaq' 'noaq' 'non' 'noi' 'ntau' 'nmat' 'noeo' 'noe' 'nua' 'nou' 'nou' 'n_a' 'noe' 'nou' 'no_w' 'noon' 'now_' 'no' 'no_' 'm_a' 'nfi' 'nm' 'nukt' 'nag' 'nsg' 'n' 'nw_' 'nao' 'n_' 'o_a' 'n_oa' 'nonau' 'n__' 'nm_' 'nce' 'n_i' 'nlb' 'nau' 'noxw_' 'n_o' 'mo_' 'm_a' 'nec' 'ne_' 'nw_' 'n' 'nm_a' 'nau' 'nom_a' 'nou__' 'ww_p' 'ad' 'oa' '_' '_a' 'aw' 'w_' 'u' 'e_' 'wu' '_' 'm_' 'w_' 'aj' '_' 'aa' 'u' '__e' 'ngel_' 'no_lod' 'au' 'au' '_w_' 'u' 'u' 'ow' 'e' 'eai' 'oe' 'nnoa_' '_' 'nu_au' '_m__' 'm' 'z' 'g' 'noom_v' 'w' 'm__' 'o_' '_u' 'aw' 'j' 'bm_a' 'a' 'hb_e' 'w' 'e_' '_ai' 'z_' 'oa' 'a' 'w_' '__e' 'z' '_' 'hb_e' '_' 'w_' 'om' 'w' 'c' 'w_' 'ce' 'm__o' '_' 'e__' 'mwu' 'm_o' 'et' 'oe' 'm' 'wd' 17 1,00 2,87 4,00 'noa' 'noaq' 'noa' 'noak' 'noa' 'noaq' 'noa' 'noa' 'noa' 'noa' 'noaq' 'noa_' 'noaq' 'noa_' 'noa_' 'noa' 'noam' 'noa' 'noan' 'noa_' 'noa_' 'noaq' 'noaa' 'noa_' 'noa' 'noa' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'noaq' 'noaq' 'noo' '_oat' 'noo' 'nmau' 'no__' 'now_' 'nofi' 'noe' 'no_' 'noe_' 'no_' 'no_' 'nsw' 'mwa' 'nm_u' 'nag' 'nad' 'nawi' 'ne_' 'mo_' 'n_e' 'nu_' 'nau' 'n' 'wo' 'noooe' 'ntm' 'na_' 'n' 'n' 'n__' 'nm_' 'nz_e' 'nukt' 'wo' 'nom__' 'ntm' 'n_i' 'nw_' 'ncw_' 'u_a' 'nau' '_on' 'n_' 'nzy' 'nww_' 'n_o' 'nau' 'n_g' 'hb_e' 'aq' 'w_' 'tw_' 'nox_a_' 'z' '__' 'fi' 'w' 'za' '_m_f' 'c' 'wi' 'o_' 'a_' '__u' 'hb_e' 'aa' 'e__' 'wu' 'hu' 'w' '__e' 'w_' 'ez' '_a' '__e' 'hb_e' 'te' 'et' 'oi' 'w_' 'o' 'mxw_' 'ad' 'ns_na' 'g' 'g' '_a' 'y' '_au' 'm' 'jq' 'aj' '_ai' 'a' 'm' 'w' 'w_' '_' 'gu_' '_g' 'x' 'j_' 'ze' 'nn_oa' '_q' 'oat' 'j' 'o' 'bb_a' 'wd' '_' 'e_' 18 1,00 2,87 5,00 'noan' 'noaq' 'noa_' 'noaq' 'noa' 'noaq' 'noa_' 'noa_' 'noa_' 'noa' 'noan' 'noa' 'noa' 'noa_' 'noa' 'noan' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'noaq' 'noaq' 'noe' 'nou' 'nom_' 'no' 'n_au' 'nou' 'nooa' 'noe' 'no_' 'no_' 'nou' 'no_' 'noee' 'nma' 'no_i' 'noa_a' 'nou' 'noj' 'nou' 'noh' 'nooo' 'now' 'no_' 'nta' 'no_q' 'noe' '_oat' 'nwa' 'noo' 'n__' 'naea' 'nuzo' 'n_q' 'n_e' 'n_' 'nooo_' 'noe_a' 'nag' 'nak' 'nti' 'n' 'nue' 'nuu' 'neg' 'neo' 'nukt' 'nsw' 'n_' 'nd' 'nau' 'nu_' '_aa' 'u_a' 'nnoa' 'noxw_' 'nmo_' 'n_e' 'nww' 'wo' 'n__' 'nw_' 'nmx_' 'n__a' 'nwo' 'ntn' '_on' 'nag' 'ew' '__' '__e' 'noooa_' '_et' '_e' 'o_' 'oat' 'www_' 'e' '_u' 'hu' '_' 'et' 'oa' 'aau' 'zi' 'at' 'o' '_a' 'ek' '_m__' 'e' 'ja' 'w' 'w_' 'a' 'fi' 'e_e' 'oa' 'o' '_a_' '_a' 'm_o_' 'bu' 'w_' 'nwww_' 'a_' 'a_' 'e' 'mxsw' '_a' 'uwn' 'q' '__' 'aa' 'oat' 'y' 'hb_e' 'ad' 'xw_' 'wu' '_a' 'guh__' 'mzeai''nous_na' 19 1,00 2,79 5,00 'noaq' 'noa' 'noaq' 'noaq' 'noa_' 'noa' 'noan' 'noa' 'noa_' 'noa_' 'noa' 'noan' 'noaq' 'noa' 'noa' 'noa_' 'noa' 'noaq' 'noa' 'noaq' 'noaw' 'noa_' 'noa' 'noaw' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'noaq' 'noaq' 'now' 'now_' 'now' 'nou' 'noea' 'no_' 'n_a' 'noe' 'no_' 'noe' 'noo' 'no_' 'no_' 'noa_u' 'noe' 'noeu' 'n_au' 'noy' 'no' 'noe' 'no_a' 'nona' 'non' 'nma' 'no' 'noi' 'num' 'nuo_' 'nn__' 'nuoa' 'zo' 'nuw_' 'nw_' 'mda_' 'nww' 'nxw_' 'ntn' 'nnu_' 'nm_a' 'ntm_' 'eo' 'nmo' 'nak' 'nt' 'n_' 'n__' 'nie' 'nu_' 'n_' 'nm_a' 'n__' 'nz_' 'nd' 'nuoa' 'nau' 'mwa' 'q' 'nm_on' '_s' 'at' 'bu' 'te' '_m' 'oj' '_a' 'za' 'ei' 'x_' '__' 'tu' 'ane_' 'tm' '_' '_' 'w_' 'noooa_' 'nun__' 'kt' '_et' '_u' 'xw_' 'a_' 'u_q' 'ze' '_n' 'cth' 'wau' 'a_' 'noroee' 'noom_e' '__' 'zi' '_q' 'a' '__w' 'w_' '_a_' 'o_' 'w_' 'mw_' '_z' 'g_' 'o' 't' 'ew' 'gu_' 'xw_' 'o' 'wu' 'nwww_' '_' 'oa' 'e' 'nanoaq' 'wk_xu' 20 1,00 2,90 4,00 'noak' 'noao' 'noaz' 'noaq' 'noa' 'noa' 'noa' 'noaa' 'noat' 'noan' 'noat' 'noa' 'noaq' 'noan' 'noa' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'noaq' 'noaq' 'now' 'no_' 'noe_' 'now' 'no_' 'no__' 'noag_' 'nona' 'non' 'nea' 'noo_' 'nod' '_oa' 'nou_' 'nou' 'nob' 'noe' 'n_a' 'noo' 'non' 'no' 'nou' 'n_au' 'noa_e' 'no' 'nor' 'noo_' 'ne_' 'nxw_' 'nuwu' 'nu_' 'm_a' 'nm__' 'nq' 'nao' 'eo' 'nee' 'nh' 'nooaq' 'ng' 'nu_a' 'm_a' 'nnou' 'uo_' 'nn_z' 'nuoa' 'nd' 'n__a' 'nau' 'nxwe' 'nug' 'nte' 'nee' 'nm_e' 'eo' 'nwt' 'naw' 'nmu' 'zo' 'nm_a' 'nu_j' 'nno_' 'noaoa_' 'w_' 'wu' '_a_u' 'ta' 'om__' 'a' 'g_' 'haq' 'ke' '_q' '_z' 'aq' 'nm_o_' 'nun_a' 'w_' '_u' 'numoa' 'x_' 'mzu' 'noom_u' 'w_' 'tau' '_q' 'oj' 'm_y' 'qd' 'oaq' 'wnuy' 'an' '_' '_' 'bau' '__' 'a' '_' 'an' 'oi' 'au' 'w_' 'm_i' '_eq' 'u' 'at' '_' 'oa_' 'nnu_a' '_' 'u' 'e_' 'w_' 'wu' 'rw_' '_q' 'u_z' 'ha_' 'j' 'aooa_' 'mwe' 'at' 'oa' 'ze' 21 0,00 2,83 4,00 'noah' 'noa_' 'noat' 'noao' 'noa' 'noan' 'noaz' 'noaq' 'noat' 'noan' 'noa_' 'noaq' 'noa' 'noa' 'noan' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'noaq' 'noaq' 'nua' 'noza' 'nooa' 'non' 'now' 'now' 'niak' 'noe' 'no_' 'noe' 'no_' 'noo' 'neai' 'n_a' 'now' 'now' 'noo' 'noe' 'nou_' 'noo' 'noi' 'nowu' 'noum' 'no' 'no' 'noo' 'noet' 'noe' 'nou' 'nou' '_ot' 'n_z' 'n' 'nu' 'nau' 'nw' 'nu_' 'nm_m' 'n_q' 'mow_' 'nxw_' 'ao' 'nee' 'nd' 'nu' 'n__a' 'nnoe' 'nmoa' 'nuwu' 'uo_' 'nnd' 'nbw' 'nnoa' 'na' 'ne_' 'nug' 'nuu' 'nmoa' 'uo_' 'nnou' 'ng' 'nz' 'nou_a' 'nao_' 'u_a' 'nooo_' 'nxw_' 'n_' 'ne_' 'm' 'rwn' 'g' 'ow' 'i' 'oan' 'eu' 'hw_' 'dpxu' '_' 'o_' 'bu' 'nm_o_' 'oa' 'tto' 'nodey_' 'ke' 'w_' 'a' '_' '_' 'e_e' 'w_' 'ndmo_' '_' 'wu' 'u_ke' 'xu' 'oa' 'q' 'te' 'ug' 'xw_' 'noom_r' 'u_u' 'qd' 'g' 'mk__' 'aooa_' 'numoa' '_i' 'e' 'aw' 'ww' 'ma_' 'z_' 'an' 'o_' 'gz' '_' '_' 'm_e' 'd_ue' 'dpxu' 'm_w' 22 0,00 2,77 4,00 'noah' 'noah' 'noaq' 'noa' 'noa' 'noa' 'noa' 'noa' 'noaq' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noau' 'noaq' 'noat' 'noa' 'noan' 'noae' 'noa' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'noaq' 'noza' 'noum' 'noze' 'neai' 'noow' 'no_' 'nooa' 'nog' 'n_a' 'no' 'nou_' 'noe' 'no_' 'noe' 'now' 'now' 'nou' 'no_' 'toat' 'no_' 'nooo_' 'mow_' 'nw' 'aouo' 'nau' 'nound' 'jo' 'e_a' 'm_a' 'noux_' 'nu_a' 'nu_' 'nu' 'ntg' 'nau' 'nw' '_o_' 'nm_' 'uo_' 'nz' 'n__' 'na' 'u_a' 'uow' 'nez' 'n_' 'nm_o' 'nom_n' 'norwn' 'nau' 'nw' 'n__a' 'nuo' 'nug' 'n' 'uooi' 'n' 'nu_e' 'nnxa' 'nu' 'to' 'na' 'bo' 'nio' 'nk' 'na_' 'nto' 'n' 'n_' 'nz' 'dpa_' 'n_' 'nw' '_' 'aq' 'w_' 't_' 'numoa' 'o' 'wew' 'ba_' 'r_u' 'oa' 'oa' 'm_o' 'z' '_' 'a' 'o_' 'k_' 'jai' 'kj' 'o' '___' '_' 'wu' 'u_u' 'rwn' 'hah' 'uw' 'ua''noadpxu' 'e' 'o_' 'eu' 'u' 'no_om_' '_c' 'za' 'm' 'o' 'a' 'y_n' 'o_' 'd_ua' '_a' 'nodeza' '_q' 'uu_w' 23 0,00 2,73 4,00 'noah' 'noah' 'noah' 'noa_' 'noat' 'noaq' 'noax' 'noa_' 'noaq' 'noat' 'noa' 'noaq' 'noaq' 'noaq' 'noaq' 'noaq' 'noaw' 'noak' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noa' 'nouo' 'noze' 'noo' 'naau' 'naau' 'non' 'nou_' 'noaey' 'nout' '_oa' 'noo' 'n_a' 'nza' 'noo_' 'noze' 'no' 'nou' 'nooe' 'noo' 'nou_' 'noow' 'no_' 'nou' 'nea_' 'noze' 'noee' 'nou' 'uoa' 'nuau' 'nog' 'not' 'nu' 'n' 'nw' 'noxz_' 'nonoa' 'ne' 'nean_' 'nb' 'n' 'n' 'ng_' 'to_' '_om_' 'nonoa' 'nuz' 'n_' 'q_a' 'nnxa' 'nmw_' 'nn_a' 'nau' 'ngu_' 'nw' 'nx' 'm_an' 'too' 'noo_a' 'nw' 'nw' 'ni_' 'nau' 'nw_' '_o_' 'bo' 'nmx' 'nk' 'nu_' 'nou_e' 'na' '_om_' 'ni' 'nuu' 'n_u' 'ne_' 'n_' 'no__g' 'uoe' 'tau' 'a' 'aq' 'o_' 'an' 'ba' 'nmu_o' 'noo_a_' 'i' 'q' '_rwn' 'hano' 'h' '_' 'tau' 'nodeza''noadpxe' 'nnoan' 'u_' 'ha' 'b_' 'ag' '_e' 'e__a' 'g' 'uw_' '_a' 'w_' 'at' 'u' '__' 't' 'w' 'w_' 'o' 'uuu' 'ta' 'z_' 'uu' 'nooaey' '_a' 'wew' 'za' 'jq' 'kw' 24 0,00 2,72 4,00 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noad' 'noaq' 'noa_' 'noab' 'noak' 'noat' 'noaq' 'noaq' 'noau' 'noau' 'noa' 'noa' 'noaq' 'noa_' 'noa' 'noat' 'noa' 'noa' 'noa' 'noa' 'noat' 'noa' 'noaq' 'noo' 'non' 'nouw' 'nouo' 'noage' 'no_' 'noo' 'ngae' 'now_' 'nozu' 'noo_' 'noo' 'xoat' 'noi_' 'nou' 'naad' 'noe' 'noh' 'now_' 'noadu' 'noi' 'nou' 'no' 'nooq' 'noe_' 'nou_' 'noe' 'ooa_' 'nzo' 'noaenx' '_o_' 'to' 'nx' 'nuaau' 't_a' 'nw_' 'nm' 'nwu' 'nw_' 'nx' 'n_' 'nu_a' '_o_' 'nm_n' 'nonoa' 'nom_e' 'nona_' 'nonaa' 'w_a' 'nm_' 'm_an' 'nuuu' 'no__g' 'n_' 'nu_' 'nxw_' 'noam_g' 'oja' 'new' 'n_e' 'nnu_' 'ao' 'noo_a' 'n' 'nwu' 'noi_t' 'nt' 'u' 'y' 'ugu_' 'nouoah' 'j_' 'nuoza' 'a' 'e' 'm_e' 'ue' '_u' 'aq' '_aq' 'a' 'nooxw_' 'oa' 'us' 'bx' 'mw_a' '_u' 'ha' 'zu' 'at' 'ow_' 'h_' 'oe' '_um' 'w' 'oa_' '_' '_i_' 'ze' 'ws' 'sn' 'nox_ae' 'a' 'zu' 'u' '_' 'qa' '_' 'w' '_q' 'ag' 'nooxza' 'ah' 'o' 'oa' 'nodttg' 'nip_a' 'tau' 'uu' 25 0,00 2,65 4,00 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noah' 'noab' 'noaw' 'noan' 'noab' 'noan' 'noan' 'nuah' 'noa_' 'noao' 'noa' 'noa_' 'noao' 'noa' 'noau' 'noa_' 'noam' 'noa' 'noa' 'noa' 'noq' 'nou_' 'noa_a' 'nna' 'no_' 'noe' 'noh' 'nou' 'noug' 'noo' 'noaau' 'nong' 'no_' 'nou_' 'noex' 'ngae' 'nooq' 'noo' 'no_' 'ngae' 'no_' 'nou_' 'noeq' 'nw_' 'nm_' 'n__' 'nau' 'nuw_' 'noxoa' 'nu_' 'oo' 'na_' 'noi_t' 'ne' 'nwu' 'n_e' 'ne' 'ni' 'n_' 'nke' 'nu_a' '_o' 'nem' 'ni_' 'nwu' 'nxwx' 'nuw_' 'ng' 'nxw_' 'n_' 'nonhu_' 'noxwa' 'nuoa' 'mua' 'noim_' 'uoit' 'nw_' 'nnoa' 'noi_t' 'n_' 'na' 'nonax' 'nwn' 'nak' 'ng' 'nuw_' 'w_' 'o_o_' 'ta' 'gmoa' 'zu' 'xw_' 'w_' '_' 'wu' 'a' 'a' 'o' 'u_' 'w_' 'tg' 'bu' 'e' 'w' 'u' '_i_' '_' 'w_' 'nonoaq' 'zu' 'a_' 'th' '_u' 'uw_' 'ja' 'ug_' 'ah' 'wu' 'xw_' 'gu' 'hap' 'nooxw_' 'gae' 'ae' 'u' '_a' 'oah' 'aq' 'aq' 'w_' 'nmoue' '__n' 'u_' 'a' 'g' 'aa'
Subscribe to:
Posts (Atom)