Switch to add/remove instruction mutation
This commit is contained in:
36
grow/mutate.go
Normal file
36
grow/mutate.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package grow
|
||||
|
||||
import "math"
|
||||
import "math/rand"
|
||||
|
||||
import "github.com/firestuff/subcoding/gen"
|
||||
import "github.com/firestuff/subcoding/vm"
|
||||
|
||||
func Mutate(prog *vm.Program) {
|
||||
target := int(math.Max(2, rand.NormFloat64()*10+15))
|
||||
|
||||
if len(prog.Functions[0].Instructions) < target {
|
||||
addInstruction(prog, prog.Functions[0])
|
||||
} else {
|
||||
removeInstruction(prog, prog.Functions[0])
|
||||
}
|
||||
}
|
||||
|
||||
func addInstruction(prog *vm.Program, fnc *vm.Function) {
|
||||
if len(fnc.Instructions) == 0 {
|
||||
fnc.Instructions = append(fnc.Instructions, gen.RandInstruction(prog))
|
||||
} else {
|
||||
i := rand.Intn(len(fnc.Instructions))
|
||||
fnc.Instructions = append(fnc.Instructions[:i+1], fnc.Instructions[i:]...)
|
||||
fnc.Instructions[i] = gen.RandInstruction(prog)
|
||||
}
|
||||
}
|
||||
|
||||
func removeInstruction(prog *vm.Program, fnc *vm.Function) {
|
||||
if len(fnc.Instructions) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
i := rand.Intn(len(fnc.Instructions))
|
||||
fnc.Instructions = append(fnc.Instructions[:i], fnc.Instructions[i+1:]...)
|
||||
}
|
||||
Reference in New Issue
Block a user