📄 genericonjava.java
字号:
}
bestfit.fitness = pop[j].fitness;
bestfit.varible = pop[j].varible;
bestfit.generation = gen;
}
}
// * 计算平均适应度 * /
avg = sumfitness / popsize;
}
public void skip(int skipcount){ //skip function
int j;
for (j = 1;j<=skipcount;++j){
System.out.println();
}
}
public void writepop(){ //writepop function
individual pind=new individual();
int j;
for (j = 0;j<popsize;++j){
System.out.print(j + 1);
//* 当前代个体 */
pind = oldpop[j];
writechrom(pind.chrom);
System.out.print(pind.fitness);
//* 新一代个体 */
pind = newpop[j];
System.out.print("("+pind.parent[0]+"," +pind.parent[1]+") "+pind.xsite);
writechrom(pind.chrom);
System.out.println(pind.fitness);
}
}
public void writechrom(int chrom[]){ //* 输出染色体编码 *///writechrom function
int j, k, stop;
int mask, tmp;
mask = 1;
for (k = 0;k<chromsize;++k){
tmp = chrom[k];
if (k == (chromsize - 1)){
stop = lchrom - (k * 32);
}else{
stop = 8 * 4;
}
for(j = 0;j<stop;++j){
if ((tmp & mask)==1){
System.out.print("1");
}else{
System.out.print("0");
}
tmp = tmp >> 1;
}
}
}
public void report(){ //* 输出种群统计结果 *///report function
int i;
for(i=0;i<80;++i){
System.out.print("-");
}
skip(1);
if (printstrings == 1){
for(i=0;i<(80 - 17) / 2;++i){
System.out.print(" ");
}
System.out.println("模拟计算统计报告 ");
System.out.println("世代数"+gen);
for(i=0;i<(80 - 28);++i){
System.out.print(" ");
}
System.out.println("世代数"+(gen + 1));
System.out.print("个体 染色体编码");
for(i=0;i<lchrom - 5;++i){
System.out.print(" ");
}
System.out.print("适应度 父个体 交叉位置 ");
System.out.print("染色体编码 ");
for(i=0;i<lchrom - 5;++i){
System.out.print(" ");
}
System.out.print("适应度");
for(i=0;i<80;++i){
System.out.print("-");
}
skip(1);
writepop();
for(i=0;i<80;++i){
System.out.print("-");
}
skip(1);
}
System.out.println("第"+gen+"代统计: ");
System.out.println("总交叉操作次数 ="+ncross+", 总变异操作数 ="+nmutation);
System.out.println("最小适应度:"+min+"最大适应度:"+max+"平均适应度"+avg);
System.out.println("迄今发现最佳个体 => 所在代数:"+bestfit.generation);
System.out.println("适应度:"+bestfit.fitness+" 染色体:");
writechrom(bestfit.chrom);
System.out.println("对应的变量值: "+bestfit.varible);
skip(1);
for(i=0;i<80;++i){
System.out.print("-");
}
skip(1);
}
public void initdata(){ //initdata function//* 遗传算法参数输入 */
System.out.println("种群大小(50-5000):");
popsize=scanner.nextInt();
if ((popsize % 2)!=0){
System.out.println("种群大小已设置为偶数");
popsize++;
}
System.out.println("染色体长度(64-1000):");
lchrom=scanner.nextInt();
System.out.println("是否输出染色体编码(y/n)");
printstrings = 1;
answer=scanner.next();
if (answer.equals("n")){ //
printstrings = 0;
}
System.out.println("最大世代数(100 - 300):");
maxgen=scanner.nextInt();
System.out.println("交叉率(0.2-0.99):");
pcross=scanner.nextFloat();
System.out.println("变异率(0.01-0.9):");
pmutation=scanner.nextFloat();
}
public void warmup_random(float random_seed){ // * 初始化随机数发生器 * ///warmup_random function
int j1, ii;
double new_random, prev_random;
oldrand[54] = random_seed;
new_random = 0.000000001;
prev_random = random_seed;
for (j1 = 1;j1<55;++j1){
ii = (21 * j1) % 54;
oldrand[ii] = new_random;
new_random = prev_random - new_random;
if (new_random < 0.0){
new_random = new_random + 1.0;
}
prev_random = oldrand[ii];
}
advance_random();
advance_random();
advance_random();
jrand = 0;
}
public void GArandomize(){ /* 设定随机数种子并初始化随机数发生器 *///GArandomize function
float randomseed;
int j1;
for(j1 = 0;j1<55;++j1){
oldrand[j1] = 0.0;
}
jrand = 0;
do{
System.out.print("随机数种子[0 - 1]: ");
randomseed=scanner.nextFloat();
}while((randomseed < 0.0) || (randomseed > 1.0));
warmup_random(randomseed);
}
public void initpop(){ //initpop function
int j, j1, k, stop;
int mask;
mask = 1;
for(int i=0;i<oldpop.length;++i){ //instantiation
oldpop[i]=new individual();
temp[i]=new individual();
newpop[i]=new individual();
}
for (j = 0;j<popsize;++j){
for(k = 0;k<chromsize;++k){
oldpop[j].chrom[k] = 0;
if(k == chromsize - 1){
stop = lchrom - (k * (8 * 4));
}else{
stop = 8 * 4;
}
for (j1 = 1;j1<=stop;++j1){
oldpop[j].chrom[k] = oldpop[j].chrom[k] << 1;
if(flip((float)0.5)){
oldpop[j].chrom[k] = oldpop[j].chrom[k] | mask;
}
}
}
oldpop[j].parent[0] = 0;
oldpop[j].parent[1] = 0;
oldpop[j].xsite = 0;
objfunc(oldpop[j]);
}
}
public void initreport(){ //initreport function//* 初始参数输出 /*
skip(1);
System.out.println(" 基本遗传算法参数");
System.out.println(" -------------------------------------------------");
System.out.println("种群大小(popsize) ="+popsize);
System.out.println("染色体长度(lchrom) ="+lchrom);
System.out.println("最大进化代数(maxgen) ="+maxgen);
System.out.println("交叉概率(pcross) ="+pcross);
System.out.println("变异概率(pmutation) ="+pmutation);
System.out.println(" -------------------------------------------------");
skip(1);
}
public void initialize(){ //* 遗传算法初始化 *///initialize function
//* 键盘输入遗传算法参数 */
initdata();
//* 确定染色体的字节长度 */
chromsize = lchrom / (8 * 4);
if (((lchrom % (8 * 4)) == 0)||(lchrom < (8 *4))){
chromsize++;
}
//* 初始化随机数发生器 */
GArandomize();
//* 初始化全局计数变量和一些数值*/
nmutation = 0;
ncross = 0;
bestfit.fitness = 0.0;
bestfit.generation = 0;
//* 初始化种群,并统计计算结果 */
initpop();
statistics(oldpop);
initreport();
}
public static void main(String arg[]){ //main function
SGA sga=new SGA(); //instantiation
System.out.println("输入遗传算法执行次数(1-5):");
int maxruns=sga.scanner.nextInt();
for(int run=1;run<=maxruns;++run){
sga.initialize();
for(sga.gen=0;sga.gen<sga.maxgen;++sga.gen){
sga.generation(); // 产生新一代
sga.statistics(sga.newpop);// * 计算新一代种群的适应度统计数据 *
sga.report();// * 输出新一代统计数据 * /
sga.temp=sga.oldpop;
sga.oldpop= sga.newpop;
sga.newpop= sga.temp;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -