Evolutionary algorithm: Difference between revisions

Content deleted Content added
Line 4,595:
let _possibilities: String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
let _c: U16 = 100 // number of spawn per generation
let _minMutateRate_min_mutate_rate: F64 = 0.09
let _perfectFitness_perfect_fitness: USize = _target.size()
var _parent: String = ""
Line 4,604:
var iter: U64 = 0
while not _target.eq(_parent) do
let rate: F64 = newMutateRatenew_mutate_rate()
iter = iter + 1
if (iter % 100) == 0 then
Line 4,611:
_env.out.print(", rate: " + rate.string())
end
var bestSpawnbest_spawn = ""
var bestFitbest_fit: USize = 0
var i: U16 = 0
while i < _c do
let spawn = mutate(_parent, rate)
let spawn_fitness = fitness(spawn)
if spawn_fitness > bestFitbest_fit then
bestSpawnbest_spawn = spawn
bestFitbest_fit = spawn_fitness
end
i = i + 1
end
if bestFitbest_fit > fitness(_parent) then
_parent = bestSpawnbest_spawn
end
end
Line 4,630:
 
fun fitness(trial: String): USize =>
var retValret_val: USize = 0
var i: USize = 0
while i < trial.size() do
try
if trial(i) == _target(i) then
retValret_val = retValret_val + 1
end
end
i = i + 1
end
retValret_val
 
fun newMutateRatenew_mutate_rate(): F64 =>
let perfectFitperfect_fit = _perfectFitness_perfect_fitness.f64()
((perfectFitperfect_fit - fitness(_parent).f64()) / perfectFitperfect_fit) * (1.0 - _minMutateRate_min_mutate_rate)
 
fun ref mutate(parent: String box, rate: F64): String =>
var retValret_val = recover trn String end
for char in parent.values() do
let rndRealrnd_real: F64 = _rand.real()
if rndRealrnd_real <= rate then
let rndIntrnd_int: U64 = _rand.int(_possibilities.size().u64())
try
retValret_val.push(_possibilities(rndIntrnd_int.usize()))
end
else
retValret_val.push(char)
end
end
consume retValret_val</lang>
Output:
<pre>100: UMMMDNKR IEIIB IIKZ A THAHEL, fitness: 14, rate: 0.455