diff options
-rw-r--r-- | src/genome/README.md | 12 | ||||
-rw-r--r-- | src/genome/genome.js | 2 | ||||
-rw-r--r-- | src/genome/genome.test.js | 6 |
3 files changed, 16 insertions, 4 deletions
diff --git a/src/genome/README.md b/src/genome/README.md new file mode 100644 index 0000000..1135ed0 --- /dev/null +++ b/src/genome/README.md @@ -0,0 +1,12 @@ +src/genome
+==========
+
+Genomes represent the neural network that underlies a creature. They are an array of tuples of the form `[ source, sink, weight ]`, where:
+
+ * `source` is an integer in the range `[0, N - num_outputs)`, representing the index of the source neuron
+ * `sink` is an integer in the range `[num_inputs, N)`, representing the index of the sink neuron
+ * `weight` is a floating-point value in the range `[-4, 4]`, representing the weight of the connection
+
+`num_input` and `num_output` are fixed by the environment (as they are the input senses and output actions of the creature, respectively).
+`N` is not fixed, but is instead determined by the maximum index present in the genome. As long as the maximum index is greater than or
+equal to `num_input + num_output`, the genome is considered valid.
diff --git a/src/genome/genome.js b/src/genome/genome.js index 8e0c9f0..e2bf83e 100644 --- a/src/genome/genome.js +++ b/src/genome/genome.js @@ -41,7 +41,7 @@ export function mutate(gene, type, value) { case mutation_type.weight:
const w = (8*value) - 4;
- return [ source, sink, w ];
+ return [ source, sink, 0.5*(w + weight) ];
default:
throw new Error(`unknown mutation type: '${type}'`);
diff --git a/src/genome/genome.test.js b/src/genome/genome.test.js index 853d103..ca56092 100644 --- a/src/genome/genome.test.js +++ b/src/genome/genome.test.js @@ -14,7 +14,7 @@ test('basic gene mutations', () => { expect(mutate([0, 1, 2], mutation_type.sink, 0.8)).toEqual([0, 2, 2]);
expect(mutate([0, 0, 2], mutation_type.sink, 0.2)).toEqual([0, 0, 2]);
- expect(mutate([0, 1, 2], mutation_type.weight, 0.5)).toEqual([0, 1, 0]);
- expect(mutate([0, 1, 2], mutation_type.weight, 0.0)).toEqual([0, 1, -4]);
- expect(mutate([0, 1, 2], mutation_type.weight, 1.0)).toEqual([0, 1, 4]);
+ expect(mutate([0, 1, 2], mutation_type.weight, 0.5)).toEqual([0, 1, 1]);
+ expect(mutate([0, 1, 2], mutation_type.weight, 0.0)).toEqual([0, 1, -1]);
+ expect(mutate([0, 1, 2], mutation_type.weight, 1.0)).toEqual([0, 1, 3]);
});
|