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

📄 efloys.java

📁 一个swarm的小程序
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	void GetParameters() {
		
		//储存参数的数值
		String s;
		Float temp;
		int IntPar;
		float FloatPar;

		params[0].value = GetOneParameter("MaxSpeed",5f);
		params[1].value = GetOneParameter("BounceSpeed",0.8f);
		params[2].value = GetOneParameter("ApproachAcceleration",0.3f);
		params[4].value = GetOneParameter("CenterAcceleration",0.1f);
		params[5].value = GetOneParameter("DistBrotherFactor",1f);
		params[6].value = GetOneParameter("DistStrangerFactor",20f);
		params[7].value = GetOneParameter("DistLocalFactor",0f);
		params[8].value = GetOneParameter("CollisionDistance",200f);
		params[9].value = GetOneParameter("CollisionBrotherFactor",-1f);
		params[10].value = GetOneParameter("CollisionStrangerFactor",30f);
		params[11].value = GetOneParameter("CollisionLocalFactor",-40f);

		fixpars[5].value = GetOneParameter("NumberOfNeighbors",2f);
		fixpars[6].value = GetOneParameter("MutationFactor",0.1f);
		fixpars[7].value = GetOneParameter("CrossoverFactor",1f);
		fixpars[8].value = GetOneParameter("energy",10f);
		fixpars[9].value = GetOneParameter("safety",10f);
		fixpars[10].value = GetOneParameter("cooperation",10f);

		envpars[5].value = GetOneParameter("EnergyFactor",1f);
		envpars[6].value = GetOneParameter("SafetyFactor",1f);
		envpars[7].value = GetOneParameter("CooperationFactor",0f);
		envpars[8].value = GetOneParameter("SurviversFactor",0f);
		envpars[12].value = GetOneParameter("PopulationSize",15f);
		envpars[13].value = GetOneParameter("FreeWillFactor",0.05f);
		envpars[14].value = GetOneParameter("LifeSpan",50f);

		NF = (int) envpars[12].value;
		SLEEP = (long) envpars[3].value;
		KICK =  envpars[13].value;

}


	public void randemize()
	{
		int i,j,k,n;
		//随机的选择邻居
		CurrentRandom++;
		for (k=0;k<Efloys.length;k++) {
			Efloy ng = Efloys[k];
			for (j=0;j<ng.NumberOfNeighbors;j++) {
				n =(int) (Math.random()*(Efloys.length-1));
				//if (n == k) {
				//	if (n == 0) n++;
				//	else n--;
				//}
				ng.neighbors[j] = Efloys[n];
			}
		}
	}


	public void scramble() {

		int i;
		//重新产生新的参数值,让每个个体都变异。	
		for (i=0;i<Efloys.length;i++) {
			Efloys[i].shuffle(false,(float) 0.3);
		}

		GetSumFitness();

		for (i=0;i<Efloys.length;i++) {
			if (Efloys[i].type == 1) {
				Efloys[i].energy = Efloys[i].LifeSpan;
			}
		}

	}



	public void CreateNewGeneration() {

		//w = GetWinner();
		//制造新的一代
		RecordGeneration();

		CurrentGeneration++;
		//平滑适应度
		PreScale();
		//繁殖
		Breed();
		//释放异己
		ReleaseStranger();
		
		NewGeneration = false;
		CurrentStep = 0;
			
		showStatus("Generation #" + CurrentGeneration);
		
	}


	public int GetWinner() {

		//得到竞争中的赢者
		int i, winner, e;
			
		e = 0;
		winner = 0;

		for (i=0;i<Efloys.length;i++) {
			Efloys[i].GetFitness();
			if (Efloys[i].fitness > e) {
				e = Efloys[i].fitness;
				winner = i;
			}
		}

		return winner;
	}


	public void RecordGeneration() {
		//记录下当前这个代的参数值
		int i, w, fit;
		float SpeedSum, SpeedAvg, AccSum, AccAvg;
		float DllSum, DllAvg, DslSum, DslAvg, DlsSum, DlsAvg;
		float CllSum, CllAvg, CslSum, CslAvg, ClsSum, ClsAvg;
			
		fit = 0;
		w = 0;
		SpeedSum = 0;
		AccSum = 0;
		DllSum = 0;
		DlsSum = 0;
		DslSum = 0;
		CllSum = 0;
		ClsSum = 0;
		CslSum = 0;

		for (i=0;i<Efloys.length;i++) {
			SpeedSum = SpeedSum + Efloys[i].MaxSpeed;
			AccSum = AccSum + Efloys[i].ApproachAcceleration;
			DllSum = DllSum + Efloys[i].DistBrotherFactor;
			DlsSum = DllSum + Efloys[i].DistStrangerFactor;
			DslSum = DllSum + Efloys[i].DistLocalFactor;
			CllSum = CllSum + Efloys[i].CollisionBrotherFactor;
			ClsSum = CllSum + Efloys[i].CollisionStrangerFactor;
			CslSum = CllSum + Efloys[i].CollisionLocalFactor;

			Efloys[i].GetFitness();
			if (Efloys[i].fitness > fit) {
				fit = Efloys[i].fitness;
				w = i;
			}
		}

		SpeedAvg = (float) SpeedSum/Efloys.length;
		AccAvg = (float) AccSum/Efloys.length;
		DllAvg = (float) DllSum/Efloys.length;
		DlsAvg = (float) DlsSum/Efloys.length;
		DslAvg = (float) DslSum/Efloys.length;
		CllAvg = (float) CllSum/Efloys.length;
		ClsAvg = (float) ClsSum/Efloys.length;
		CslAvg = (float) CslSum/Efloys.length;
		//将每代的数值编码到基因型里面进行纪录
		Efloys[w].GetFitness();
		FloyGen = new EfloyGeneration(CurrentGeneration, CurrentStep, 0, Efloys[w].id, Efloys[w].chrom, 
			Efloys[w].fitness, Efloys[w].energy, Efloys[w].safety, 
			Efloys[w].cooperation, Efloys[w].MaxSpeed,Efloys[w].ApproachAcceleration,
			AccSum,AccAvg,DllAvg,DlsAvg,DslAvg,CllAvg,ClsAvg,CslAvg);

		HistoryData.addElement(FloyGen);

	}


	void InitParamsLimited() {
		//初始化各个参数的范围
		params = new EfloyParam[12];

		params[0]  = new EfloyParam(1f,11f,0.5f,5f,"MaxSpeed",true);
		params[1]  = new EfloyParam(0.2f,2.2f,0.1f,0.8f,"BounceSpeed",true);
		params[2]  = new EfloyParam(0.1f,1.1f,0.05f,0.3f,"ApproachAcceleration",true);
		params[3]  = new EfloyParam(0.1f,1.1f,0.05f,0.3f,"RetreatAcceleration",true);
		params[4]  = new EfloyParam(0f,0.2f,0.01f,0.1f,"CenterAcceleration",true);

		params[5]  = new EfloyParam(0f,10f,0.5f,1f,"DistBrotherFactor",true);
		params[6]  = new EfloyParam(0f,50f,2.5f,20f,"DistStrangerFactor",true);
		params[7]  = new EfloyParam(-50f,50f,0.5f,0f,"DistLocalFactor",true);

		params[8]  = new EfloyParam(0f,500f,25f,200f,"CollisionDistance",true);

		params[9]  = new EfloyParam(-10f,0f,0.5f,-1f,"CollisionBrotherFactor",true);
		params[10] = new EfloyParam(0f,100f,5f,30f,"CollisionStrangerFactor",true);
		params[11] = new EfloyParam(-100f,0f,5f,-40f,"CollisionLocalFactor",true);



		fixpars = new EfloyParam[12];

		fixpars[0] = new EfloyParam(1f,100f,1f,(float) CurrentNum,"id",false);
		fixpars[1] = new EfloyParam(1f,100f,1f,0f,"father",false);
		fixpars[2] = new EfloyParam(1f,100f,1f,0f,"mother",false);
		fixpars[3] = new EfloyParam(0f,10f,1f,0f,"type",false);
		fixpars[4] = new EfloyParam(0f,13f,1f,5f,"color",false);
		fixpars[5] = new EfloyParam(1f,10f,1f,2f,"NumberOfNeighbors",false);
		fixpars[6] = new EfloyParam(0f,0.2f,0.01f,0.1f,"MutationFactor",false);
		fixpars[7] = new EfloyParam(0f,1f,0.1f,1f,"CrossoverFactor",false);

		fixpars[8] = new EfloyParam(0f,100f,10f,10f,"energy",true);
		fixpars[9] = new EfloyParam(0f,100f,10f,10f,"safety",true);
		fixpars[10] = new EfloyParam(0f,100f,10f,10f,"cooperation",true);
		
		fixpars[11] = new EfloyParam(0f,100f,10f,10f,"fitness",true);



		envpars = new EfloyParam[15];

		float h = (float) canvas.size().height;
		float w = (float) canvas.size().width;

		envpars[0] = new EfloyParam(100f,1000f,10f,w,"width",false);
		envpars[1] = new EfloyParam(100f,1000f,10f,h,"height",false);
		envpars[2] = new EfloyParam(1f,10f,1f,4f,"v0",false);
		envpars[3] = new EfloyParam(5f,50f,5f,10f,"sleep",false);
		envpars[4] = new EfloyParam(0f,50f,5f,30f,"margin",false);

		envpars[5] = new EfloyParam(0f,10f,1f,1f,"EnergyFactor",true);
		envpars[6] = new EfloyParam(0f,10f,1f,1f,"SafetyFactor",true);
		envpars[7] = new EfloyParam(0f,10f,1f,0f,"CooperationFactor",true);
		envpars[8] = new EfloyParam(0f,100f,10f,0f,"SurviversFactor",true);

 		envpars[9] = new EfloyParam(-10f,10f,1f,1f,"MaxEnergyDose",true);
		envpars[10] = new EfloyParam(-10f,10f,1f,1f,"MaxSafetyDose",true);
		envpars[11] = new EfloyParam(-10f,10f,1f,1f,"MaxCooperationDose",true);

		envpars[12] = new EfloyParam(5f,50f,5f,15f,"PopulationSize",true);
		envpars[13] = new EfloyParam(0.01f,0.1f,0.01f,0.05f,"FreeWillFactor",true);
		envpars[14] = new EfloyParam(10f,200f,10f,50f,"LifeSpan",true);

	}


	void InitParamsExtended() {
		//初始化扩展参数范围
		params = new EfloyParam[12];

		params[0]  = new EfloyParam(1f,11f,0.5f,5f,"MaxSpeed",true);
		params[1]  = new EfloyParam(0.2f,2.2f,0.1f,0.8f,"BounceSpeed",true);
		params[2]  = new EfloyParam(0.1f,2.1f,0.1f,0.3f,"ApproachAcceleration",true);
		params[3]  = new EfloyParam(0.1f,2.1f,0.1f,0.3f,"RetreatAcceleration",true);
		params[4]  = new EfloyParam(0f,0.2f,0.01f,0.1f,"CenterAcceleration",true);

		params[5]  = new EfloyParam(-10f,10f,1f,1f,"DistBrotherFactor",true);
		params[6]  = new EfloyParam(-50f,50f,5f,20f,"DistStrangerFactor",true);
		params[7]  = new EfloyParam(-50f,50f,5f,0f,"DistLocalFactor",true);

		params[8]  = new EfloyParam(0f,500f,25f,200f,"CollisionDistance",true);

		params[9]  = new EfloyParam(-10f,10f,1f,-1f,"CollisionBrotherFactor",true);
		params[10] = new EfloyParam(-100f,100f,10f,30f,"CollisionStrangerFactor",true);
		params[11] = new EfloyParam(-100f,100f,10f,-40f,"CollisionLocalFactor",true);



		fixpars = new EfloyParam[12];

		fixpars[0] = new EfloyParam(1f,100f,1f,(float) CurrentNum,"id",false);
		fixpars[1] = new EfloyParam(1f,100f,1f,0f,"father",false);
		fixpars[2] = new EfloyParam(1f,100f,1f,0f,"mother",false);
		fixpars[3] = new EfloyParam(0f,10f,1f,0f,"type",false);
		fixpars[4] = new EfloyParam(0f,13f,1f,5f,"color",false);
		fixpars[5] = new EfloyParam(1f,10f,1f,2f,"NumberOfNeighbors",false);
		fixpars[6] = new EfloyParam(0f,0.2f,0.01f,0.1f,"MutationFactor",false);
		fixpars[7] = new EfloyParam(0f,1f,0.1f,1f,"CrossoverFactor",false);

		fixpars[8] = new EfloyParam(0f,100f,10f,10f,"energy",true);
		fixpars[9] = new EfloyParam(0f,100f,10f,10f,"safety",true);
		fixpars[10] = new EfloyParam(0f,100f,10f,10f,"cooperation",true);
		
		fixpars[11] = new EfloyParam(0f,100f,10f,10f,"fitness",true);



		envpars = new EfloyParam[15];

		float h = (float) canvas.size().height;
		float w = (float) canvas.size().width;

		envpars[0] = new EfloyParam(100f,1000f,10f,w,"width",false);
		envpars[1] = new EfloyParam(100f,1000f,10f,h,"height",false);
		envpars[2] = new EfloyParam(1f,10f,1f,4f,"v0",false);
		envpars[3] = new EfloyParam(5f,50f,5f,10f,"sleep",false);
		envpars[4] = new EfloyParam(0f,50f,5f,30f,"margin",false);

		envpars[5] = new EfloyParam(0f,10f,1f,1f,"EnergyFactor",true);
		envpars[6] = new EfloyParam(0f,10f,1f,1f,"SafetyFactor",true);
		envpars[7] = new EfloyParam(0f,10f,1f,0f,"CooperationFactor",true);
		envpars[8] = new EfloyParam(0f,100f,10f,0f,"SurviversFactor",true);

 		envpars[9] = new EfloyParam(0f,20f,1f,10f,"MaxEnergyDose",true);
		envpars[10] = new EfloyParam(0f,20f,1f,10f,"MaxSafetyDose",true);
		envpars[11] = new EfloyParam(0f,20f,1f,10f,"MaxCooperationDose",true);

		envpars[12] = new EfloyParam(5f,50f,5f,15f,"PopulationSize",true);
		envpars[13] = new EfloyParam(0f,0.1f,0.01f,0.05f,"FreeWillFactor",true);
		envpars[14] = new EfloyParam(10f,200f,10f,50f,"LifeSpan",true);

	}


	static String EncodeChrom(EfloyParam pars[]) {
		//对参数进行染色体编码
		int i;
		char kar;
		String st;
		StringBuffer sb = new StringBuffer(pars.length);

		for (i=0;i<pars.length;i++) {
			kar = pars[i].EncodeValue();
			sb.append(kar);
		}

		st = sb.toString();
		return st;

	}


	
	static public void reset() {

		NF = 15;
		KICK = (float) 0.05;
		SLEEP = 10;

	}
	

	private int GetFloyNumber(int fid) {

		int i, num;

		num = -1;
		for (i=0;i<Efloys.length;i++)
	 	{
			if (Efloys[i].id == fid)
				num= i;
		}
		return num;

	}

	public void ReleaseStranger() {

		int num;

		num = GetFloyNumber(0);
		Efloys[num].type =1;
		Efloys[num].color = Color.red;
		Efloys[num].energy = Efloys[num].LifeSpan;
		Efloys[num].safety = 10;
		Efloys[num].cooperation = 10;
		Efloys[num].GetFitness();
		Efloys[num].x = canvas.size().width;
		Efloys[num].y = 0;
		Efloys[num].DistLocalFactor = 0;
		Efloys[num].CollisionLocalFactor = -40;
		Efloys[num].CenterAcceleration = 0.1f;

	}


	public boolean mouseEnter(Event evt, int x, int y) {

	
		if (evt.target == Start) {
			showStatus("Restart the Floys population with identical default values");
		}
		if (evt.target == Scramble) {
			showStatus("Give a high dose of radiation, causing many mutations and diverse population");
		}
		if (evt.target == Pause) {
			showStatus("Freeze all movement. A second click will resume movement");
		}
		if (evt.target == Evolution) {
			showStatus("Start/Stop a continuous process, where breeding occurs each time a stranger is killed");
		}
		if (evt.target == Rules) {
			showStatus("Display eFloys behavioral rules and the rules of the game");
		}
		if (evt.target == Info) {
			showStatus("Display Floys' traits, environmental properties and history data");
		}
		if (evt.target == Control) {
			showStatus("Modify individual or global properies - assign different colors to modified Floys");
		}
		if (evt.target == Slower) {
			showStatus("Define a slower Floy movement - click multiple time to get the desired effect");
		}
		if (evt.target == Faster) {
			showStatus("Define a faster Floy movement - click multiple time to get the desired effect");
		}
		if (evt.target == Stranger) {
			showStatus("Release a red intruder into the territory, and local Floys will chase and attack him");
		}
 		if (evt.target == Breed) {
			showStatus("Create a new generation, where each new Floy is the descendant of two old parents");
		}
 		if (evt.target == Help) {
			showStatus("Display help screen. Close the help screen by clicking its top right X icon");
		}
 		if (evt.target == Log) {
			showStatus("Display Log screen (log notes of current session). Close by clicking top right X icon");
		}
 		if (evt.target == Predefined) {
			showStatus("Select a set of predefined properties that define a specific environment and/or population");
		}

 		if (evt.target == Numbers) {
			showStatus("Toggle between display of Floys (fish like) shape and Floys identity numbers");
		}
 		if (evt.target == Sound) {
 			showStatus("Turn Off or On the sound effects (e.g. the sigh of a dying Floy)");
		}
 		if (evt.target == Ranges) {
 			showStatus("Limit/Reset variation ranges of properties during evolution");
		}
		
		return true;
	}


	public void Restart(boolean Reset) {

		int i;
		String st, fx, ev;
		//重新开始
		if (Reset) {

			HistoryData.removeAllElements();

			InEvolution = false;
			NewGeneration = false;
			CurrentStep = 0;
			CurrentTotalStep = 0;
			CurrentGeneration = 0;

			ResetPopulation = true;
			stop();
			First = true;
			showStatus("");
			start();
		}
		//将当前代的所有个体的参数值进行编码
		if (ResetPopulation) {
			Efloys = new Efloy[NF];

⌨️ 快捷键说明

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