Не поленился и набросал код моего подхода, т.к. задача показалась интересной

надеюсь он будет полезным!

Код AS1/AS2:
import flash.geom.Point;
var ballList:Array = new Array();
for(var i:Number=0;i<100;i++)
{
var w:Number = 550;
var h:Number = 400;
ballList.push(createBall(w/10*(i%10)+w/20,h/10*Math.floor(i/10)+h/20));
}
function onEnterFrame():Void
{
for(var i:Number=0;i<ballList.length;i++)
{
steer(ballList[i]);
if(ballList[i].position.subtract(ballList[i].target).length<10)
{
createTarget(ballList[i],20);
}
}
}
function steer(mc:MovieClip):Void
{
var target:Point = mc.target;
var position:Point = mc.position;
var velocity:Point = mc.velocity;
var max_speed:Number = mc.max_speed;
var target_offset:Point = target.subtract(position)
var ramped_speed:Number = max_speed * (target_offset.length/10)
var clipped_speed:Number = Math.min(ramped_speed, max_speed)
var desired_velocity:Point = target_offset.clone();
desired_velocity.normalize(desired_velocity.length*(clipped_speed / target_offset.length));
velocity = mc.velocity.add(truncate (desired_velocity.subtract(velocity), 0.5));
truncate (velocity, max_speed)
position = position.add(velocity);
mc._x = position.x;
mc._y = position.y;
mc.position = position;
mc.velocity = velocity;
}
function createBall(x:Number,y:Number):MovieClip
{
var mc:MovieClip = createEmptyMovieClip("ball"+getNextHighestDepth(),getNextHighestDepth());
mc.beginFill(0xffffff*Math.random());
drawRect(mc,5);
mc.endFill();
mc._x = x;
mc._y = y;
mc.position0 = new Point(x,y);
mc.position = new Point(x,y);
mc.target = new Point(x,y);
mc.velocity = new Point(0,0);
mc.max_speed = 3;
return mc;
}
function createTarget(mc:MovieClip,r:Number):Void
{
mc.target = new Point(mc.position0.x+Math.random()*r-r/2,mc.position0.y+Math.random()*r-r/2);
}
function truncate(p:Point,maxLength:Number):Point
{
if(p.length>maxLength)p.normalize(maxLength);
return p;
}
function drawRect(mc:MovieClip, r:Number):Void {
mc.moveTo(-r,-r);
mc.lineTo( r,-r);
mc.lineTo( r, r);
mc.lineTo(-r, r);
}