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
|