From 6a7d283bb78fbf8538cb4202374a32442508fbdf Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Sun, 29 Sep 2019 14:16:09 -0700 Subject: [PATCH] Frogs & Turtles (And BUGFIX) --- .~lock.predpreygraphs3.csv# | 1 - .~lock.predpreygraphs4.csv# | 1 - .~lock.predpreygraphs5.csv# | 1 - experiments/experiment.go | 5 ++ experiments/predatorprey/main.go | 7 +-- experiments/turtles-and-frogs/main.go | 78 +++++++++++++++++++++++++++ 6 files changed, 85 insertions(+), 8 deletions(-) delete mode 100644 .~lock.predpreygraphs3.csv# delete mode 100644 .~lock.predpreygraphs4.csv# delete mode 100644 .~lock.predpreygraphs5.csv# create mode 100644 experiments/turtles-and-frogs/main.go diff --git a/.~lock.predpreygraphs3.csv# b/.~lock.predpreygraphs3.csv# deleted file mode 100644 index 31f6307..0000000 --- a/.~lock.predpreygraphs3.csv# +++ /dev/null @@ -1 +0,0 @@ -,sarah,cassandra,28.09.2019 15:14,file:///home/sarah/.config/libreoffice/4; \ No newline at end of file diff --git a/.~lock.predpreygraphs4.csv# b/.~lock.predpreygraphs4.csv# deleted file mode 100644 index 448dd8a..0000000 --- a/.~lock.predpreygraphs4.csv# +++ /dev/null @@ -1 +0,0 @@ -,sarah,cassandra,28.09.2019 15:34,file:///home/sarah/.config/libreoffice/4; \ No newline at end of file diff --git a/.~lock.predpreygraphs5.csv# b/.~lock.predpreygraphs5.csv# deleted file mode 100644 index 370bf66..0000000 --- a/.~lock.predpreygraphs5.csv# +++ /dev/null @@ -1 +0,0 @@ -,sarah,cassandra,28.09.2019 15:59,file:///home/sarah/.config/libreoffice/4; \ No newline at end of file diff --git a/experiments/experiment.go b/experiments/experiment.go index 6e85a79..2bf70e0 100644 --- a/experiments/experiment.go +++ b/experiments/experiment.go @@ -46,6 +46,10 @@ func (e *Experiment) InitializeExperiment() { panic(err) } + e.OnStep = func(environment *core.Environment, turtles []*core.Turtle, i int) { + + } + e.env = core.NewEnvironment(*width, *height) e.turtles = make([]*core.Turtle, 0) e.graphics = graphics.NewGraphics(int32(*width), int32(*height), int32(*pxsize)) @@ -90,6 +94,7 @@ func (e *Experiment) Run() { step := 0 for running { e.graphics.Render(e.env, e.turtles) + e.OnStep(e.env, e.turtles, step) newTurtles := make([]*core.Turtle, 0) diff --git a/experiments/predatorprey/main.go b/experiments/predatorprey/main.go index 6276d64..b4d500a 100644 --- a/experiments/predatorprey/main.go +++ b/experiments/predatorprey/main.go @@ -18,8 +18,6 @@ var preyReproductiveAge = flag.Int("preyReproductiveAge", 4, "the age a prey mig var preyReproductionEnergy = flag.Int("preyReproductionEnergy", 4, "energy required for prey reproduction") var preyReproductionProbability = flag.Float64("preyReproductionProbability", 0.4, "preys probability of reproducing") - - var numPred = flag.Int("numPred", 30, "the number of predators") var initialPredatorEnergy = flag.Int("initialPredatorEnergy", 40, "initial predator energy") var predatorMaxLife = flag.Int("predatorMaxLife", 60, "the max lifespan of predators (in simulation steps)") @@ -27,7 +25,6 @@ var predatorMaxEnergy = flag.Int("predatorMaxEnergy", 30, "max amount of energy var predatorReproductionEnergy = flag.Int("predatorReproductionEnergy", 50, "predator reproductive energy") var predatorReproductionProbability = flag.Float64("predatorReproductionProbability", 0.05, "predators probability of reproducing") - type Predator struct { Steps int Energy int @@ -127,7 +124,7 @@ func main() { if turtle.GetAttribute("type") == "prey" && turtle.GetAttribute("status") != "dead" { alive++ prey := turtle.GetActor().(*Prey) - if prey.Steps > (*preyReproductiveAge) && prey.Energy > (*preyReproductionEnergy) && float64(rand.Intn(100)) < (100*(*preyReproductionProbability)) { + if prey.Steps > (*preyReproductiveAge) && prey.Energy > (*preyReproductionEnergy) && float64(rand.Intn(100)) < (100*(*preyReproductionProbability)) { experiment.InitNTurtles(func() core.Actor { sm := new(Prey) return sm @@ -151,7 +148,7 @@ func main() { } } //if step == 0 { - fmt.Printf("%v,%v,%v\n", step, alive, predalive) + fmt.Printf("%v,%v,%v\n", step, alive, predalive) //} } experiment.Run() diff --git a/experiments/turtles-and-frogs/main.go b/experiments/turtles-and-frogs/main.go new file mode 100644 index 0000000..ad7b1cb --- /dev/null +++ b/experiments/turtles-and-frogs/main.go @@ -0,0 +1,78 @@ +package main + +import ( + "flag" + "git.openprivacy.ca/sarah/microworlds/core" + "git.openprivacy.ca/sarah/microworlds/experiments" + "image/color" +) + +var numFrogs = flag.Int("numFrogs", 5000, "the number of frogs") +var move = flag.Bool("move", true, "") +var turtlePreference = flag.Float64("turtlePreference", 0.3, "") +var frogPreference = flag.Float64("frogPreference", 0.3, "") + +type Frog struct { +} + +func (sm *Frog) Setup(env *core.Environment, t *core.Turtle) { + // Do nothing + t.SetAttribute("type", "frog") + t.SetColor(color.RGBA{0, 255, 255, 0}) +} + +func (sm *Frog) Run(env *core.Environment, t *core.Turtle) { + t.Wiggle() + amountTurtle := t.Amount(env, 1, "turtle-scent") + amountFrog := t.Amount(env, 1, "frog-scent") + if amountFrog > 1 && amountFrog > (amountTurtle+amountFrog)*float32(*frogPreference) { + // Do Nothing + } else { + if *move { + t.Step(env) + } + } + t.Drop(env, 1, "frog-scent") +} + +type Turtle struct { +} + +func (sm *Turtle) Setup(env *core.Environment, t *core.Turtle) { + // Do nothing + t.SetAttribute("type", "turtle") + t.SetColor(color.RGBA{255, 000, 0, 0}) +} + +func (sm *Turtle) Run(env *core.Environment, t *core.Turtle) { + t.Wiggle() + amountTurtle := t.Amount(env, 1, "turtle-scent") + amountFrog := t.Amount(env, 1, "frog-scent") + if amountTurtle > 1 && amountTurtle > (amountTurtle+amountFrog)*float32(*turtlePreference) { + // Do Nothing + } else { + if *move { + t.Step(env) + } + } + t.Drop(env, 1, "turtle-scent") +} + +func main() { + experiment := new(experiments.Experiment) + experiment.InitializeExperiment() + num := -1 + experiment.InitNTurtles(func() core.Actor { + num++ + if num%2 == 0 { + sm := new(Frog) + return sm + } + return new(Turtle) + }, *numFrogs+experiment.GetNumTurtles()) + + experiment.InitPheromone("turtle-scent", color.RGBA{0xFF, 0x00, 0x00, 0x00}) + experiment.InitPheromone("frog-scent", color.RGBA{0x00, 0xFF, 0xFF, 0x00}) + + experiment.Run() +}