Add Slush Consensus
This commit is contained in:
parent
b77b03f570
commit
11c0543c1d
|
@ -8,33 +8,34 @@ import (
|
||||||
|
|
||||||
type Slush struct {
|
type Slush struct {
|
||||||
color int
|
color int
|
||||||
|
Probability float32
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sm *Slush) Setup(env *core.Environment, t *core.Turtle) {
|
func (sm *Slush) Setup(env *core.Environment, t *core.Turtle) {
|
||||||
sm.color = rand.Intn(2) + 1
|
num := rand.Intn(100)
|
||||||
if sm.color !=1 && sm.color !=2 {
|
if num >= int(sm.Probability*100.0) {
|
||||||
panic("wrong color")
|
sm.color = 2
|
||||||
|
} else {
|
||||||
|
sm.color = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sm *Slush) Run(env *core.Environment, t *core.Turtle) {
|
func (sm *Slush) Run(env *core.Environment, t *core.Turtle) {
|
||||||
t.Wiggle()
|
t.Wiggle()
|
||||||
notChanged := true
|
am1 := t.Amount(env,1,"1")
|
||||||
threshold := float32(1.0)
|
am2 := t.Amount(env,1,"2")
|
||||||
for notChanged {
|
|
||||||
notChanged = false
|
t.Drop(env, 1, strconv.Itoa(sm.color))
|
||||||
if t.Near(env, 1, threshold, "1") {
|
|
||||||
|
|
||||||
|
if am1 > 3 || am2 > 3 {
|
||||||
|
if am1 > am2 {
|
||||||
sm.color = 1
|
sm.color = 1
|
||||||
notChanged = true
|
} else if am2 > am1 {
|
||||||
}
|
|
||||||
if t.Near(env, 1, threshold, "2") {
|
|
||||||
sm.color = 2
|
sm.color = 2
|
||||||
notChanged = true
|
|
||||||
}
|
}
|
||||||
threshold+=0.01
|
|
||||||
}
|
}
|
||||||
t.Step(env)
|
t.Step(env)
|
||||||
t.Drop(env, 1, strconv.Itoa(sm.color))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
package actors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.openprivacy.ca/sarah/microworlds/core"
|
|
||||||
"math/rand"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Snowball struct {
|
|
||||||
color int
|
|
||||||
sureness int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm *Snowball) Setup(env *core.Environment, t *core.Turtle) {
|
|
||||||
sm.color = rand.Intn(2) + 1
|
|
||||||
if sm.color !=1 && sm.color !=2 {
|
|
||||||
panic("wrong color")
|
|
||||||
}
|
|
||||||
sm.sureness = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm *Snowball) Run(env *core.Environment, t *core.Turtle) {
|
|
||||||
t.Wiggle()
|
|
||||||
if sm.color == 1 && t.Near(env, 1, float32(sm.sureness), "1") {
|
|
||||||
sm.sureness++
|
|
||||||
} else if sm.color == 1 && t.Near(env, 1, float32(sm.sureness), "2") {
|
|
||||||
sm.sureness = 0
|
|
||||||
sm.color = 2
|
|
||||||
} else if sm.color == 2 && t.Near(env, 1, float32(sm.sureness), "2") {
|
|
||||||
sm.sureness++
|
|
||||||
} else if sm.color == 2 && t.Near(env, 1, float32(sm.sureness), "1") {
|
|
||||||
sm.sureness = 0
|
|
||||||
sm.color = 1
|
|
||||||
}
|
|
||||||
t.Step(env)
|
|
||||||
t.Drop(env, 1, strconv.Itoa(sm.color))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,37 @@ func (t *Turtle) Drop(env *Environment, amount float32, pheromone string) {
|
||||||
env.Mark(pheromone, t.xpos, t.ypos, amount)
|
env.Mark(pheromone, t.xpos, t.ypos, amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Turtle) Amount(env *Environment, distance int, pheromone string) float32 {
|
||||||
|
h0 := t.heading - 1
|
||||||
|
if h0 < 0 {
|
||||||
|
h0 = 7
|
||||||
|
}
|
||||||
|
|
||||||
|
dx0 := headings[h0][0] * distance
|
||||||
|
dy0 := headings[h0][1] * distance
|
||||||
|
|
||||||
|
x0 := (t.xpos + dx0)
|
||||||
|
y0 := (t.ypos + dy0)
|
||||||
|
|
||||||
|
dx := headings[t.heading][0] * distance
|
||||||
|
dy := headings[t.heading][1] * distance
|
||||||
|
|
||||||
|
x := (t.xpos + dx)
|
||||||
|
y := (t.ypos + dy)
|
||||||
|
|
||||||
|
h1 := (t.heading + 1) % 8
|
||||||
|
dx1 := headings[h1][0] * distance
|
||||||
|
dy1 := headings[h1][1] * distance
|
||||||
|
|
||||||
|
x1 := (t.xpos + dx1)
|
||||||
|
y1 := (t.ypos + dy1)
|
||||||
|
|
||||||
|
as0 := env.SniffNormalized(x0, y0, pheromone)
|
||||||
|
as := env.SniffNormalized(x, y, pheromone)
|
||||||
|
as1 := env.SniffNormalized(x1, y1, pheromone)
|
||||||
|
return as0+as+as1
|
||||||
|
}
|
||||||
|
|
||||||
func (t *Turtle) Near(env *Environment, distance int, threshold float32, pheromone string) bool {
|
func (t *Turtle) Near(env *Environment, distance int, threshold float32, pheromone string) bool {
|
||||||
h0 := t.heading - 1
|
h0 := t.heading - 1
|
||||||
if h0 < 0 {
|
if h0 < 0 {
|
||||||
|
|
12
main.go
12
main.go
|
@ -23,6 +23,8 @@ var height = flag.Int("height", 300, "height of environment")
|
||||||
var pxsize = flag.Int("pxsize", 1, "pixels per tile edge")
|
var pxsize = flag.Int("pxsize", 1, "pixels per tile edge")
|
||||||
var numTurtles = flag.Int("numTurtles", 5000, "number of turtles")
|
var numTurtles = flag.Int("numTurtles", 5000, "number of turtles")
|
||||||
|
|
||||||
|
var prob = flag.Float64("distribution", .51, "number of turtles")
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
// We don't need real randomness
|
// We don't need real randomness
|
||||||
|
@ -93,20 +95,12 @@ func main() {
|
||||||
g.ColorPheromone("trail", [4]uint8{0x81, 0, 0x81, 0x00})
|
g.ColorPheromone("trail", [4]uint8{0x81, 0, 0x81, 0x00})
|
||||||
case "slush":
|
case "slush":
|
||||||
for i := 0; i < *numTurtles; i++ {
|
for i := 0; i < *numTurtles; i++ {
|
||||||
turtles[i] = core.NewTurtle(env, &actors.Slush{})
|
turtles[i] = core.NewTurtle(env, &actors.Slush{Probability:float32(*prob)})
|
||||||
}
|
}
|
||||||
env.InitPheromone("1")
|
env.InitPheromone("1")
|
||||||
env.InitPheromone("2")
|
env.InitPheromone("2")
|
||||||
g.ColorPheromone("1", [4]uint8{0x80, 0xFF, 0x00, 0x00})
|
g.ColorPheromone("1", [4]uint8{0x80, 0xFF, 0x00, 0x00})
|
||||||
g.ColorPheromone("2", [4]uint8{0xFF, 0, 0xFF, 0x00})
|
g.ColorPheromone("2", [4]uint8{0xFF, 0, 0xFF, 0x00})
|
||||||
case "snowball":
|
|
||||||
for i := 0; i < *numTurtles; i++ {
|
|
||||||
turtles[i] = core.NewTurtle(env, &actors.Snowball{})
|
|
||||||
}
|
|
||||||
env.InitPheromone("1")
|
|
||||||
env.InitPheromone("2")
|
|
||||||
g.ColorPheromone("1", [4]uint8{0x00, 0xFF, 0xFF, 0x00})
|
|
||||||
g.ColorPheromone("2", [4]uint8{0xFF, 0xFF, 0x00, 0x00})
|
|
||||||
case "flocking":
|
case "flocking":
|
||||||
for i := 0; i < *numTurtles; i++ {
|
for i := 0; i < *numTurtles; i++ {
|
||||||
turtles[i] = core.NewTurtle(env, &actors.Flocking{SniffDistance: 1})
|
turtles[i] = core.NewTurtle(env, &actors.Flocking{SniffDistance: 1})
|
||||||
|
|
Loading…
Reference in New Issue