67 lines
1.4 KiB
Nim
67 lines
1.4 KiB
Nim
import strutils
|
|
import json
|
|
import random
|
|
import times
|
|
import os
|
|
|
|
import input_type
|
|
import map_type
|
|
import turtle
|
|
import turtle_type
|
|
import score
|
|
import select
|
|
import mutate
|
|
import display
|
|
|
|
let now = getTime()
|
|
var seed = now.toUnix * 1_000_000_000 + now.nanosecond
|
|
if paramCount() > 0:
|
|
seed = parseInt(paramStr(1))
|
|
|
|
randomize(seed)
|
|
|
|
# first, get the inputs
|
|
let input = readFile("input.json").parseJson().to(Input)
|
|
|
|
if input.bits < 4 or input.bits > 32:
|
|
raise newException(Defect, "bits in input json must be between 4 and 32 (inclusive).")
|
|
|
|
# get a map
|
|
let map = input.generateMap()
|
|
|
|
# get population turtles
|
|
var turtles: seq[Turtle]
|
|
for i in 0..input.population-1:
|
|
turtles.add(input.genTurtle())
|
|
|
|
var lastTime = cpuTime()
|
|
|
|
proc generation(generationNumber: int) =
|
|
# does a whole generation
|
|
|
|
# gets the path of the turtles
|
|
for turtle in turtles:
|
|
turtle.execute(map, input)
|
|
score(turtle, map, input)
|
|
|
|
# display generation
|
|
|
|
if generationNumber mod 500 == 0:
|
|
let newTime = cpuTime()
|
|
let timeSeconds = newTime - lastTime
|
|
lastTime = newTime
|
|
displayGeneration(generationNumber, timeSeconds, seed.int(), input, map, turtles)
|
|
|
|
turtles.select(input)
|
|
|
|
# add mutated turtles from previous generation
|
|
let prevGenCount = turtles.high()
|
|
while turtles.len() < input.population:
|
|
let basis = turtles[rand(prevGenCount)]
|
|
turtles.add(mutate(basis, input))
|
|
|
|
|
|
var i = 0
|
|
while true:
|
|
generation(i)
|
|
inc i |