[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)