-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexample_1.js
80 lines (67 loc) · 2.39 KB
/
example_1.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
// @ts-check
'use strict'
const GA = require('./vovk-ga')
const trainer = new GA()
console.log(`Example 1: Simple function optimization`)
const MY_FUNCTION = (x, y, z) => Math.sqrt(x ** 2 + y ** 2 + z ** 2)
const desired_output = Math.PI // Desired function output
// (1) Direct return fitness function
// const myFitnessFunction = (sample) => {
// const { x, y, z } = sample
// const desired_output = Math.PI // Desired function output
// const actual_output = MY_FUNCTION(x, y, z) // My function
// const loss = Math.abs(desired_output - actual_output)
// return loss
// }
// (2) Promise return fitness function
// const myFitnessFunction = (sample) => new Promise((resolve, reject) => {
// try {
// const { x, y, z } = sample
// const actual_output = MY_FUNCTION(x, y, z) // My function
// const loss = Math.abs(desired_output - actual_output)
// resolve(loss)
// } catch (e) { reject(e) }
// })
// (3) Promise return fitness function with async/await
const myFitnessFunction = async (sample) => {
const { x, y, z } = sample
const actual_output = MY_FUNCTION(x, y, z) // My function
const loss = Math.abs(desired_output - actual_output)
return loss
}
const parameters = [
{ variable: 'x', type: 'number', range: { min: -20, max: 20 } },
{ variable: 'y', type: 'number', range: { min: -20, max: 20 }, snap: 1 },
{ variable: 'z', type: 'number', range: { min: -20, max: 20 }, snap: 0.1 },
// { variable: 'p', type: 'option', options: [1.0, 1.2, 1.4, 1.6, 1.8, 2.0] }
]
const logProgress = progress => {
console.log(progress.message)
}
const logResult = result => {
console.log(result.message)
const { x, y, z } = result.parameters
console.log(`Test ${MY_FUNCTION.toString()} ---> ${MY_FUNCTION(x, y, z)}`)
}
const config = {
debug: false,
maxPopulation: 1000,
//survivors: 10,
survivorsPERCENT: 0.05,
crossoverChance: 0.25,
mutationChance: 0.50,
mutationPower: 0.25,
parameters: parameters,
initialValues: { x: 1, y: 1, z: 1 },
fitnessTargetValue: 0,
//fitnessTargetTolerance: 1e-15,
bestSurvive: true,
fitnessFunction: myFitnessFunction,
fitnessTimeout: 10000
}
const main = async () => {
trainer.configure(config)
const result = await trainer.evolve(100, logProgress)
logResult(result)
}
main().catch(console.error)