遗传算法

最近在研究一些算法,前几天看了一下遗传算法。

什么是遗传算法,简单地说是解决某一问题时,利用生物学中遗传的一些策略,现在可以说一下算法的步骤。

首先是初始化,确定遗传种群数量,染色体的基因数量,最大迭代次数,交叉概率,变异概率

第二步,复制/选择(选出父代)根据交叉概率随机的选出能够进行交叉的种群中的染色体,

第三步,在选出的种群的染色体中随机挑出2个进行交叉组合(即一个染色体的一部分基因和另一个染色体的另外一部分基因相结合生成子代)

第四步,生成的自带根据变异概率选出变异的基因数量,然后随机选出要变异的基因。

依次迭代以达到解决问题的目的


根据以上算法,上代码


[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com;  
  2.   
  3. public class Test {  
  4.     private int popSize = 4// 种群数量  
  5.     private int maxgens = 20// 迭代次数  
  6.     private double pxover = 1.0// 交叉概率  
  7.     private double pmultation = 0.01// 变异概率  
  8.     long max = 0;  
  9.     private class genotype {  
  10.         int num[] = new int[5]; // 单个基因的序列  
  11.         long fitness; // 该基因的适应度  
  12.         double selectP; // 选择概率  
  13.     }  
  14.       
  15.     private genotype[] gens = new genotype[popSize];  
  16.     /** 
  17.      * 构造函数,初始化种群 
  18.      */  
  19.     public Test() {  
  20.         for (int i = 0; i < popSize; i++) {  
  21.             gens[i] = new genotype();  
  22.             int[] num = new int[5];  
  23.             for (int j = 0; j < 5; j++) {  
  24.                 int rd = Math.random()>0.5?1:0;  
  25.                 num[j] = rd;  
  26.             }  
  27.             gens[i].num = num;  
  28.             gens[i].fitness = 0;  
  29.             gens[i].selectP = 0;  
  30.         }  
  31.     }  
  32.       
  33.     public void run() {  
  34.         int num = 1;  
  35.         while(maxgens > 0) {  
  36.             System.out.println("----第 " + (num++) + " 代----");  
  37.             calAll();  
  38.             print();  
  39.             pad();  
  40.             crossover();  
  41.             mutate();  
  42.             maxgens--;  
  43.         }  
  44.     }  
  45.       
  46.     private void calAll() {  
  47.         calFitness();  
  48.         calSelectP();  
  49.     }  
  50.   
  51.     private void calFitness() {  
  52.         for(int i=0; i<popSize; i++) {  
  53.             long fitness = 0;  
  54.             for(int j=0; j<gens[i].num.length; j++) {  
  55.                 fitness = fitness*2 + gens[i].num[j];  
  56.             }  
  57.             fitness = (long) Math.pow(fitness, 2);  
  58.             gens[i].fitness = fitness;  
  59.             if(max < fitness) max = fitness;  
  60.         }  
  61.     }  
  62.   
  63.     private void calSelectP() {  
  64.         long sum = 0;  
  65.         for (int i=0; i<popSize; i++)  
  66.             sum += gens[i].fitness;  
  67.         for (int i=0; i<popSize; i++)  
  68.             gens[i].selectP = (double) gens[i].fitness/sum;  
  69.     }  
  70.       
  71.     private void print() {  
  72.         for(int i=0; i<popSize; i++) {  
  73.             for(int j=0; j<5; j++) System.out.print(gens[i].num[j]);  
  74.             System.out.print("(" + gens[i].fitness + ") ");  
  75.         }  
  76.         System.out.println();  
  77.         System.out.println("最大值是:" + max);  
  78.     }  
  79.       
  80.     private void pad() {  
  81.         genotype[] genos = new genotype[popSize];  
  82.         for(int i=0; i<popSize; i++) {  
  83.             int k = selectN();  
  84.             genos[i] = gens[k];  
  85.         }  
  86.         gens = genos;  
  87.     }  
  88.       
  89.     private int selectN() {  
  90.         double rd = Math.random();  
  91.         double[] isSelP = new double[popSize];  
  92.         double r = 0.0;  
  93.         for(int i=0; i<popSize; i++) {  
  94.             r += gens[i].selectP;  
  95.             isSelP[i] = r;  
  96.         }  
  97.         for(int i=0; i<popSize; i++) {  
  98.             if(rd<isSelP[i]) return i;  
  99.         }  
  100.         return 0;  
  101.     }  
  102.       
  103.     private void crossover() {  
  104.         int pop = (int) (popSize * pxover / 2);  
  105.         while (pop > 0) {  
  106.             int x = (int) (Math.random() * popSize);  
  107.             int y = (int) (Math.random() * popSize);  
  108.             executeCrossover(x, y);  
  109.             pop --;  
  110.         }  
  111.     }  
  112.       
  113.     private void executeCrossover(int x, int y) {  
  114.         genotype[] genos = new genotype[popSize];  
  115.         for(int i=0; i<popSize; i++) {  
  116.             int k = selectN();  
  117.             genos[i] = gens[k];  
  118.         }  
  119.         gens = genos;  
  120.         int m = (int) (Math.random() * 5);  
  121.         int n = (int) (Math.random() * 5);  
  122.         int start = m<=n?m:n;  
  123.         int end = m>=n?m:n;  
  124.         for(int i=start; i<=end; i++) {  
  125.             gens[x].num[i] = gens[y].num[i];  
  126.         }  
  127.     }  
  128.       
  129.     private void mutate() {  
  130.         int pop = (int) (popSize * pmultation);  
  131.         while (pop > 0) {  
  132.             int x = (int) (Math.random() * popSize);  
  133.             executeMutate(x);  
  134.             pop --;  
  135.         }  
  136.     }  
  137.   
  138.     private void executeMutate(int x) {  
  139.         int i = (int) (Math.random() * 5);  
  140.         if(gens[x].num[i] == 0) {  
  141.             gens[x].num[i] = 1;  
  142.         } else {  
  143.             gens[x].num[i] = 0;  
  144.         }  
  145.     }  
  146.   
  147.     public static void main(String[] args) {  
  148.         Test test = new Test();  
  149.         test.run();  
  150.     }  
  151. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值