📄 function.java
字号:
package com.dbhunter.ga;
/**
* 2008.4.11
* @author dbhunter
* @E-mail:dbhunter@126.com
*/
import java.text.DecimalFormat;
import java.util.Vector;
//import java.io.BufferedReader;
//import java.io.StringReader ;
public class Function {
private int funID;
private char codeType;
private int parameterNum;
private int precision;
private double maxValue;
private double minValue;
private String codeName,selectionName,crossName,genovariationName;
private StringBuffer sbBestGeneetail;
private StringBuffer sblastGenes;
//private BufferedReader br;
//private StringReader sr;
/**
* @param funID 函数标识
* @param codeType 编码类型 b binary, d decimal
* @param parameterNum 函数的参数个数
* @param precision 要求的精确度
* @param maxValue 定义域最大值
* @param minValue 定义域最小值
*/
public Function(int funID,char codeType,int precision){
this.funID = funID;
this.codeType = codeType;
this.precision = precision;
this.sbBestGeneetail = new StringBuffer();
this.sblastGenes = new StringBuffer();
//this.br = new BufferedReader(new StringReader(" "));
switch(funID){
case 1:
this.parameterNum =3;
this.maxValue = 5.12;
this.minValue = -5.12;
break;
case 2:
this.parameterNum =2;
this.maxValue = 2.048;
this.minValue = -2.048;
break;
case 3:
this.parameterNum =5;
this.maxValue = 5.12;
this.minValue = -5.12;
break;
case 4:
this.parameterNum =30;
this.maxValue = 1.28;
this.minValue =-1.28;
break;
case 5:
this.parameterNum =2;
this.maxValue = 65.536;
this.minValue =-65.536;
break;
case 6:
this.parameterNum =20;
this.maxValue = 5.12;
this.minValue =-5.12;
break;
case 7:
this.parameterNum =10;
this.maxValue = 500;
this.minValue =-500;
break;
case 8:
this.parameterNum =10;
this.maxValue = 600;
this.minValue =-600;
break;
default:break;
}
}
public int getFunID() {
return funID;
}
public void setFunID(int funID) {
this.funID = funID;
}
public double getMaxValue() {
return maxValue;
}
public void setMaxValue(double maxValue) {
this.maxValue = maxValue;
}
public double getMinValue() {
return minValue;
}
public void setMinValue(double minValue) {
this.minValue = minValue;
}
public int getParameterNum() {
return parameterNum;
}
public void setParameterNum(int parameterNum) {
this.parameterNum = parameterNum;
}
public int getPrecision() {
return precision;
}
public void setPrecision(int precision) {
this.precision = precision;
}
public char getCodeType() {
return codeType;
}
public void setCodeType(char codeType) {
this.codeType = codeType;
}
/**
* 2008-4-12
*author dbhunter
*Email dbhunter@126.com
* @param str 要求输入为数字字符串,不可以为字母等其他字符
* @return
*/
public int stringToInt(String str){
return Integer.valueOf(str).intValue();
}
/**
* 2008-4-12
* 计算二进制编码的十进制值
*author dbhunter
*Email dbhunter@126.com
* @param vecBc 输入vector类型的二进制码串
* @return 对应的十进制数
*/
public int binaryToDecimal(Vector vecBc){
int intDec = 0;
for(int i=0;i<vecBc.size();i++){
intDec = intDec+(int)(stringToInt(vecBc.elementAt(i).toString())*Math.pow((double)2,(double)(vecBc.size()-1 -i)));
}
return intDec;
}
/**
* 2008.4.10
* 根据精度和定义域[u,v]计算码长L
* 计算方法:
* L=(int)floor(log(v-u)/log(2.0))+1
* double minValue 定义域的上界
* double maxValue 定义域的下界
* int precision 要求的精度
* 注:log本身返回double型
*/
public int getCodeLen(){
int len=0;
len = (int)Math.floor(Math.log((this.maxValue-this.minValue)*Math.pow((double)10,(double)this.precision))/Math.log(2))+1;
return len;
}
public Vector getDifferentPartPosition(Vector vca,Vector vcb){
Vector vc = new Vector();
for(int i=0;i<vca.size();i++){
if(!vca.elementAt(i).equals(vcb.elementAt(i))){
vc.add(i);
}
}
return vc;
}
/**
* 2008-4-12
* 求解对应于定义域上的实数值
*author dbhunter
*Email dbhunter@126.com
* x= u+x'(v-u)/(2^L-1)
* @param decimalValue 二进制对应的十进制数
* @return 实数值
*/
public double getReal(int decimalValue){
double cr =0;
int codeLen;
codeLen = getCodeLen();
cr = minValue+decimalValue*((this.maxValue-this.minValue)/(Math.pow((double)2,(double)codeLen)-1));
return cr;
}
/**
* 2008-4-12
* author dbhunter
* @param number 取double类型数据的小数点后第index位值
* @param index 位数
* @return
*/
public int getNum(double number,int index){
int num = 0;
for(int i=0;i<index;i++){
number = number - (int)number;
num = (int)(number*(int)Math.pow(10, index))%10;
}
return num;
}
/**
* 2008-4-13
* 返回大于等于某数num的最小素数
* author dbhunter
* @param num 输入数字
* @return 大于等于某数num的最小素数
*/
public int minPrimeNum(int num){
int k,minPrimeNum =num;
while(true){
for(k=2;k<minPrimeNum;k++){
if(minPrimeNum%k==0){
break;
}
}
if(minPrimeNum==k) {
return minPrimeNum;
}
minPrimeNum++;
}
}
public void primeNum(int Max){
int rowNum =20;
int counter=0;
int j;
for(int i=2;i<Max;i++){
for(j=2;j<=i;j++){
if(i%j==0){
break;
}
}
if(i==j) {
System.out.print(i+" ");
counter++;
if(counter%rowNum==0){
System.out.println();
}
}
}
}
public String doubleToString(int precision,double d){
String str = "0.";
for(int i=0;i<precision;i++){
str = str +"0";
}
return new DecimalFormat(str).format(d);
}
/**
* 2008-4-13
* author dbhunter
* @param k 某个基因中的第k维
* @param p 满足p>=2*t+3 的最小素数 ,t为基因的最大维数
* @return 计算出的佳点集r(k)的值
*/
public double goodPointFun(int k,int p){
return 2*Math.cos((2*Math.PI*k)/p);
}
/**
* 2008-4-13
* author dbhunter
* @param d double类型数
* @return 数d的小数部分 算法为 如果d>=0 取其小数部分,如果d<0,则取1-|d-(int)d|
*/
public double getDecimalPart(double d){
if(d>=0){
return d-(int)d;
}
else{
return 1-Math.abs(d-(int)d);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -