• 大小: 19KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: Java
  • 标签:

资源简介

附件中是遗传算法的Java版本的代码实现,可以正常运行;下载者可以根据自己的应用场景来修改。

资源截图

代码片段和文件信息

package com.bjfu.ga;

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

public class Chromosome {
private boolean[] gene; //基因序列
private double score; //基因序列对应的函数得分 

/** 
     * 生成一个新基因 
     */  
    public Chromosome() {  
          
    }  
    
/**
 * 随机生成基因序列
 * @param size
 */
public Chromosome(int size) {
if (size <= 0) {
return ;
}
initGeneSize(size);
for (int i = 0; i < size; i++) {
gene[i] = Math.random() >= 0.5;
}
}

/**
 * 初始化基因长度
 * @param size
 */
public void initGeneSize(int size) {
if (size <= 0) {  
            return;  
        }  
        gene = new boolean[size]; 
}

/**
 * 将基因转化为对应的数字 
 * @return
 */
public int getNum() {
if (gene == null) {
return 0;
}
int num = 0;
for (boolean bool : gene) {
num <<= 1;
if (bool) {
num += 1;
}
}
return num;
}

/**
 * 遗传产生下一代 
 * 把当前群体中适应度较高的个体按某种规则或模型遗传到下一代群体中;一般要求适应度较高的个体将有更多的机会遗传到下一代群体中。
 * @param parent1
 * @param parent2
 * @return
 */
public static List generateNextGeneration(Chromosome parent1 Chromosome parent2) {
//染色体有一个为空,不产生下一代 
if (parent1 == null || parent2 == null) {
return null;
}
//染色体有一个没有基因序列,不产生下一代  
if (parent1.gene == null || parent2.gene == null) {
return null;
}
//染色体基因序列长度不同,不产生下一代 
if (parent1.gene.length != parent2.gene.length) {
return null;
}

Chromosome c1 = clone(parent1);
Chromosome c2 = clone(parent2);

//随机产生交叉互换位置 
int size = c1.gene.length;
int a = (int) ((Math.random() * size) % size);
int b = (int) ((Math.random() * size) % size);
int min = a > b ? b : a;
int max = a > b ? a : b;

//对位置上的基因进行交叉互换  
boolean t;
for (int i = min; i <= max; i++) {
t = c1.gene[i];
c1.gene[i] = c2.gene[i];
c2.gene[i] = t;
}
List list = new ArrayList();
list.add(c1);
list.add(c2);

return list;
}

/**
 * 克隆基因
 * @param chromosome
 * @return
 */
public static Chromosome clone(final Chromosome chromosome) {
if (chromosome == null || chromosome.gene == null) {
return null;
}
Chromosome copy = new Chromosome();
copy.initGeneSize(chromosome.gene.length);
for (int i = 0; i < chromosome.gene.length; i++) {
copy.gene[i] = chromosome.gene[i];
}
return copy;
}

/**
 * 基因num个位置发生变异
 * @param num
 */
public void mutation(int num) {
//允许变异  
int size = gene.length;
for (int i = 0; i < num; i++) {
//寻找变异位置 
int position = (int) ((Math.random() * size) % size);
//变异后的值 
boolean bool = !gene[position];
gene[position] = bool;
}
}

public double getScore() {
return score;
}

public void setScore(double score) {
this.score = score;
}
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-03-08 15:18  GA\
     文件         295  2018-03-08 15:18  GA\.classpath
     文件         361  2018-03-08 15:18  GA\.project
     目录           0  2018-03-08 15:18  GA\.settings\
     文件         587  2018-03-08 15:18  GA\.settings\org.eclipse.jdt.core.prefs
     目录           0  2018-03-08 15:18  GA\bin\
     目录           0  2018-03-08 15:18  GA\bin\com\
     目录           0  2018-03-08 15:18  GA\bin\com\bjfu\
     目录           0  2018-03-08 16:25  GA\bin\com\bjfu\ga\
     文件        2655  2018-03-08 22:15  GA\bin\com\bjfu\ga\Chromosome.class
     文件        5664  2018-03-08 16:33  GA\bin\com\bjfu\ga\DynamicDataWindow.class
     文件        7557  2018-03-09 15:42  GA\bin\com\bjfu\ga\GeneticAlgorithm.class
     文件        1114  2018-03-09 10:58  GA\bin\com\bjfu\ga\GeneticAlgorithmDriver.class
     目录           0  2018-03-08 15:18  GA\src\
     目录           0  2018-03-08 15:18  GA\src\com\
     目录           0  2018-03-08 15:18  GA\src\com\bjfu\
     目录           0  2018-03-08 16:25  GA\src\com\bjfu\ga\
     文件        3127  2018-03-08 22:15  GA\src\com\bjfu\ga\Chromosome.java
     文件        6919  2018-03-08 16:33  GA\src\com\bjfu\ga\DynamicDataWindow.java
     文件        7898  2018-03-09 15:42  GA\src\com\bjfu\ga\GeneticAlgorithm.java
     文件         797  2018-03-09 10:58  GA\src\com\bjfu\ga\GeneticAlgorithmDriver.java

评论

共有 条评论