func TestOptimalAttackVectorSort(t *testing.T) { rand.Seed(0) predator := vpTesterAgent(0.0, 0.0) predator.vsr = 1.0 predator.τ = colour.RGB{Red: 0.71, Green: 0.1, Blue: 0.39} prey := []ColourPolymorphicPrey{} for i := 1; i <= 10; i++ { agentA := cpPreyTesterAgent(calc.RandFloatIn(-1, 1), calc.RandFloatIn(-1, 1)) agentB := cpPreyTesterAgent(calc.RandFloatIn(-1, 1), calc.RandFloatIn(-1, 1)) agentA.colouration = colour.RGB{Red: rand.Float64(), Green: rand.Float64(), Blue: rand.Float64()} agentB.colouration = colour.RGB{Red: rand.Float64(), Green: rand.Float64(), Blue: rand.Float64()} prey = append(prey, agentA) prey = append(prey, agentB) } c := math.Pow(2, 3) f := visualSignalStrength(c) optimals := []visualRecognition{} for i := range prey { 𝛘 := colour.RGBDistance(predator.τ, prey[i].colouration) δ, _ := geometry.VectorDistance(predator.pos, prey[i].pos) // fmt.Printf("%v\t%v\t%v\t%p\n", i, 𝛘, δ, &prey[i]) a := visualRecognition{δ, 𝛘, f, c, &prey[i]} optimals = append(optimals, a) }
// PreySearch – uses Visual Search to try to 'recognise' a nearby prey agent within model Environment to target func (vp *VisualPredator) PreySearch(prey []ColourPolymorphicPrey) (*ColourPolymorphicPrey, error) { c := vp.ετ var 𝒇 = visualSignalStrength(c) var 𝛘 float64 // colour sorting value - colour distance/difference between vp.imprimt and cpPrey.colouration var δ float64 // position sorting value - vector distance between vp.pos and cpPrey.pos var err error var searchSet []visualRecognition for i := range prey { // exhaustive search 😱 δ, err = geometry.VectorDistance(vp.pos, prey[i].pos) if δ <= vp.vsr { // ∴ only include the prey agent for considertion if within visual range 𝛘 = colour.RGBDistance(vp.τ, prey[i].colouration) if 𝛘 < vp.𝛄 { // i.e. if and only if colour distance falls within predator's current search tolerance a := visualRecognition{δ, 𝛘, 𝒇, c, &prey[i]} searchSet = append(searchSet, a) } } }
func TestCPPComparitorSort(t *testing.T) { rand.Seed(0) predator := vpTesterAgent(0.0, 0.0) predator.vsr = 1.0 predator.τ = colour.RGB{Red: 0.71, Green: 0.1, Blue: 0.39} prey := []ColourPolymorphicPrey{} for i := 1; i <= 10; i++ { agentA := cpPreyTesterAgent(calc.RandFloatIn(-1, 1), calc.RandFloatIn(-1, 1)) agentB := cpPreyTesterAgent(calc.RandFloatIn(-1, 1), calc.RandFloatIn(-1, 1)) agentA.colouration = colour.RGB{Red: rand.Float64(), Green: rand.Float64(), Blue: rand.Float64()} agentB.colouration = colour.RGB{Red: rand.Float64(), Green: rand.Float64(), Blue: rand.Float64()} prey = append(prey, agentA) prey = append(prey, agentB) } f := func(v geometry.Vector) func(geometry.Vector) float64 { return func(u geometry.Vector) float64 { dist, _ := geometry.VectorDistance(v, u) return dist } }(predator.pos) compers := []compCPP{} for i := range prey { // fmt.Printf("%v\t%v\t%p\n", i, prey[i].pos, &prey[i]) a := compCPP{f, &prey[i]} compers = append(compers, a) } sort.Sort(byComparitor(compers)) // for i := range compers { // fmt.Printf("%v\t%v\t%p\t%v\n", i, compers[i].pos, compers[i].ColourPolymorphicPrey, f(compers[i].pos)) // } want := fmt.Sprintf("%p", &prey[19]) got := fmt.Sprintf("%p", &(*compers[0].ColourPolymorphicPrey)) if want != got { t.Errorf("want:\n%q\ngot:\n%q\n", want, got) } }
// MateSearch implements Breeder interface method for ColourPolymorphicPrey: // NEEDS BETTER HANDLING THAN JUST PUSHING THE ERROR UP! func (c *ColourPolymorphicPrey) MateSearch(pop []ColourPolymorphicPrey, skip int) (mate *ColourPolymorphicPrey, err error) { mate = nil err = nil dist := 0.0 for i := 0; i < len(pop); i++ { if i == skip { continue } dist, err = geometry.VectorDistance(c.pos, pop[i].pos) if err != nil { return } if dist <= c.sr { mate = &pop[i] return } } return }