-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathphrase-solver.js
111 lines (101 loc) · 2.65 KB
/
phrase-solver.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
const geneLib = require('../../lib');
const pasync = require('pasync');
const Phrase = require('../lib/phrase');
const AsyncPhrase = require('../lib/async-phrase');
const AsyncSelector = require('../lib/async-selector');
describe('Phrase Solver', function() {
const target = 'hello, world!';
it('works with deterministic binary tournament selection', function() {
return geneLib.run({
generationSize: 100,
generationLimit: 1000,
chromosomeClass: Phrase,
createArg: target
})
.then((result) => {
expect(result.best.chromosome.str).to.equal(target);
});
});
it('works with weighted ternary tournament selection', function() {
return geneLib.run({
generationSize: 100,
generationLimit: 1000,
chromosomeClass: Phrase,
createArg: target,
selectorSettings: {
tournamentSize: 3,
baseWeight: 0.75
}
})
.then((result) => {
expect(result.best.chromosome.str).to.equal(target);
});
});
it('works with roulette selection', function() {
return geneLib.run({
generationSize: 100,
generationLimit: 1000,
chromosomeClass: Phrase,
createArg: target,
selector: 'roulette'
})
.then((result) => {
expect(result.best.chromosome.str).to.equal(target);
});
});
it('works with asynchronous component operations', function() {
return geneLib.run({
generationSize: 100,
generationLimit: 1000,
chromosomeClass: AsyncPhrase,
createArg: target,
selectorClass: AsyncSelector
})
.then((result) => {
expect(result.best.chromosome.str).to.equal(target);
});
});
it('supports onGeneration hook', function() {
let generationCounts = [];
return geneLib.run({
generationSize: 100,
generationLimit: 5,
chromosomeClass: Phrase,
createArg: target,
solutionFitness: false,
onGeneration: (state) => {
generationCounts.push(state.generationCount);
}
})
.then(() => {
expect(generationCounts).to.deep.equal([ 0, 1, 2, 3, 4, 5 ]);
});
});
it('does not block for entire normal operation', function() {
let runFinished = false;
let runPromise = geneLib.run({
generationSize: 100,
generationLimit: 500,
chromosomeClass: Phrase,
createArg: target,
solutionFitness: false,
})
.then(() => {
runFinished = true;
});
let otherPromise = pasync.setTimeout(10)
.then(() => {
expect(runFinished).to.be.false;
});
return Promise.all([ runPromise, otherPromise ]);
});
it('supports blocking, fully synchronous operation', function() {
let result = geneLib.runSync({
generationSize: 100,
generationLimit: 1000,
chromosomeClass: Phrase,
createArg: target
});
expect(result.best.chromosome.str).to.equal(target);
});
});