算法(二)之遗传算法(SGA)
View Code
遗传算法(Genetic Algorithm)又叫基因进化算法或进化算法,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,属于启发式搜索算法一种。
下面通过下面例子的求解,来逐步认识遗传算法的操作过程。我参考了博客(http://blog.csdn.net/b2b160/article/details/4680853/),这个博客没提供代码,为了新手更好的学习,我用java实现了程序
例:求下述二元函数的最大值:
(1) 个体编码
遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种
符号串。本题中,用无符号二进制整数来表示。
因 x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。
例如,基因型 X=101110 所对应的表现型是:x=[ 5,6 ]。
个体的表现型x和基因型X之间可通过编码和解码程序相互转换。
1 /** 2 * 3 */ 4 package com.math.algorithm; 5 6 /** 7 * @author summer 8 * 9 */ 10 public class Codec { 11 12 static final int CODEC_LEN = 3; 13 14 public static String encode(int x,int y){ 15 16 return MathUtils.toBinaryString(x,CODEC_LEN)+ 17 MathUtils.toBinaryString(y,CODEC_LEN); 18 } 19 20 public static double[] decode(String s){ 21 22 double[] r = new double[2]; 23 String s1 = s.substring(0, s.length()/2) ; 24 String s2 = s.substring(s1.length()); 25 r[0] = MathUtils.toInt(s1); 26 r[1] = MathUtils.toInt(s2); 27 return r; 28 } 29 30 public static void main(String[] args){ 31 32 System.out.println(encode(5,6)); 33 System.out.println(encode(1,2)); 34 double[] r =decode("101110"); 35 System.out.println("x="+r[0]+" y="+r[1]); 36 r =decode("001010"); 37 System.out.println("x="+r[0]+" y="+r[1]); 38 } 39 40 }
(2) 初始群体的产生
遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始
群体数据。
本例中,群体规模的大小取为4,即群体由4个个体组成,每个个体可通过随机
方法产生。
如:011101,101011,011100,111001
/** * */ package com.math.algorithm; import java.util.List; import java.util.Random; /** * @author summer * */ public class GeneGroupInit { static final int SIZE = 4; static final int MAX_VAL = 8; public static void init(List<String> gene){ gene.clear(); Random r = new Random(); for(int i=0;i<SIZE;i++){ int x = r.nextInt(MAX_VAL); if(x ==0) x = r.nextInt(MAX_VAL); int y = r.nextInt(MAX_VAL);