博客列表 >java遗传算法

java遗传算法

Console的博客
Console的博客原创
2018年05月09日 13:41:531043浏览
实例
package hello;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class AI2 {
	/**
	 * 种群数量
	 */
	public static int NIND=40;
	/**
	 * 遗传代数
	 */
	public static int MAXGEN=40;
	/**
	 * 染色体长度
	 */
	public static int PRECI=22;
	/**
	 * 区间下界
	 */
	public static double lb=-1.0;
	/**
	 * 区间上界
	 */
	public static double ub=2.0;
	/**
	 * 交叉概率
	 */
	public static double px=0.7;
	/**
	 * 变异概率
	 */
	public static double pm=0.01;
	public static Random random=new Random();
	/**
	 * 种群中的最好个体
	 */
	static Chromosome bestChromosome=new Chromosome();
	/**
	 * 求2的t次方
	 * @param t
	 * @return
	 */
	public static double pow(int t){
		double res=1.0;
		for(int i=0;i<t;i++){
			res*=2.0;
		}
		return res;
	}
	/**
	 * 计算对应十进制,如11对应3
	 * @param list
	 * @return
	 */
	public static double toBinary(List<Integer>list){
		String s="";
		for (int i = 0; i < list.size(); i++) {
			s+=Integer.toString(list.get(i));
		}
		double t=(double)(Integer.parseInt(s, 2));
		return t;
	}
	/**
	 * 计算对应的十进制小数
	 * @param list
	 * @return
	 */
	public static double bs2rv(List<Integer> list){
		double x=0.0;
		double sigma=(ub-lb)/(pow(PRECI)-1);
		x=lb+sigma*toBinary(list);
		return x;
	}
	/**
	 * 某个基因序列是否都一样
	 * @param gene
	 * @return
	 */
	public static boolean isZeroOrOne(List<Integer>gene) {
		int t=gene.get(0);
		for(int i=1;i<gene.size();i++) {
			if (gene.get(i)!=t) {
				return false;
			}
		}
		return true;
	}
	public static int change(int a) {
		if (a==1) {
			return 0;
		}
		else return 1;
	}
	/**
	 * 初始化,计算对应的十进制,计算适应度
	 * @param NIND
	 * @param PRECI
	 * @param Chrom
	 * @return
	 */
	public static List<Chromosome> crtbp(int NIND,int PRECI,List<Chromosome> Chrom){
		for(int i=0;i<NIND;i++){
			List<Integer> list=new ArrayList<Integer>();
			for(int j=0;j<PRECI;j++){
				int t=(int)(random.nextDouble()+0.5);
				list.add(t);
			}
			double X=bs2rv(list);
			double ObjV=X*Math.sin(10*Math.PI*X)+2.0;
			double FitnV=ObjV;
			Chrom.add(new Chromosome(list,X,ObjV,FitnV));
		}
		return Chrom;
	}
	/**
	 * *赌
	 * @param Chrom
	 * @return
	 */
	public static List<Chromosome> select(List<Chromosome> Chrom){
		int best=0;
		int worst=0;
		for(int i=1;i<NIND;i++) {
			if(Chrom.get(i).FitnV>Chrom.get(best).FitnV) 
				best=i;
		}
		for(int i=1;i<NIND;i++) {
			if(Chrom.get(i).FitnV<Chrom.get(worst).FitnV)
				worst=i;
		}
					bestChromosome=Chrom.get(best);//精英保存
		Chromosome worstChromosome=Chrom.get(worst);
//		Chrom.remove(bestChromosome);
		Chrom.remove(worstChromosome);
		worst=0;
		for(int i=1;i<NIND-1;i++) {
			if(Chrom.get(i).FitnV<Chrom.get(worst).FitnV)
				worst=i;
		}
		worstChromosome=Chrom.get(worst);
		Chrom.remove(worstChromosome);
		
		double sum=0.0;//群体总适应度
		for(int i=0;i<Chrom.size();i++){
			sum+=Chrom.get(i).FitnV;
		}
		double []t=new double[NIND];//被选中的概率
		double []p=new double[NIND];//在*上的范围
		for(int i=0;i<Chrom.size();i++){
			t[i]=Chrom.get(i).FitnV/sum;
		}
		p[0]=t[0];
		for(int i=1;i<Chrom.size();i++){
			p[i]=t[i]+p[i-1];
		}
		
		List<Chromosome> SelCh=new ArrayList<Chromosome>();
		for(int i=0;i<NIND-2;i++) {
			double rand=random.nextDouble();
			if(0<=rand&&rand<=p[0]) SelCh.add(Chrom.get(0));
			else {
				for(int j=1;j<Chrom.size();j++) {
					if(p[j-1]<rand&&rand<=p[j]) {
						SelCh.add(Chrom.get(j));
						break;
					}
				}
			}
		}
		
		for(int i=0;i<SelCh.size();i++) {
			List<Integer> list=SelCh.get(i).getGene();
			double X=bs2rv(list);
			double ObjV=X*Math.sin(10*Math.PI*X)+2.0;
			double FitnV=ObjV;
			SelCh.get(i).setX(X);
			SelCh.get(i).setObjV(ObjV);
			SelCh.get(i).setFitnV(FitnV);
		}
		return SelCh;
	}
	/**
	 * 交叉
	 * @param Chrom
	 * @return
	 */
	public static List<Chromosome> recombin(List<Chromosome> Chrom){
		for(int k=0;k<(NIND-2)/2;k++) {
			if(random.nextDouble()<px) {
				int i1=0;
				int i2=0;
				do {
					i1=random.nextInt(NIND-2-1+1);//第i1个个体
					i2=random.nextInt(NIND-2-1+1);//第i2个个体
				} while (i1==i2);
				
				int pos=random.nextInt(PRECI-1);//最后一个点不能选[0,37)
				int []temp1_left=new int[pos];
				int []temp2_left=new int[pos];
				int []temp1_right=new int[PRECI-pos];
				int []temp2_right=new int[PRECI-pos];
				List<Integer>parent1=Chrom.get(i1).getGene();
				List<Integer>parent2=Chrom.get(i2).getGene();
				for(int i=0;i<pos;i++) temp1_left[i]=parent1.get(i);
				for(int i=0;i<pos;i++) temp2_left[i]=parent2.get(i);
				for(int i=pos;i<PRECI;i++) temp1_right[i-pos]=parent1.get(i);
				for(int i=pos;i<PRECI;i++) temp2_right[i-pos]=parent2.get(i);
				
				List<Integer>son1=new ArrayList<Integer>();
				List<Integer>son2=new ArrayList<Integer>();
				for(int i=0;i<pos;i++) 		son1.add(temp1_left[i]);
				for(int i=0;i<PRECI-pos;i++) 	son1.add(temp2_right[i]);
				for(int i=0;i<pos;i++) 		son2.add(temp2_left[i]);
				for(int i=0;i<PRECI-pos;i++) 	son2.add(temp1_right[i]);
				Chrom.get(i1).setGene(son1);
				Chrom.get(i2).setGene(son2);
			}
		}
		
		for(int i=0;i<Chrom.size();i++) {
			List<Integer> list=Chrom.get(i).getGene();
			double X=bs2rv(list);
			double ObjV=X*Math.sin(10*Math.PI*X)+2.0;
			double FitnV=ObjV;
			Chrom.get(i).setX(X);
			Chrom.get(i).setObjV(ObjV);
			Chrom.get(i).setFitnV(FitnV);
		}
		return  Chrom;
	}
	/**
	 * 变异
	 * @param Chrom
	 * @return
	 */
	public static List<Chromosome> mut(List<Chromosome> Chrom){
		for(int k=0;k<Chrom.size();k++) {
			if (isZeroOrOne(Chrom.get(k).getGene())) {
				int t=random.nextInt(PRECI);
				int changet=change(Chrom.get(k).getGene().get(t));
				Chrom.get(k).getGene().set(t, changet);
			}
			else {
//				for(int i=0;i<PRECI;i++) {
					double rand=random.nextDouble();
					if (rand<pm) {
						int i=random.nextInt(PRECI);
						int changet=change(Chrom.get(k).getGene().get(i));
						Chrom.get(k).getGene().set(i, changet);
					}
//				}
			}
		}
		
		for(int i=0;i<Chrom.size();i++) {
			List<Integer> list=Chrom.get(i).getGene();
			double X=bs2rv(list);
			double ObjV=X*Math.sin(10*Math.PI*X)+2.0;
			double FitnV=ObjV;
			Chrom.get(i).setX(X);
			Chrom.get(i).setObjV(ObjV);
			Chrom.get(i).setFitnV(FitnV);
		}
		return Chrom;
	}
	/**
	 * 重组
	 * @param Chrom
	 * @return
	 */
	public static List<Chromosome> reins(List<Chromosome> Chrom){
		Chrom.add(bestChromosome);
		Chrom.add(bestChromosome);
		return Chrom;
	}
	public static void main(String[] args) {
		List<Chromosome> Chrom=new ArrayList<Chromosome>();
		List<Chromosome> SelCh=new ArrayList<Chromosome>();
		Chrom=crtbp(NIND, PRECI,Chrom);
		
		for(int gen=1;gen<=MAXGEN;gen++) {
			SelCh=select(Chrom);
			
			SelCh=recombin(SelCh);
			
			SelCh=mut(SelCh);
			
			Chrom=reins(SelCh);
			System.out.println("第:"+gen+"代");
			System.out.println("X:"+bestChromosome.X+"\t\t"+"Y:"+bestChromosome.FitnV);
		}
	}

}
/**
 * 染色体
 */
class Chromosome{
	/**
	 * 基因组,其长度为PERCI
	 */
	public List<Integer>Gene=new ArrayList<Integer>();
	/**
	 * 对应的十进制
	 */
	public double X;
	/**
	 * 对应的十进制的函数值
	 */
	public double ObjV;
	/**
	 * 适应度
	 */
	public double FitnV;
	
	
	
	
	public Chromosome(List<Integer> gene, double x, double objV, double fitnV) {
		super();
		Gene = gene;
		X = x;
		ObjV = objV;
		FitnV = fitnV;
	}
	public Chromosome() {
		super();
	}
	public List<Integer> getGene() {
		return Gene;
	}
	public void setGene(List<Integer> gene) {
		Gene = gene;
	}
	public double getX() {
		return X;
	}
	public void setX(double x) {
		X = x;
	}
	public double getObjV() {
		return ObjV;
	}
	public void setObjV(double objV) {
		ObjV = objV;
	}
	public double getFitnV() {
		return FitnV;
	}
	public void setFitnV(double fitnV) {
		FitnV = fitnV;
	}
	
	
}


//List<Integer>list=new ArrayList<Integer>();
//list.add(1);
//list.add(0);
//System.out.println(toBinary(list));


//for(int i=0;i<Chrom.size();i++) {
//	System.out.println("X:"+Chrom.get(i).X+"\t\t"+"Y:"+Chrom.get(i).ObjV);
//}
//System.out.println("best:"+bestChromosome.FitnV+"worst:"+worstChromosome.FitnV);

运行实例 »
点击 "运行实例" 按钮查看在线实例


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议