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

📄 agent.java

📁 Autolife模型是一个能够进行“开放式进化”的人工生命系统。每个Agent模型采用可以变化规则表长度的有限自动机模型建模。一方面Agent可以进行自我繁殖
💻 JAVA
字号:
package lifetest;import java.awt.*;import java.util.Vector;import lifetest.World;/** * Title:        LifeSim * Description: * Copyright:    Copyright (c) 2004 * Company:      www.swarmagents.com * @author jake * @version 1.0 */public class agent {  int x;//x坐标  int y;//y坐标  int id;//标识  int lastx;//上一点坐标  int lasty;  int energy;//总能量  int inputNum;//输入信息方格个数  int inputType;//输入信息每个方格的种类数  int outputNum;//行动选择的可能数  int breedNum=0;//反之的数量  int age;//年龄  int direct;//方向  int s;//内部状态值  int sNum;//内部状态的个数  int foodNum=0;  //int type;  //long Usage[];  World localworld;//世界的拷贝  Point lasttailpt;//上一时刻尾巴的位置  Color back_color;//背景色  Color color;//生命体的颜色  Color tail_color;//尾巴的颜色  Vector rules;  public agent(int xx,int yy,Color back,Color col,Color tail,int iniE,World local,boolean rule,int idi) {    id=idi;    //type=0;    x=xx;    lastx=x;    y=yy;    lasty=y;    back_color=back;    color=col;    tail_color=tail;    direct=(int)(4*Math.random());    lasttailpt=GetFromDir(lastx,lasty,direct);    energy=iniE;    localworld=local;    age=0;    inputNum=3;    inputType=3;    if(localworld.agType==0){    	outputNum=4;    }else{		outputNum=5;	    }        /*    Usage=new long[outputNum];    for(int i=0;i<outputNum;i++){    	Usage[i]=0;    }*/    rules=new Vector();    if(rule){      sNum=(int)(9*Math.random());      CreateRules(rules);    }    foodNum=energy/localworld.EatEnergy;  }  public agent(int idi) {    //type=0;    id=idi;    x=0;    lastx=x;    y=0;    lasty=y;    direct=(int)(4*Math.random());    rules=new Vector();    age=0;    //Usage=new long[4];  }  public void Draw(Graphics g) {    g.setColor(back_color);    g.fillOval((int) lastx,(int)lasty,1,1);    //g.fillOval((int)lasttailpt.x,(int)lasttailpt.y,1,1);    g.setColor(color);    g.fillOval((int) x, (int)y,1,1);   // g.setColor(tail_color);    //Point pt=GetFromDir(x,y,direct);    //g.fillOval((int)pt.x,(int)pt.y,1,1);  }  private void Observe(int input[]){    Point i1=new Point(0,0);    Point i2=new Point(0,0);    Point i3=new Point(0,0);    i1.x=x+(int)(Math.cos(direct*Math.PI/2))+(int)(Math.cos((direct+1)*Math.PI/2));    i1.y=y+(int)(Math.sin(direct*Math.PI/2))+(int)(Math.sin((direct+1)*Math.PI/2));    i2.x=x+(int)(Math.cos(direct*Math.PI/2));    i2.y=y+(int)(Math.sin(direct*Math.PI/2));    i3.x=x+(int)(Math.cos(direct*Math.PI/2))+(int)(Math.cos((direct-1)*Math.PI/2));    i3.y=y+(int)(Math.sin(direct*Math.PI/2))+(int)(Math.sin((direct-1)*Math.PI/2));    i1.x=(localworld.width+i1.x)%localworld.width;    i2.x=(localworld.width+i2.x)%localworld.width;    i3.x=(localworld.width+i3.x)%localworld.width;    i1.y=(localworld.height+i1.y)%localworld.height;    i2.y=(localworld.height+i2.y)%localworld.height;    i3.y=(localworld.height+i3.y)%localworld.height;    input[0]=localworld.WorldState[i1.x][i1.y];    input[1]=localworld.WorldState[i2.x][i2.y];    input[2]=localworld.WorldState[i3.x][i3.y];  }  public void Decision(){    int input[];    int output=0;    input=new int[inputNum];    Observe(input);    lastx=x;    lasty=y;    lasttailpt=GetFromDir(x,y,direct);    age++;    energy-=localworld.normalEnergy;    for(int i=0;i<rules.size();i++){      Item itm=(Item)rules.elementAt(i);      if(itm.LookUp(input,s)==1){        output=itm.out;        s=itm.s1;        break;      }    }    if(output==3&&(age<localworld.breedAge||breedNum>localworld.maxBreedNum||energy<localworld.breedEnergy))output=0;    if(output==0){      Point pt=new Point(x,y);      pt=tryToStep(pt,new Point((int)(Math.cos(direct*Math.PI/2)),(int)(Math.sin(direct*Math.PI/2))));      if(pt.x!=0||pt.y!=0){			energy-=localworld.stepEnergy;      }      x=pt.x;      y=pt.y;    }else if(output==3){      //繁殖后代	 Point pt=new Point(x,y);	 pt=tryToStep(pt,new Point((int)(Math.cos(direct*Math.PI/2)),(int)(Math.sin(direct*Math.PI/2))));	 if((pt.x!=x||pt.y!=y)&&localworld.agents.size()<localworld.maxContaining){	      energy-=localworld.stepEnergy;	      agent agnew=new agent(x,y,back_color,color,tail_color,localworld.breedEnergy,localworld,false,localworld.agents.size());	      x=pt.x;	      y=pt.y;	      agnew.GenerateRules(this,this);	      localworld.agents.addElement(agnew);	      localworld.agNum++;	      breedNum++;	      energy-=localworld.breedEnergy;	 }    }else if(output==4&&localworld.agType==1){		//散布种子		Point pt=new Point(x,y);		pt=tryToStep(pt,new Point((int)(Math.cos(direct*Math.PI/2)),(int)(Math.sin(direct*Math.PI/2))));		if(pt.x!=x||pt.y!=y){			energy-=localworld.stepEnergy;			//if(foodNum>1){			//	foodNum--;				energy-=(int)(localworld.SeedGrassE);				localworld.distribute(1,new Point(x,y),2);			//}			x=pt.x;			y=pt.y;		}  	}else{      direct+=2*output-3;      direct=(direct+4)%4;      energy-=localworld.turnEnergy;    }	//Usage[output]++;  }  public Point tryToStep(Point pt,Point step){  		Point pp=new Point(pt.x,pt.y);		pp.x+=step.x;		pp.y+=step.y;		pp.x=(pp.x+localworld.width)%localworld.width;		pp.y=(pp.y+localworld.height)%localworld.height;		if(localworld.WorldState[pt.x][pt.y]==3){			pp.x=pt.x;			pp.y=pt.y;		}		//localworld.WorldState[pt.x][pt.y]=3;		return pp;  }  public void Die(Graphics g){    g.setColor(back_color);    g.fillOval((int) x,(int)y,1,1);    Point pt=GetFromDir(x,y,direct);    g.fillOval((int)pt.x,(int)pt.y,1,1);    //localworld.dataBase.Record(this,1);  }  private Point GetFromDir(int xx,int yy,int dir){    Point pt=new Point(0,0);    pt.x=xx+(int)(Math.cos(dir*Math.PI/2+Math.PI));    pt.y=yy+(int)(Math.sin(dir*Math.PI/2+Math.PI));    return pt;  }  private void CreateRules(Vector ruleTable){    int rulesNum=(int)(999*Math.random())+1;    for(int i=0;i<rulesNum;i++){      int inp[]=new int[inputNum];      for(int j=0;j<inputNum;j++){        inp[j]=(int)(inputType*Math.random());      }      int s0=(int)(sNum*Math.random());      int s1=(int)(sNum*Math.random());      int o=(int)(outputNum*Math.random());      Item item=new Item(inp,s0,o,s1);      boolean Found=false;      for(int j=0;j<ruleTable.size();j++){        Item itm=(Item)ruleTable.elementAt(j);        if(itm.LookUp(inp,s0)==1){          Found=true;          break;        }      }      if(!Found){        ruleTable.addElement(item);      }    }  }  public String ReadRules(int i,String s){    if(i<0||i>rules.size())return "";    Item itm=(Item)rules.elementAt(i);    String out="i:";    if(s=="i"||s==""){      for(int j=0;j<itm.innum;j++){        out+=Integer.toString(itm.input[j])+",";      }    }    if(s=="s"||s==""){      out+=";s:"+Integer.toString(itm.s);    }    if(s=="o"||s==""){      out+=";o:"+Integer.toString(itm.out);    }    if(s=="s1"||s==""){      out+=";s1:"+Integer.toString(itm.s1);    }    return out;  }  public void ChangeRule(){  	for(int i=0;i<rules.size();i++){  		Item it=(Item)rules.elementAt(i);  		if(it.out>=outputNum)it.out=(int)(Math.random()*outputNum);  	}  }  public void GenerateRules(agent ag1,agent ag2){    sNum=ag1.sNum;    if(sNum<ag2.sNum)sNum=ag2.sNum;    int len1=ag1.rules.size();    int len2=ag2.rules.size();    int xsite=(int)(len1*Math.random());    if(xsite>=len2)xsite=len2-1;    for(int i=0;i<len2;i++){       double ran=Math.random();       Item itm=new Item();       Item it;       if(i<xsite){        it=(Item)(ag1.rules.elementAt(i));        itm=it.clone1();       }else{        it=(Item)(ag2.rules.elementAt(i));        itm=it.clone1();       }          boolean checked=false;          boolean Found=false;          if(ran<localworld.muteP){            int t=0;            checked=true;            Item tmpitm=new Item();            Found=true;            while(Found&&t<ag1.rules.size()){              int inp[]=new int[inputNum];              for(int j=0;j<inputNum;j++){                inp[j]=(int)(inputType*Math.random());              }              int s=(int)(sNum*Math.random());              int s1=(int)(sNum*Math.random());              int out=(int)(outputNum*Math.random());              tmpitm=new Item(inp,s,out,s1);              Found=false;              for(int j=0;j<rules.size();j++){                Item itm1=(Item)rules.elementAt(j);                if(itm1.LookUp(inp,s)==1){                  Found=true;                  break;                }              }              t++;            }//当找到相通的规则就一直循环            if(!Found)itm=tmpitm;          }          if(ran>localworld.muteP&&ran<localworld.lenP+localworld.muteP){            double e=Math.random();            if(e<0.5){              checked=true;              if(!Found){                rules.addElement(itm);                itm=new Item();              }              int t=0;              sNum++;              Found=true;              while(Found&&t<ag1.rules.size()){                int inp[]=new int[inputNum];                for(int j=0;j<inputNum;j++){                  inp[j]=(int)(inputType*Math.random());                }                int s0=(int)(sNum*Math.random());                int s1=(int)(sNum*Math.random());                int o=(int)(outputNum*Math.random());                Item item=new Item(inp,s0,o,s1);                Found=false;                for(int j=0;j<rules.size();j++){                  itm=(Item)rules.elementAt(j);                  if(itm.LookUp(inp,s0)==1){                    Found=true;                    break;                  }                }                t++;              }            }else{              Found=false;            }          }          if(i>xsite&&!checked){            Found=false;            for(int j=0;j<rules.size();j++){              Item tmpitm=(Item)rules.elementAt(j);              if(tmpitm.LookUp(itm.input,itm.s)==1){                Found=true;                break;              }            }          }          if(!checked)Found=false;          if(!Found)          rules.addElement(itm);    }  }  public agent clone1(){  	agent agnew=new agent(localworld.agents.size());  	agnew.age=age;  	agnew.back_color=back_color;  	agnew.breedNum=breedNum;  	agnew.color=color;  	agnew.direct=direct;  	agnew.energy=energy;  	agnew.foodNum=foodNum;  	agnew.inputNum=inputNum;  	agnew.inputType=inputType;  	agnew.lasttailpt=lasttailpt;  	agnew.lastx=lastx;  	agnew.lasty=lasty;  	agnew.localworld=localworld;  	agnew.outputNum=outputNum;  	agnew.s=s;  	agnew.sNum=sNum;  	agnew.tail_color=tail_color;  	agnew.x=x;  	agnew.y=y;  	for(int i=0;i<rules.size();i++){  		Item it=(Item)rules.elementAt(i);  		Item it1=it.clone1();  		agnew.rules.addElement(it1);  	}  	return agnew;  	  }  /*public double computeLambda(){		  int sum=0;		  int maxNum=0;		  for(int i=0;i<outputNum;i++){			   sum+=Usage[i];			   if(Usage[i]>maxNum){				  maxNum=(int)(Usage[i]);			   }		  }		  if(sum==0){			  return -1;		  }else{			  return 1-(double)maxNum/(double)sum;		  }	  }*/}class Item{  int input[];  int innum;  int s;  int out;  int s1;    public Item(int inp[],int s0,int o,int s2){      innum=inp.length;      input=new int[innum];      for(int i=0;i<innum;i++){        input[i]=inp[i];      }      s=s0;      out=o;      s1=s2;    }    public Item(){      innum=3;      input=new int[innum];      for(int i=0;i<innum;i++){        input[i]=0;      }      s=0;      out=0;      s1=0;    }    public int LookUp(int inp[],int s0){      int same=0;      for(int i=0;i<innum;i++){        if(input[i]==inp[i]){          same++;        }      }      if(same==innum&&s==s0){        return 1;      }else{        return 0;      }    }    public Item clone1(){      Item out1=new Item();      out1.innum=innum;      for(int i=0;i<innum;i++){         out1.input[i]=input[i];      }      out1.out=out;      out1.s=s;      out1.s1=s1;      return out1;    }    }

⌨️ 快捷键说明

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