-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample3.js
More file actions
81 lines (70 loc) · 2.39 KB
/
Copy pathexample3.js
File metadata and controls
81 lines (70 loc) · 2.39 KB
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
/**
* THIS EXAMPLE WORKS ONLY ON NODEJS ENVIRONMENT, BECAUSE IT USES child_process MODULE (in createNodeJSWorker function)
*/
const Genemo = require('../../lib');
const distances = require('../data/distances17.json');
const mapInAsyncChunks = require('./utils/mapInAsyncChunks');
const createParallelExecutor = require('./utils/createParallelExecutor');
const { createNodeJSWorker } = require('./utils/createWorker');
const cities = [...Array(distances.length).keys()];
const generateIndividual = Genemo.randomPermutationOf(cities);
const WORKERS_NUMBER = 4;
// ---EVALUATE POPULATION---
const [evaluateChunk, terminateEvaluateWorkers] = createParallelExecutor({
workersNumber: WORKERS_NUMBER,
workerFileName: './examples/example3-parallelExecution/evaluateChunkWorker.js',
createWorker: createNodeJSWorker,
});
const evaluatePopulation = mapInAsyncChunks({
numberOfChunks: WORKERS_NUMBER,
mapFunction: evaluateChunk,
});
// ---REPRODUCE---
const [crossoverChunk, terminateCrossoverWorkers] = createParallelExecutor({
workersNumber: WORKERS_NUMBER,
workerFileName: './examples/example3-parallelExecution/crossoverChunkWorker.js',
createWorker: createNodeJSWorker,
});
const crossoverInChunks = mapInAsyncChunks({
numberOfChunks: WORKERS_NUMBER,
mapFunction: crossoverChunk,
});
const map = transform => (array, ...args) => array.map(item => transform(item, ...args));
const reproduce = Genemo.reproduceBatch({
crossoverAll: crossoverInChunks,
mutateAll: map(Genemo.mutation.swapTwoGenes()),
mutationProbability: 0.02,
});
// ---EVOLUTION OPTIONS---
const evolutionOptions = {
generateInitialPopulation: Genemo.generateInitialPopulation({
generateIndividual,
size: 160,
}),
selection: Genemo.selection.rank({ minimizeFitness: true }),
reproduce,
evaluatePopulation,
stopCondition: Genemo.stopCondition({ maxIterations: 100 }),
iterationCallback: Genemo.logIterationData({
include: {
iteration: { show: true },
logsKeys: [
{ key: 'lastIteration' },
],
},
}),
};
// Run genetic algorithm
console.time('Execution time:');
Genemo.run(evolutionOptions).then(({ iteration, getLowestFitnessIndividual }) => {
console.timeEnd('Execution time:');
console.log({
iteration,
shortestPath: getLowestFitnessIndividual().fitness,
});
})
.catch(console.error)
.finally(() => {
terminateEvaluateWorkers();
terminateCrossoverWorkers();
});