⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flocker.java

📁 MASON代表多主体邻里或网络仿真(Multi-Agent Simulator of Neighborhoods or Networks)。它是乔治梅森大学用Java开发的离散事件多主体仿真核心库
💻 JAVA
字号:
package sim.app.flockers;import sim.engine.*;import sim.field.continuous.*;import sim.util.*;import ec.util.*;public class Flocker implements Steppable, sim.portrayal.Oriented2D    {    public Double2D loc = new Double2D(0,0);    public Double2D lastd = new Double2D(0,0);    public Continuous2D flockers;    public Flockers theFlock;        public Bag getNeighbors()        {        return flockers.getObjectsWithinDistance(loc, theFlock.neighborhood, true);        }        public double getOrientation() { return orientation2D(); }    public boolean isDead() { return dead; }    public void setDead(boolean val) { dead = val; }        public double orientation2D()        {        if (lastd.x == 0 && lastd.y == 0) return 0;        return Math.atan2(lastd.y, lastd.x);        }        public Double2D momentum()        {        return lastd;        }            public Double2D consistency(Bag b, Continuous2D flockers)        {        if (b==null || b.numObjs == 0) return new Double2D(0,0);                double x = 0;         double y= 0;        int i =0;        for(i=0;i<b.numObjs;i++)            {            Flocker other = (Flocker)(b.objs[i]);            if (!other.dead)                {                double dx = flockers.tdx(loc.x,other.loc.x);                double dy = flockers.tdy(loc.y,other.loc.y);                double lensquared = dx*dx+dy*dy;                if (lensquared <= theFlock.neighborhood * theFlock.neighborhood)                    {                    Double2D m = ((Flocker)b.objs[i]).momentum();                    x += m.x;                    y += m.y;                    }                }            }        x /= b.numObjs;        y /= b.numObjs;        return new Double2D(x,y);        }        public Double2D cohesion(Bag b, Continuous2D flockers)        {        if (b==null || b.numObjs == 0) return new Double2D(0,0);                double x = 0;         double y= 0;                int i =0;        for(i=0;i<b.numObjs;i++)            {            Flocker other = (Flocker)(b.objs[i]);            if (!other.dead)                {                double dx = flockers.tdx(loc.x,other.loc.x);                double dy = flockers.tdy(loc.y,other.loc.y);                double lensquared = dx*dx+dy*dy;                if (lensquared <= theFlock.neighborhood * theFlock.neighborhood)                    {                    x += dx;                    y += dy;                    }                }            }        x /= b.numObjs;        y /= b.numObjs;        return new Double2D(-x/10,-y/10);        }        public Double2D avoidance(Bag b, Continuous2D flockers)        {        if (b==null || b.numObjs == 0) return new Double2D(0,0);        double x = 0;        double y = 0;                int i=0;        int count = 0;        for(i=0;i<b.numObjs;i++)            {            Flocker other = (Flocker)(b.objs[i]);            if (other != this )                {                count++;                double dx = flockers.tdx(loc.x,other.loc.x);                double dy = flockers.tdy(loc.y,other.loc.y);                double lensquared = dx*dx+dy*dy;                if (lensquared <= theFlock.neighborhood * theFlock.neighborhood)                    {                    x += dx/(lensquared*lensquared + 1);                    y += dy/(lensquared*lensquared + 1);                    }                }            }        if (count>0)            {            x /= count;            y /= count;            }        return new Double2D(400*x,400*y);              }            public Double2D randomness(MersenneTwisterFast r)        {        double x = r.nextDouble() * 2 - 1.0;        double y = r.nextDouble() * 2 - 1.0;        double l = Math.sqrt(x * x + y * y);        return new Double2D(0.05*x/l,0.05*y/l);        }        public boolean dead = false;        public void step(SimState state)        {                final Flockers flock = (Flockers)state;        loc = flock.flockers.getObjectLocation(this);        if (dead) return;                Bag b = flockers.getObjectsWithinDistance(loc, theFlock.neighborhood, true);                    Double2D avoid = avoidance(b,flock.flockers);        Double2D cohe = cohesion(b,flock.flockers);        Double2D rand = randomness(flock.random);        Double2D cons = consistency(b,flock.flockers);        Double2D mome = momentum();        double dx = flock.cohesion * cohe.x + flock.avoidance * avoid.x + flock.consistency* cons.x + flock.randomness * rand.x + flock.momentum * mome.x;        double dy = flock.cohesion * cohe.y + flock.avoidance * avoid.y + flock.consistency* cons.y + flock.randomness * rand.y + flock.momentum * mome.y;                        // renormalize to the given step size        double dis = Math.sqrt(dx*dx+dy*dy);        if (dis>0)            {            dx = dx / dis * flock.jump;            dy = dy / dis * flock.jump;            }                lastd = new Double2D(dx,dy);        loc = new Double2D(flock.flockers.stx(loc.x + dx), flock.flockers.sty(loc.y + dy));        flock.flockers.setObjectLocation(this, loc);        }     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -