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

📄 world.java

📁 Autolife模型是一个能够进行“开放式进化”的人工生命系统。每个Agent模型采用可以变化规则表长度的有限自动机模型建模。一方面Agent可以进行自我繁殖
💻 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 + -