<html>
|
|
<head>
|
|
|
|
<script>
|
|
|
|
class Gene
|
|
{
|
|
constructor(min, max, value)
|
|
{
|
|
this.min = min;
|
|
this.max = max;
|
|
this.value = value;
|
|
}
|
|
|
|
getRealValue()
|
|
{
|
|
return (this.max - this.min) * this.value + this.min;
|
|
}
|
|
|
|
getValue()
|
|
{
|
|
return this.value;
|
|
}
|
|
|
|
setValue(val)
|
|
{
|
|
this.value = val;
|
|
}
|
|
|
|
makeClone()
|
|
{
|
|
return new Gene(this.min, this.max, this.value);
|
|
}
|
|
}
|
|
|
|
|
|
class Chromosome
|
|
{
|
|
constructor(geneArray)
|
|
{
|
|
this.genes = [];
|
|
for(let i = 0; i < geneArray.length; i++)
|
|
{
|
|
this.genes.push(geneArray[i].makeClone());
|
|
}
|
|
}
|
|
|
|
getGenes()
|
|
{
|
|
return this.genes;
|
|
}
|
|
|
|
mutate()
|
|
{
|
|
this.genes[Math.round(Math.random() * (this.genes.length-1))].setValue(Math.random());
|
|
}
|
|
}
|
|
|
|
|
|
const mate = function(father, mother)
|
|
{
|
|
let son = new Chromosome(father.getGenes());
|
|
let daughter = new Chromosome(mother.getGenes());
|
|
|
|
for(let i = 0;i < son.getGenes().length; i++)
|
|
{
|
|
let blendCoef = Math.random();
|
|
blendGene(son.getGenes()[i], daughter.getGenes()[i], blendCoef);
|
|
}
|
|
};
|
|
|
|
const blendGene = function(gene1, gene2, blendCoef)
|
|
{
|
|
let value1 = (blendCoef * gene1.getValue()) +
|
|
(gene2.getValue() * (1- blendCoef));
|
|
let value2 = ((1-blendCoef) * gene1.getValue()) +
|
|
(gene2.getValue() * blendCoef);
|
|
|
|
gene1.setValue(value1);
|
|
gene2.setValue(value2);
|
|
};
|
|
|
|
let gene1 = new Gene(1,10,.6);
|
|
let gene2 = new Gene(2,5,0.4);
|
|
let geneList = [gene1, gene2];
|
|
|
|
var c = new Chromosome(geneList);
|
|
var c2 = new Chromosome(c.getGenes());
|
|
console.log(c.getGenes());
|
|
console.log(c2.getGenes());
|
|
c.mutate();
|
|
c.mutate();
|
|
console.log(c.getGenes());
|
|
console.log(c2.getGenes());
|
|
</script>
|
|
|
|
</head>
|
|
|
|
|
|
<body>
|
|
</body>
|
|
|
|
|
|
</html>
|