📄 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 + -