算法(二)之遗传算法(SGA)

算法(二)之遗传算法(SGA)

遗传算法(Genetic Algorithm)又叫基因进化算法或进化算法,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,属于启发式搜索算法一种。

下面通过下面例子的求解,来逐步认识遗传算法的操作过程。我参考了博客(http://blog.csdn.net/b2b160/article/details/4680853/),这个博客没提供代码,为了新手更好的学习,我用java实现了程序

例:求下述二元函数的最大值:

 

(1) 个体编码
           遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种
符号串。本题中,用无符号二进制整数来表示。
           因 x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。
           例如,基因型 X101110 所对应的表现型是:x[ 56 ]
 个体的表现型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 }
View Code

(2) 初始群体的产生
          遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始
      群体数据。
         本例中,群体规模的大小取为4,即群体由4个个体组成,每个个体可通过随机
     方法产生。
          如:011101101011011100111001

/**
 * 
 */
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);
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值