📄 operators.java
字号:
package com.lqy.GEP;
import java.util.*;
public class Operators {
public static Operators instance;
public static Operators getInstance(){
return instance==null?new Operators():instance;
}
private Operators(){}
public Chromosome mutate(Chromosome argC,double argD){
Chromosome tempC=argC.copyChromosome();
Random tempR=new Random();
int tempIF=argC.getHeadLength();
int tempIT=argC.getHeadLength()+argC.getTailLength();
int tempIP=argC.getTotalLength();
for(int i=0;i<argC.getTotalLength();i++){
if(tempR.nextDouble()<argD){
String tempS=tempC.getGeneByIndex(i);
if(i<tempIF)
tempC.setGeneByIndex(i, this.getRandomFunction(tempC.getFunctionSet(),tempS));
else if(i<tempIT)
tempC.setGeneByIndex(i, this.getRandomTerminal(tempC.getTerminalSet(),tempS));
else tempC.setGeneByIndex(i, this.getRandomParameter(tempC.getCP().length,tempS));
}
}
// tempC.construct();
// argC.buildEvaluator();
return tempC;
}
private String getRandomFunction(String[] argC,String argS){//随机产生一个不同于argS的函数字符串
Random tempR=new Random();
//String[] tempS=argC;
int tempI=tempR.nextInt(argC.length);
while(argC[tempI].equals(argS)){
tempI=tempR.nextInt(argC.length);
}
return argC[tempI];
}
private String getRandomTerminal(String[] argC,String argS){//随机产生不同于argS的终结字符串
Random tempR=new Random();
//String[] tempS=argC.getTerminalSet();
int tempI=tempR.nextInt(argC.length);
while(argC[tempI].equals(argS)){
tempI=tempR.nextInt(argC.length);
}
return argC[tempI];
}
private String getRandomParameter(int argI,String argS){//随机产生不同于argS的常数,返回常数的字符串表示
/*基因中记录的是参数池的下标
Random tempR=new Random();
double[] tempDS=argC.getCP();
double tempD=Double.parseDouble(argS.trim());
int tempI=tempR.nextInt(tempDS.length);
while(tempDS[tempI]==tempD){
tempI=tempR.nextInt(tempDS.length);
}
return String.valueOf(tempDS[tempI]);
*/
Random tempR=new Random();
int tempI=Integer.parseInt(argS);//当前下标
// int tempCPI=argC.getCP().length;
// int tempCPL=argC.getCP().length;//参数池长度
int tempRI=tempR.nextInt(argI);
while(tempRI==tempI){
tempRI=tempR.nextInt(argI);
}
return String.valueOf(tempRI);
}
public Chromosome[] onepointCrossover(Chromosome[] argCS,int argI){//argI 交叉位置,0到totallength-1
//基因复制的位置在argI后面一位
Chromosome[] tempCS=new Chromosome[]{argCS[0].copyChromosome(),argCS[1].copyChromosome()};
int tempI=argCS[0].getTotalLength();
for(int i=argI+1;i<tempI;i++){
String tempS=tempCS[0].getGeneByIndex(i);
//System.out.print(tempS+" ");
tempCS[0].setGeneByIndex(i, tempCS[1].getGeneByIndex(i));
tempCS[1].setGeneByIndex(i, tempS);
}
return tempCS;
}
public Chromosome[] twopointCrossvoer(Chromosome[] argCS,int argIA,int argIB){
int tempIA=argIA;
int tempIB=argIB;
if(argIA>argIB){
tempIA=argIB;
tempIB=argIA;
}else{
tempIA=argIA;
tempIB=argIB;
}//tempIA是起始位置,tempIB是终结位置
Chromosome[] tempCS=new Chromosome[]{argCS[0].copyChromosome(),argCS[1].copyChromosome()};
for(int i=tempIA+1;i<=tempIB;i++){
String tempS=tempCS[0].getGeneByIndex(i);
tempCS[0].setGeneByIndex(i, tempCS[1].getGeneByIndex(i));
tempCS[1].setGeneByIndex(i, tempS);
}
return tempCS;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -