From 47eed67c898a328438336871c6b4d975cae76cd4 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Sun, 29 Sep 2019 21:52:01 -0700 Subject: [PATCH] Adversarial Strategies --- core/environment.go | 9 +++-- core/turtle.go | 4 +-- experiments/experiment.go | 2 +- experiments/slimemold/main.go | 2 +- experiments/snowball/main.go | 49 +++++++++++++++++++++++++-- experiments/turtles-and-frogs/main.go | 8 ++--- graphics/graphics.go | 4 +-- 7 files changed, 59 insertions(+), 19 deletions(-) diff --git a/core/environment.go b/core/environment.go index 4e76c6c..6fa632f 100644 --- a/core/environment.go +++ b/core/environment.go @@ -15,10 +15,10 @@ func (e *Environment) Height() int { return e.height } -func (e * Environment) GetPheromones() []string { - keys := make([]string,len(e.state)) - i:=0 - for k,_ := range e.state { +func (e *Environment) GetPheromones() []string { + keys := make([]string, len(e.state)) + i := 0 + for k := range e.state { keys[i] = k i++ } @@ -112,7 +112,6 @@ func (e *Environment) normXY(x int, y int) (int, int) { return x, y } - func (e *Environment) Evaporate(rate float32, pheromone string) { for x := 0; x < e.width; x++ { for y := 0; y < e.height; y++ { diff --git a/core/turtle.go b/core/turtle.go index 10b8f04..b811ec9 100644 --- a/core/turtle.go +++ b/core/turtle.go @@ -110,15 +110,13 @@ func (t *Turtle) Drop(env *Environment, amount float32, pheromone string) { func (t *Turtle) AmountAll(env *Environment, distance int, pheromone string) float32 { total := float32(0) - for i:=0;i<8;i++ { + for i := 0; i < 8; i++ { dx0 := headings[i][0] * distance dy0 := headings[i][1] * distance x0 := (t.xpos + dx0) y0 := (t.ypos + dy0) - - total += env.SniffNormalized(x0, y0, pheromone) } diff --git a/experiments/experiment.go b/experiments/experiment.go index 41f07b6..9a90212 100644 --- a/experiments/experiment.go +++ b/experiments/experiment.go @@ -25,7 +25,7 @@ type Experiment struct { turtles []*core.Turtle graphics *graphics.Graphics initializedTurtles int - pheromones []string + pheromones []string OnStep func(*core.Environment, []*core.Turtle, int) } diff --git a/experiments/slimemold/main.go b/experiments/slimemold/main.go index 85d914b..319b382 100644 --- a/experiments/slimemold/main.go +++ b/experiments/slimemold/main.go @@ -14,7 +14,7 @@ type SlimeMold struct { } func (sm *SlimeMold) Setup(env *core.Environment, t *core.Turtle) { - t.SetColor(color.RGBA{100,255,10,0}) + t.SetColor(color.RGBA{100, 255, 10, 0}) } func (sm *SlimeMold) Run(env *core.Environment, t *core.Turtle) { diff --git a/experiments/snowball/main.go b/experiments/snowball/main.go index b909713..effae83 100644 --- a/experiments/snowball/main.go +++ b/experiments/snowball/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + "fmt" "git.openprivacy.ca/sarah/microworlds/core" "git.openprivacy.ca/sarah/microworlds/experiments" "image/color" @@ -10,7 +11,9 @@ import ( ) var prob = flag.Float64("distribution", .51, "drives the probability of color assignment of turtles in consensus models, closer to .5 results in more even assignment, closer to 0 or 1 biases in favor of a color.") +var initialSureness = flag.Int("initialSureness", 2, "how sure an honest node is of their first received colour") var byzantineTurtles = flag.Int("byzantineTurtles", 50, "in consensus simlulations, the number of turtles who will always vote 2") +var cleverByzantineTurtles = flag.Bool("cleverByzantineTurtles", true, "byzantine turtles try to find each other") type Snowball struct { color int @@ -26,17 +29,34 @@ func (sm *Snowball) Setup(env *core.Environment, t *core.Turtle) { } else { sm.color = 1 } - sm.sureness = 2 + sm.sureness = float32(*initialSureness) +} + +func (sm *Snowball) GetColor() int { + return sm.color } func (sm *Snowball) Run(env *core.Environment, t *core.Turtle) { if sm.Byztantine { t.Wiggle() + if *cleverByzantineTurtles { + + t.FollowGradient(env, 5, 2, "3") + t.Drop(env, 1, "3") + } + sm.color = 2 + t.SetColor(color.RGBA{255, 0, 0, 0}) t.Drop(env, 1, "2") + } else { + if sm.color == 1 { + t.SetColor(color.RGBA{0, 255, 0, 0}) + } else { + t.SetColor(color.RGBA{255, 0, 255, 0}) + } t.Wiggle() - am1 := t.Amount(env, 1, "1") - am2 := t.Amount(env, 1, "2") + am1 := t.AmountAll(env, 1, "1") + am2 := t.AmountAll(env, 1, "2") if am1 > sm.sureness || am2 > sm.sureness { if am1 > am2 { @@ -85,5 +105,28 @@ func main() { }, (*byzantineTurtles)) experiment.InitPheromone("1", color.RGBA{0x00, 0xFF, 0x00, 0x00}) experiment.InitPheromone("2", color.RGBA{0xFF, 0x00, 0xFF, 0x00}) + experiment.InitPheromone("3", color.RGBA{0xFF, 0x00, 0x00, 0x00}) + + experiment.OnStep = func(env *core.Environment, turtles []*core.Turtle, step int) { + num1 := 0 + num2 := 0 + + env.EvaporateAndDiffuse(0.99, "1") + env.EvaporateAndDiffuse(0.99, "2") + env.EvaporateAndDiffuse(0.99, "3") + + for _, turtle := range turtles { + agent := turtle.GetActor().(*Snowball) + if agent.GetColor() == 1 { + num1++ + } else { + num2++ + } + } + //if step == 0 { + fmt.Printf("%v,%v,%v\n", step, num1, num2) + //} + } + experiment.Run() } diff --git a/experiments/turtles-and-frogs/main.go b/experiments/turtles-and-frogs/main.go index 66192ad..1088dbb 100644 --- a/experiments/turtles-and-frogs/main.go +++ b/experiments/turtles-and-frogs/main.go @@ -22,7 +22,7 @@ func (sm *Frog) Setup(env *core.Environment, t *core.Turtle) { } func (sm *Frog) Run(env *core.Environment, t *core.Turtle) { - t.FollowGradient(env,1,1,"frog-scent") + t.FollowGradient(env, 1, 1, "frog-scent") t.Wiggle() amountTurtle := t.AmountAll(env, 1, "turtle-scent") amountFrog := t.AmountAll(env, 1, "frog-scent") @@ -46,7 +46,7 @@ func (sm *Turtle) Setup(env *core.Environment, t *core.Turtle) { } func (sm *Turtle) Run(env *core.Environment, t *core.Turtle) { - t.FollowGradient(env,1,1,"turtle-scent") + t.FollowGradient(env, 1, 1, "turtle-scent") t.Wiggle() amountTurtle := t.AmountAll(env, 1, "turtle-scent") amountFrog := t.AmountAll(env, 1, "frog-scent") @@ -77,8 +77,8 @@ func main() { experiment.InitPheromone("frog-scent", color.RGBA{0x00, 0xFF, 0xFF, 0x00}) experiment.OnStep = func(env *core.Environment, turtles []*core.Turtle, i int) { - env.Evaporate(.99, "turtle-scent") - env.Evaporate(.99, "frog-scent") + env.Evaporate(.99, "turtle-scent") + env.Evaporate(.99, "frog-scent") } experiment.Run() diff --git a/graphics/graphics.go b/graphics/graphics.go index a5793a0..0bec68b 100644 --- a/graphics/graphics.go +++ b/graphics/graphics.go @@ -99,7 +99,7 @@ func (g *Graphics) Render(env *core.Environment, turtles []*core.Turtle) { g.renderer.Present() g.window.UpdateSurface() -// surface, _ := g.window.GetSurface() -// surface.SaveBMP("./images/" + strconv.Itoa(g.t) + ".bmp") + // surface, _ := g.window.GetSurface() + // surface.SaveBMP("./images/" + strconv.Itoa(g.t) + ".bmp") g.t++ }