📄 world.java
字号:
package lifetest;
import java.util.Vector;
import lifetest.agent;
import java.awt.*;
import lifetest.dynEnvs;
public class World {
//Variant to control world
int agNum;
int iniNum=50;
int WorldState[][];
int AgentsWorld[][];
Vector agents=new Vector();
Vector resource=new Vector();
Vector History=new Vector();
Vector Seeds=new Vector();
Vector clipboard=new Vector();
//constant of the agents
int normalEnergy=1;
int stepEnergy=2;
int turnEnergy=1;
int breedAge=10;
int breedEnergy=400;
int maxContaining=5000;
int maxAge=500;
int EatEnergy=100;
int birthE=2000;
int maxBreedNum=5;
int growUpTime=10;
int SeedToFood=2;
int SeedGrassE=60;
long modelTime;
double FoodRan=0.02;
int FoodAddNum=0;
double disturb=0.5;
double ObsRan=0;
int dynType=0;
double muteP=0.02;
double lenP=0.001;
int agType;
int drawType=0;
static int width=400,height=400;
Graphics g;
lifesim controlEnv;
dynEnvs ca=new dynEnvs(0,this);
dynEnvs fractal=new dynEnvs(1,this);
public World(lifesim lf){
controlEnv=lf;
WorldState=new int[width][height];
AgentsWorld=new int[width][height];
}
public void reinit(){
agNum=iniNum;
agents.removeAllElements();
Seeds.removeAllElements();
History.removeAllElements();
for(int i=0;i<iniNum;i++){
int x=(int)(width*Math.random());
int y=(int)(height*Math.random());
agent ag=new agent(x,y,lifesim.COLOR_BACK,lifesim.COLOR_LIFE,lifesim.COLOR_TAIL,birthE,this,true,i);
agents.addElement(ag);
}
for(int i=0;i<width;i++){
for(int j=0;j<height;j++){
WorldState[i][j]=0;
double e=Math.random();
if(e<ObsRan)WorldState[i][j]=1;
if(e-ObsRan>0&&e<FoodRan){
WorldState[i][j]=1;
}
}
}
modelTime=0;
}
public void process(){
for(int i=agents.size()-1;i>=0;i--){
agent ag=(agent)agents.elementAt(i);
ag.Decision();
ag.Draw(g);
update(ag);
}
for(int i=Seeds.size()-1;i>=0;i--){
Seed bd=(Seed)Seeds.elementAt(i);
if(modelTime-bd.modelTime>growUpTime){
Seeds.removeElementAt(i);
distribute(SeedToFood,new Point(bd.x,bd.y),1);
g.setColor(lifesim.COLOR_BACK);
}else{
g.setColor(lifesim.COLOR_SEED);
}
if(drawType==1){
g.fillRect(bd.x,bd.y,1,1);
}
}
envAct();
addData();
modelTime++;
}
public void envAct(){
boolean notdone=true;
g.setColor(lifesim.COLOR_GRASS);
int j=FoodAddNum;
switch(dynType){
case 0:
while(j>0){
int xx=(int)(width*Math.random());
int yy=(int)(height*Math.random());
if(WorldState[xx][yy]==0){
j--;
WorldState[xx][yy]=1;
g.fillOval(xx,yy,1,1);
}
}
break;
case 1:
int yy,xx;
yy=-1;
double r;
while(j>0){
for(int k1=0;k1<70;k1++){
//生命的浮现?
r=width/3+k1;
xx=(int)(r*Math.cos((double)(modelTime)/(double)(10))+width/2);
yy=(int)(r*Math.sin((double)(modelTime)/(double)(10))+height/2);
xx=(xx+width)%width;
yy=(yy+height)%height;
j--;
WorldState[xx][yy]=1;
g.fillOval(xx,yy,1,1);
}
}
break;
case 2:
while(j>0){
for(int k1=0;k1<12;k1++){
/*圆圈?*/
r=width/8+k1;
//xx=(int)(r*Math.cos((double)(localworld.modelTime)/(double)(100))+localworld.width/2);
//yy=(int)(r*Math.sin((double)(localworld.modelTime))+localworld.width/2);
xx=(int)(r*Math.cos((double)(modelTime)/(double)(1000))+width/2);
yy=(int)(r*Math.sin((double)(modelTime)/(double)(1000))+width/2);
xx=(xx+width)%width;
yy=(yy+height)%height;
j--;
WorldState[xx][yy]=1;
g.fillOval(xx,yy,1,1);
}
}
break;
case 3:
while(j>0){
for(int k1=0;k1<20;k1++){
r=20+k1;
double t=(double)(modelTime)/(double)(200);
xx=(int)(5*t+r*Math.cos(t))+100;
yy=(int)(5*t+r*Math.sin(t))+100;
xx=(xx+width)%width;
yy=(yy+height)%height;
j--;
WorldState[xx][yy]=1;
g.fillOval(xx,yy,1,1);
}
}
break;
case 4:
while(j>0){
for(int k1=0;k1<20;k1++){
/*圆圈?*/
r=width/4+k1;
xx=(int)(r*Math.cos((double)(modelTime)/(double)(100))+width/2);
yy=(int)(r*Math.sin((double)(modelTime)/(double)(101))+width/2);
//r=10+k1;
xx=(xx+width)%width;
yy=(yy+height)%height;
j--;
WorldState[xx][yy]=1;
g.fillOval(xx,yy,1,1);
}
}
break;
case 5:
while(j>0){
for(int k1=0;k1<20;k1++){
/*圆圈?*/
r=50+k1;
//r=r*r+1;
xx=(int)(r*Math.cos((double)(modelTime)/(double)(20))+width/2);
yy=(int)(r*Math.sin((double)(modelTime)/(double)(10))+width/2);
xx=(xx+width)%width;
yy=(yy+height)%height;
//r=10+k1;
j--;
WorldState[xx][yy]=1;
g.fillOval(xx,yy,1,1);
}
}
break;
case 6:
//Game of Life
if(modelTime%20==0){
WorldState=ca.evolve(WorldState,width,height);
for(int i=0;i<Seeds.size();i++){
Seed sd=(Seed)Seeds.elementAt(i);
WorldState[sd.x][sd.y]=2;
}
controlEnv.canvas.repaint();
}
break;
case 7:
WorldState=fractal.evolve(WorldState,width,height);
for(int i=0;i<Seeds.size();i++){
Seed sd=(Seed)Seeds.elementAt(i);
WorldState[sd.x][sd.y]=2;
}
break;
}
}
public void update(agent ag){
boolean HaveDie=false;
if(WorldState[ag.x][ag.y]==1){
ag.energy+=EatEnergy;
ag.foodNum++;
g.setColor(lifesim.COLOR_BACK);
g.fillOval(ag.x,ag.y,1,1);
}
WorldState[ag.x][ag.y]=0;
if(ag.energy<=0||ag.age>maxAge){
ag.Die(g);
HaveDie=true;
agents.removeElement(ag);
//g.setColor(Color.yellow);
//g.fillOval(ag.x,ag.y,1,1);
agNum--;
int foodNum=ag.foodNum-2;
if(foodNum<0)foodNum=0;
//distribute(foodNum,new Point(ag.x,ag.y));
}
//if(HaveDie)
//performGA();
}
public void repaint(Graphics g1){
int i,j;
g1.setColor(lifesim.COLOR_BACK);
g1.fillRect(0,0,controlEnv.canvas.size().width,controlEnv.canvas.size().height);
for(i=0;i<width;i++){
for(j=0;j<height;j++){
if(WorldState[i][j]==1){
g1.setColor(lifesim.COLOR_GRASS);
g1.fillRect(i,j,1,1);
}else if(WorldState[i][j]==2){
if(drawType==1){
g1.setColor(lifesim.COLOR_SEED);
g1.fillRect(i,j,1,1);
}
}
}
}
for(int k=agents.size()-1;k>=0;k--){
agent ag=(agent)agents.elementAt(k);
ag.Draw(g1);
}
//reset = false;
/*g.setColor(obs_color);
for(i=0;i<Antcolony.obsCount;i++){
g.fillRect(Antcolony.obsP[i].x,Antcolony.obsP[i].y,1,1);
}*/
}
public void distribute(int foodCount,Point ag,int type){
int j=0;
if(type==1){
g.setColor(lifesim.COLOR_GRASS);
}else{
if(drawType==1){
g.setColor(lifesim.COLOR_SEED);
}
}
int k=0;
while(j<foodCount){
Point pt=new Point(0,0);
int r=(int)(Math.random()*5);
if(k==0)r=100;
switch(r){
case 0:
pt.x+=1;
break;
case 1:
pt.x-=1;
break;
case 2:
pt.y+=1;
break;
case 3:
pt.y-=1;
break;
}
ag.x+=pt.x;
ag.y+=pt.y;
ag.x=(width+ag.x)%width;
ag.y=(height+ag.y)%height;
if(WorldState[ag.x][ag.y]!=type){
j++;
WorldState[ag.x][ag.y]=type;
if(type==2){
Seed seed=new Seed(modelTime,ag.x,ag.y);
Seeds.addElement(seed);
}
//g.setColor(Color.blue);
g.fillOval(ag.x,ag.y,1,1);
}
k++;
}
}
public void DealWithSelected(Point pt1,Point pt2,Vector ags,int interType,double Gradiant){
switch(interType){
case 0:
DeleteAgents(pt1,pt2,ags);
for(int i=pt1.x;i<pt2.x;i++){
for(int j=pt1.y;j<pt2.y;j++){
WorldState[i][j]=0;
AgentsWorld[i][j]=0;
}
}
for(int k=Seeds.size()-1;k>=0;k--){
Seed bd=(Seed)Seeds.elementAt(k);
if(bd.x>pt1.x&&bd.y>pt1.y&&bd.x<pt2.x&&bd.y<pt2.y){
Seeds.removeElement(bd);
}
}
break;
case 1:
for(int i=pt1.x;i<pt2.x;i++){
for(int j=pt1.y;j<pt2.y;j++){
WorldState[i][j]=0;
}
}
break;
case 2:
for(int i=pt1.x;i<pt2.x;i++){
for(int j=pt1.y;j<pt2.y;j++){
if(WorldState[i][j]==1){
WorldState[i][j]=0;
}
}
}
for(int k=0;k<Seeds.size();k++){
Seed bd=(Seed)Seeds.elementAt(k);
if(bd.x>pt1.x&&bd.y>pt1.y&&bd.x<pt2.x&&bd.y<pt2.y){
Seeds.removeElement(bd);
}
}
break;
case 3:
for(int i=pt1.x;i<pt2.x;i++){
for(int j=pt1.y;j<pt2.y;j++){
WorldState[i][j]=1;
}
}
for(int k=0;k<Seeds.size();k++){
Seed bd=(Seed)Seeds.elementAt(k);
if(bd.x>pt1.x&&bd.y>pt1.y&&bd.x<pt2.x&&bd.y<pt2.y){
Seeds.removeElement(bd);
}
}
break;
case 4:
int xx=pt1.x-pt2.x;
int yy=pt1.y-pt2.y;
int l=(int)Math.sqrt(xx*xx+yy*yy);
double a1;
double a2;
if(l==0){
a1=0;a2=0;
}
a1=-(double)xx/(double)l;
a2=-(double)yy/(double)l;
int s=controlEnv.lineWidth;
double r0=Gradiant;
double r=0;
for(int t=0;t<l;t+=1){
r+=r0;
for(int g=0;g<s;g++){
for(int h=0;h<s;h++){
xx=(int)(t*a1+pt1.x-(double)s/(double)2+g);
yy=(int)(t*a2+pt1.y-(double)s/(double)2+h);
xx=(xx+width)%width;
yy=(yy+height)%height;
if(Math.random()<r){
WorldState[xx][yy]=1;
}
}
}
}
break;
case 5:
for(int i=pt1.x;i<pt2.x;i++){
for(int j=pt1.y;j<pt2.y;j++){
AgentsWorld[i][j]=0;
}
}
DeleteAgents(pt1,pt2,ags);
break;
}
controlEnv.canvas.repaint();
}
void DeleteAgents(Point pt1,Point pt2,Vector ags){
if(ags==null){
for(int k=agents.size()-1;k>=0;k--){
agent ag=(agent)agents.elementAt(k);
if(ag.x>pt1.x&&ag.y>pt1.y&&ag.x<pt2.x&&ag.y<pt2.y){
ag.age=2*maxAge;
AgentsWorld[ag.x][ag.y]=0;
ag.breedNum=2*maxBreedNum;
update(ag);
}
}
}else{
for(int k=0;k<ags.size();k++){
agent ag=(agent)ags.elementAt(k);
ag.age=2*maxAge;
AgentsWorld[ag.x][ag.y]=0;
ag.breedNum=2*maxBreedNum;
update(ag);
}
}
}
public void clearAgentsWorld(){
for(int i=0;i<width;i++){
for(int j=0;j<height;j++){
AgentsWorld[i][j]=0;
}
}
}
public void copyAgents(Vector ags,int x,int y){
clipboard.removeAllElements();
for(int i=0;i<ags.size();i++){
agent ag=(agent)ags.elementAt(i);
agent agnew=ag.clone1();
agnew.x-=x;
agnew.y-=y;
clipboard.addElement(agnew);
}
}
public void pasteAgents(Point pt1,Point pt2){
int w=pt2.x-pt1.x;
int h=pt2.y-pt1.y;
for(int i=0;i<clipboard.size();i++){
agent ag=(agent)clipboard.elementAt(i);
ag.id=agents.size();
ag.x=pt1.x+(int)(w*Math.random());
ag.y=pt1.y+(int)(h*Math.random());
ag.x=(ag.x+width)%width;
ag.y=(ag.y+height)%height;
ag.Draw(g);
agents.addElement(ag);
}
}
public void addData(){
int age=0;
int energy=0;
int maxage=0;
int maxenergy=0;
int len=0;
int maxLen=0;
double lambda=0;
for(int i=0;i<agNum;i++){
agent ag=(agent)agents.elementAt(i);
age+=ag.age;
len+=ag.rules.size();
energy+=ag.foodNum;
if(ag.age>maxage){
maxage=ag.age;
}
if(ag.energy>maxenergy){
maxenergy=ag.energy;
}
if(ag.rules.size()>maxLen){
maxLen=ag.rules.size();
}
// lambda+=ag.computeLambda();
}
for(int i=0;i<width;i++){
for(int j=0;j<height;j++){
energy+=WorldState[i][j];
}
}
WorldVariant item=new WorldVariant();
item.Num[0]=agNum;
item.TotalEnergy[0]=energy;
if(agNum!=0){
item.avgAge[0]=(double)age/(double)agNum;
item.avgEnergy[0]=(double)energy/(double)agNum;
item.avgLen[0]=(double)len/(double)agNum;
item.avgLambda[0]=(double)lambda/(double)agNum;
}else{
item.avgAge[0]=0;
item.avgEnergy[0]=0;
item.avgLen[0]=0;
item.avgLambda[0]=0;
}
item.maxAge[0]=maxage;
item.maxEnergy[0]=maxenergy;
item.maxLen[0]=(double)maxLen;
History.addElement(item);
if(History.size()>WorldVariant.cyclemax){
History.setElementAt(item,History.size()%(int)(WorldVariant.cyclemax));
}
//dataBase.SaveWorld(item,1,modelTime);
}
}
class Seed{
long modelTime;
int x;
int y;
public Seed(long mt,int xx,int yy){
modelTime=mt;
x=xx;
y=yy;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -