[HN Gopher] Show HN: Genetic Boids Web Simulation
___________________________________________________________________
Show HN: Genetic Boids Web Simulation
Author : vimgrinder
Score : 150 points
Date : 2025-05-23 19:40 UTC (1 days ago)
(HTM) web link (attentionmech.github.io)
(TXT) w3m dump (attentionmech.github.io)
| isoprophlex wrote:
| I'll just say that this looks insanely good, wow.
| vimgrinder wrote:
| thanks!
| kldavis4 wrote:
| how are genetic (algorithms) used?
| vimgrinder wrote:
| so, i just used them like conceptually..
|
| each boid has a string, when boids come close , they produce a
| offspring with mixed string + mutation age lets boids die too
|
| nothing fancy, just for sake of sim
| knome wrote:
| I was playing around, and inspected the boid count control to
| see if I might manually update it and see what unreasonably
| large and small populations look like. I saw the connected
| callback triggered updateProperty. Running
| updateProperty("boidCount", 10) in the console yielded a
| field with 10 boids, as expected, but apparently it doesn't
| update something else the natural code would, as as soon as
| two of the boids collided, a humongous explosion of boids
| occurred, like a firework.
| chipsrafferty wrote:
| anything AI can do GAs can do worse
| brulard wrote:
| That's beautiful. What are "signals"?
| Xevion wrote:
| I don't know myself, but it seems to give boids their own
| unique state and add another layer of influence to their
| acceleration.
|
| https://github.com/attentionmech/genetic-boids/blob/485fe482...
|
| I'm reading the code but I don't know what it actually DOES in
| practice; my guess is that Boids with opposite genomes (binary
| strings with default length 6) are slightly attracted to
| eachother.
| vimgrinder wrote:
| yes this only.
| rvnx wrote:
| Never heard of such thing, love it!
| Xevion wrote:
| I learned about Boids when I was 16 thanks to Sebastian Lague's
| amazing video on it: https://youtu.be/bqtqltqcQhw
|
| Highly recommend, especially his older videos on simulations.
| vladde wrote:
| Reminds me of this similar thing!, creating life like behavior
| with only simple rules https://youtu.be/0Kx4Y9TVMGg?t=40
|
| (the coolest examples come at about half a minute into the video)
| Xevion wrote:
| Awesome work, the green terminal style is really cool. And the
| fact that it's just Vanilla JavaScript, HTML & CSS is a pretty
| cool touch. I would've produced something a tenth the style with
| 10x the complexity
|
| Just some ideas/suggestions: - Better colors: maybe genes can
| influence colors a bit? The random colors aren't that great,
| they're good though for making all the boids distinct. - Zooming:
| Scroll the mousewheel to Zoom In/Out, drag to move around -
| Interactive: Click on a Boid, have it be followed around using
| zoom! - Time controls: Not just framerate, but a % multiplier on
| simulation speed. - GPU Refactor: I don't think you're doing any
| of this yet, so maybe optimizing for a GPU-based speedup would be
| cool? See if you can reach 10,000 boids! Sebastian Lague's video
| goes into parallelization, just not in JavaScript:
| https://youtu.be/bqtqltqcQhw
| vimgrinder wrote:
| hey thanks! color is coming from genome (check
| brightColorFromGenome)! nice suggestions, will definitely try
| to incorporate some of them.
| talkingtab wrote:
| The original Boids is from Craig Reynolds, here:
|
| https://www.red3d.com/cwr/boids/
|
| It was a java applet (sigh) and unfortunately I have not been
| able to find a working version. That version based on his three
| "steering" mechanisms had very realistic movement. Other
| versions, including this one, which are good do not have that
| same kind of quality. They look like simulations whereas the
| Reynolds version, for whatever reason, seemed much closer to
| watching an actual flock.
|
| No criticism intended, it would just be nice to understand the
| why the difference.
|
| Looking briefly at the code, it seems the fitness function is
| simply how close the boids are?
|
| Very cool!
| vimgrinder wrote:
| oh, so i wasn't really aware that there was a original boid sim
| (I will check it today). mostly I saw it on some other demos
| and I wanted to add this behaviour of signaling boids which are
| far away + color code based on genome + do a simple cross-
| mutate. and yes you are right about fitness func.
|
| Beyond this i was trying to add a map which effects their
| movement. (if you wanna check how it looks -
| https://x.com/attentionmech/status/1925690991555531143)
| janzer wrote:
| Just a clarifying note, Craig Reynolds is the original
| researcher for Boids, and he did have a Java applet
| implementation in the above page. But the original Boids
| simulation was from 1986, almost a decade prior to Java
| applets.
|
| The original paper, published in 1987, is "Flocks, herds and
| schools: A distributed behavioral model"[1]. The implementation
| was done in Lisp on a Symbolics 3600 Lisp Machine.
|
| Edit: One quite interesting paragraph from the paper regarding
| performance:
|
| _The boid software has not been optimized for speed. But this
| report would be incomplete without a rough estimate of the
| actual performance of the system. With a flock of 80 boids,
| using the naive O(N2) algorithm (and so 6400 individual boid-
| to-boid comparisons), on a single Lisp Machine without any
| special hardware accelerators, the simulation ran for about 95
| seconds per frame. A ten-second (300 frame) motion test took
| about eight hours of real time to produce._
|
| Once again, amazing how far hardware has advanced.
|
| 1. https://dl.acm.org/doi/10.1145/37402.37406
| monster_truck wrote:
| I've had a lot of fun playing with BBC Microbot
| (https://bbcmic.ro/). If you add &experimental=true to the
| URL it will add a rocket ship button underneath the display.
| Clicking it sends the code off to beebjit and runs it for
| 10,000 seconds instantly, allowing you to do unreasonable
| things such as this: https://bbcmic.ro/?t=bC9Go (not mine)
| akkartik wrote:
| I don't know if this will address your question, but I had a
| long-standing question about boids that might overlap, which I
| coincidentally only resolved to my satisfaction a month ago.
| Here's the Lua code I ended up with: function
| update_positions(boids, dt) local max_speed = 0.5 --
| per frame local max_accel = 20 -- per second
| local max_turn_angle = math.pi/6 -- per second for
| _,boid in ipairs(boids) do boid.pos =
| vadd(boid.pos, boid.velocity) end for
| i,boid in ipairs(boids) do local accel = {x=0, y=0}
| accel = vadd(accel, vscale(avoid_others(boid, boids), 20*dt))
| accel = vadd(accel, vscale(seek_others(boid, boids), 10*dt))
| accel = vadd(accel, vscale(align_with_others(boid, boids),
| 10*dt)) accel = vadd(accel,
| vscale(remain_within_viewport(boid), 40*dt)) local
| curr_heading = vnorm(boid.velocity) -- could be nil
| accel = vclamp2(accel, max_accel*dt, curr_heading,
| max_turn_angle*dt) boid.velocity =
| vadd(boid.velocity, accel) boid.velocity =
| vclamp(boid.velocity, max_speed) end end
|
| Here, _avoid_others_ , _seek_others_ and _align_with_others_
| are the 3 rules you can find on Wikipedia
| (https://en.wikipedia.org/wiki/Boids): separation, cohesion,
| alignment. Each of the functions returns a unit vector, which I
| then weight using _vscale_.
|
| The key is the last 4 lines. My intuition here is that the way
| muscle mechanics work, there are limits on both how fast you
| can accelerate and also how much you can turn per unit time.
| That's what _vclamp2_ is doing. It separately clamps both
| magnitude and angle of acceleration.
|
| My rough sense after this experience was:
|
| * Boids is not a simple program the way the Game of Life or
| Mandelbrot set is. The original paper had tons of nuance that
| we gloss over in the internet era.
|
| * Every implementation I've found is either extremely sensitive
| to weights or does weird stuff in the steering. Stuff like
| subtracting velocity from acceleration when the units are
| different, and so on. There may be a numeric basis for them,
| but it's never been explained to my satisfaction. Whereas my
| vclamp2 idea roughly hangs together for me. And the evidence
| it's on the right track is that a wide variety of weights (the
| 10s, 20s and 40s above) result in behavior that looks right to
| me.
| talkingtab wrote:
| Wow! Thanks. The thought about "Boids is not a simple ..." is
| new to me and very good. The other vector in this is the
| evolution/genetic algorithm idea. It raises the question of
| what are the benefits of flocking? And could you plug those
| into a genetic algorithm to test survival.
|
| It seems like perhaps the visual inputs are another
| interesting area. What do I (as a boid) do when I see one
| boid in front of me go right, one go left, for example. But
| thanks!!
| akkartik wrote:
| Yeah, the original paper gets into some of that. It was
| about 3D flocking! And Reynolds was very much thinking
| about what each bird sees, the minimum angle to turn to
| avoid a collision, etc. All on a then-powerful graphical
| workstation.
| DonHopkins wrote:
| Craig Reynolds - Original 1986 Boids simulation:
|
| https://www.youtube.com/watch?v=86iQiV3-3IA
|
| Boids Demo Reel 1987 -- Part B:
|
| https://www.youtube.com/watch?v=xBniZYiyrb4
|
| >Early motion tests of the boids model of flocking and related
| collective motion (herds, schools, crowds). Recorded on a
| Symbolics Lisp Machine between 1986 and 1987.
|
| Stanley and Stella in "BREAKING THE ICE" - Original Symbolics
| Tapes Restored & Remastered, 1080p:
|
| https://www.youtube.com/watch?v=aYEp26g14Wk
|
| Craig Reynolds #SCCS2015:
|
| https://www.youtube.com/watch?v=rqP_c5zm89Q
|
| >Pioneer Craig Reynolds shares his groundbreaking work in
| artificial life and computer animation. Reynolds describes his
| lifelong fascination with simulating natural complexity
| computationally. By modeling flocking birds from the bottom up,
| based on simple rules for how individual birds move, Reynolds
| made the astonishing flock emerge. This agent-based approach
| allowed new insights into collective behavior impossible to
| gather from nature alone. Reynolds reflects on the significance
| of his iconic 1987 "Boids" model for animating birds in films
| like Batman Returns. But its influence extends further - to
| complexity science and understanding real-world systems like
| traffic flow and crowd dynamics. According to Reynolds, the
| beauty of simple models is their emergent properties. By
| distilling phenomena to basic rules, computer simulation
| uncovers new truths about the world. Join this fascinating
| conversation with a legend of artificial life and computer
| graphics.
|
| Blender Tutorial - Full Guide to Boid Particles:
|
| https://www.youtube.com/watch?v=J3TUPYVsxow
|
| "Concierge" clip from 1968 Mel Brooks' "The Producers":
|
| https://www.youtube.com/watch?v=aL6mTMShVyk
|
| >Doity, disgusting, filthy, lice ridden boids.
| brodo wrote:
| I've just built a boid simulation in Go and WebGPU. 16k boids are
| no problem on my M1 Mac Pro. I did not implement any optimization
| yet.
| vimgrinder wrote:
| oh nice, webGPU thing should learn sometime!
| anigbrowl wrote:
| I really like it, though I'm finding it dies consistently after
| about 30s (Vivaldi on an intel iMac with a decent GPU).
| vimgrinder wrote:
| dies in the sense machine gets hung or all boids vanish?
|
| EDIT: also pushed some fixes in params (allow offsprings at
| larger distance, etc), but basically if the boids don't end up
| closer, they won't reproduce and the population dies so play
| with that and lmk
| diggan wrote:
| Noticed that all the boids lifetime seems to be the same, so
| you go from "a flock" to "nothing" very quickly if the
| lifetime been hit. What I've done before with "crowd
| simulations" like these, is add another params, something
| like "random lifetime interval" where if set to say 100,
| it'll set the actual lifetime to be randomly chosen between
| $LIFETIME - 100 and $LIFETIME + 100, so things die a bit less
| predictable. Helps stabilize the simulations too when you're
| doing reproduction too.
| vimgrinder wrote:
| yes had the same idea but applied that by doing
| randomization in age: floor(random(0, this.lifespan))
|
| for me its not vanishing suddenly, so not sure how to
| reproduce now
| throw_m239339 wrote:
| I remember that word "Boids" from Blender Physic simulation menu,
| to mimic a flock of birds in 3D, I also remember understanding
| nothing to its settings, but it kind of worked well.
| chachacharge wrote:
| Green light is perceived as brighter than other colors because
| human eyes are most sensitive to it. This sensitivity is related
| to the wavelengths of light that our visual system responds to,
| with green being at the peak of our vision
| animal531 wrote:
| I quite like Boids, but recently I started playing with RVO2 ORCA
| (optimal reciprocal collision avoidance). I made some changes to
| it and moved it to a compute shader to make this:
| https://www.youtube.com/watch?v=BavnPOPcHlk
|
| The entities in the video are running super fast for testing
| purposes, so usually they'd be going a lot slower. They can
| produce some really pleasing patterns as they move through each
| other etc.
|
| On the downside its quite expensive vs Boids, for example the
| video is from a slightly older version and every agent is looking
| at the closest 32 neighbours + 32 obstacles to compute its own
| velocity. At high densities you can drop that to e.g. 4
| neighbours without appreciable difference, which allows for
| running e.g. 32k entities at 120fps.
___________________________________________________________________
(page generated 2025-05-24 23:01 UTC)