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

📄 genericonjava.java

📁 前段时间用JAVA改写的遗传算法
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		    	}
		        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 + -