Switch to add/remove instruction mutation

This commit is contained in:
Ian Gulliver
2021-11-22 20:33:22 -08:00
parent 8f712688b9
commit a5e44a7e07
8 changed files with 52 additions and 36 deletions

View File

@@ -4,7 +4,6 @@ import "io"
import "gopkg.in/yaml.v2"
import "github.com/firestuff/subcoding/gen"
import "github.com/firestuff/subcoding/vm"
type Definition struct {
@@ -37,10 +36,19 @@ func (def *Definition) Grow(statusChan chan<- Status) (*vm.Program, error) {
statusChan <- status
}
prog := &vm.Program{
GlobalMemorySize: def.GlobalMemorySize,
FunctionMemorySize: def.FunctionMemorySize,
InstructionLimit: def.InstructionLimit,
Functions: []*vm.Function{
&vm.Function{},
},
}
for {
status.Attempts++
prog := gen.RandProgram(def.GlobalMemorySize, def.FunctionMemorySize, def.InstructionLimit)
Mutate(prog)
score, err := def.score(prog)
if err != nil {

View File

@@ -1,6 +1,6 @@
global_memory_size: 1
function_memory_size: 1
instruction_limit: 2
instruction_limit: 10
samples:
- in: [0]
out: [0]

36
grow/mutate.go Normal file
View 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:]...)
}