标准遗传算法(2008-08-1016:03:11)标签:染色体遗传算法bestifprivate杂谈1、利用标准遗传算法求解函数f(x)=(x-5)*(x-5)的最小值,其中x属于区间[-255,255],算法的参数自己设定。要求:1)给出求解本问题的标准遗传算法源代码(要有注释)序界面:算法的流程图:开始初始化染色体计算适度值选择操作交叉操作变异操作适合度最优染色体条件终止结束源程序:importjava.awt.BorderLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;classBest{publicintgenerations;//最佳适应值代号publicStringstr;//最佳染色体publicdoublefitness;//最佳适应值}publicclassSGAFrameextendsJFrame{privateJTextAreatextArea;privateStringstr=;privateBestbest=null;//最佳染色体privateString[]ipop=newString[10];//染色体privateintgernation=0;//染色体代号publicstaticfinalintGENE=22;//基因数publicstaticvoidmain(Stringargs[]){try{SGAFrameframe=newSGAFrame();frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}publicSGAFrame(){//SGAFrame类的构造函数super();this.ipop=inialPops();getContentPane().setLayout(null);setBounds(100,100,461,277);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);finalJLabellabel=newJLabel();label.setText(X的区间:);label.setBounds(23,10,88,15);getContentPane().add(label);finalJLabellabel_1=newJLabel();label_1.setText([-255,255]);label_1.setBounds(92,10,84,15);getContentPane().add(label_1);finalJButtonbutton=newJButton();button.addActionListener(newActionListener(){publicvoidactionPerformed(finalActionEvente){SGAFrames=newSGAFrame();str=str+s.process()+\n;textArea.setText(str);}});button.setText(求最小值);button.setBounds(323,27,99,23);getContentPane().add(button);finalJLabellabel_2=newJLabel();label_2.setText(利用标准遗传算法求解函数f(x)=(x-5)*(x-5)的最小值:);label_2.setBounds(23,31,318,15);getContentPane().add(label_2);finalJPanelpanel=newJPanel();panel.setLayout(newBorderLayout());panel.setBounds(23,65,399,164);getContentPane().add(panel);finalJScrollPanescrollPane=newJScrollPane();panel.add(scrollPane,BorderLayout.CENTER);textArea=newJTextArea();scrollPane.setViewportView(textArea);//}privateStringinialPop(){Stringres=;for(inti=0;iGENE;i++){if(Math.random()0.5){res+=0;}else{res+=1;}}returnres;}privateString[]inialPops(){String[]ipop=newString[10];for(inti=0;i10;i++){ipop[i]=inialPop();}returnipop;}privatedoublecalculatefitnessvalue(Stringstr){intb=Integer.parseInt(str,2);//Stringstr1=+/n;doublex=-255+b*(255-(-255))/(Math.pow(2,GENE)-1);//System.out.println(X=+x);doublefitness=-(x-5)*(x-5);//System.out.println(f(x)=+fitness);//str1=str1+X=+x+/n//+f(x)=+fitness+/n;//textArea.setText(str1);returnfitness;}privatevoidselect(){doubleevals[]=newdouble[10];//所有染色体适应值doublep[]=newdouble[10];//各染色体选择概率doubleq[]=newdouble[10];//累计概率doubleF=0;//累计适应值总和for(inti=0;i10;i++){evals[i]=calculatefitnessvalue(ipop[i]);if(best==null){best=newBest();best.fitness=evals[i];best.generations=0;best.str=ipop[i];}else{if(evals[i]best.fitness)//最好的记录下来{best.fitness=evals[i];best.generations=gernation;best.str=ipop[i];}}F=F+evals[i];//所有染色体适应值总和}for(inti=0;i10;i++){p[i]=evals[i]/F;if(i==0)q[i]=p[i];else{q[i]=q[i-1]+p[i];}}for(inti=0;i10;i++){doubler=Math.random();if(r=q[0]){ipop[i]=ipop[0];}else{for(intj=1;j10;j++){if(rq[j]){ipop[i]=ipop[j];break;}}}}}privatevoidcross(){Stringtemp1,temp2;for(inti=0;i10;i++){if(Math.random()0.25){doubler=Math.random();intpos=(int)(Math.round(r*1000))%GENE;if(pos==0){pos=1;}temp1=ipop[i].substring(0,pos)+ipop[(i+1)%10].substring(pos);temp2=ipop[(i+1)%10].substring(0,pos)+ipop[i].substring(pos);ipop[i]=temp1;ipop[(i+1)/10]=temp2;}}}privatevoidmutation(){for(inti=0;i4;i++){intnum=(int)(Math.random()*GENE*10+1);intchromosomeNum=(int)(num/GENE)+1;//染色体号intmutationNum=num-(chromosomeNum-1)*GENE;//基因号if(mutationNum==0)mutationNum=1;chromosomeNum=chromosomeNum-1;if(chromosomeNum=10)chromosomeNum=9;//System.out.println(变异前+ipop[chromosomeNum]);Stringtemp;if(ipop[chromosomeNum].charAt(mutationNum-1)=='0'){if(mutationNum==1){temp=1+ipop[chromosomeNum].substring(mutationNum);}else{if(mutationNum!=GENE){temp=ipop[chromosomeNum].substring(0,mutationNum-1)+1+ipop[chromosomeNum].substring(mutationNum);}else{temp=ipop[chromosomeNum].substring(0,mutationNum-1)+1;}}}else{if(mutationNum==1){temp=0+ipop[chromosomeNum].substring(mutationNum);}else{if(mutationNum!=GENE){temp=ipop[chromosomeNum].substring(0,mutationNum-1)+0+ipop[chromosomeNum].substring(mutationNum);}else{temp=ipop[chromosomeNum].substring(0,mutationNum-1)+1;}}}ipop[chromosomeNum]=temp;//System.out.println(变异后+ipop[chromosomeNum]);}}publicStringprocess(){Stringstr=;for(inti=0;i10000;i++){this.select();this.cross();this.mutation();gernation=i;}str=最小值+best.fitness+,第+best.generations+个染色体;returnstr;}}2)多次运行程序,观察运行结果,给出你对标准遗传算法优缺点的判断(可以从是否收敛、收敛速度,参数设置等方面考虑)。答:运行程序的结果:求四次最小值的结果:本算法优缺点的判断:1.优点:l本算法是基于面向对象语言Java开发,而遗传算法本身的思想也是存在继承等面向对象概念;l算法执行速度快。2.缺点:l参数设置方面的缺点(循环次数)本算法循环10000次,求解f(x)的最小值,理论上,循环的次数越大,其最小结果会越接近于0。标准遗传算法优缺点的判断:标准遗传算法的优点:(1).将搜索过程作用在编码后的字符串上,不直接作用在优化问题的具体变量上,在搜索中用到的是随机的变换规则,而不是确定的规则。它在搜索时采用启发式的搜索,而不是盲目的穷举,因而具有更高所搜索效率。(2).现行的大多数优化算法都是基于线性、凸性、可微性等要求,而遗传算法只需要适合