📄 efloys.java
字号:
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 + -