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