Java中的遗传算法分类器:基于规则的系统
我从无到有地编写了一个具有所有特征(锦标赛选择、交叉、变异、精英主义等)的遗传算法,它成功地演化出了“计数一”问题的解决方案——即它操纵由1和0组成的随机生成的二元染色体群,直到达到一个充满1的完美群体 现在我需要应用该算法并创建一个分类器。系统应将二进制数据分为“0”类或“1”类。我有几组训练数据,但以下是最基本的:Java中的遗传算法分类器:基于规则的系统,java,algorithm,class,binary,genetic,Java,Algorithm,Class,Binary,Genetic,我从无到有地编写了一个具有所有特征(锦标赛选择、交叉、变异、精英主义等)的遗传算法,它成功地演化出了“计数一”问题的解决方案——即它操纵由1和0组成的随机生成的二元染色体群,直到达到一个充满1的完美群体 现在我需要应用该算法并创建一个分类器。系统应将二进制数据分为“0”类或“1”类。我有几组训练数据,但以下是最基本的: 32行x 5个变量(+类,空格分隔,CR下线) 00000 0 00001 0 00010 0 00011 1 00100 0 00101 1 00110 1 00111 0 0
32行x 5个变量(+类,空格分隔,CR下线)
00000 0
00001 0
00010 0
00011 1
00100 0
00101 1
00110 1
00111 0
01000 0
01001 1
01010 1
01011 0
01100 1
01101 0
01110 0
01111 1
10000 0
10001 1
10010 1
10011 0
10100 1
10101 0
10110 0
10111 1
11000 1
11001 0
11010 0
11011 1
11100 0
11101 1
11110 1
11111 0
如果x(和y)和z的形式是基于规则的上下文,我将如何应用我已经构建的遗传算法来解决这样一个问题?我不知道从哪里开始,我想我可能必须做一些规则提取,但我不知道如何在这种情况下进行
编辑:进一步代码
public class Controller {
public static void main(String[] args) {
final int P = 50; // population size
final int N = 32; // chromosome length
final double C = 0.95; // crossover rate
final double M = (double) 1 / P; // mutation rate
final int G = 50; // # of generations
GA ga = new GA(P, N, C, M);
// Initialise population of random individuals
Individual[] population = ga.initPop();
// "Counting ones" fitness evaluation
System.out.println("GEN0");
ga.evaluatePop(population);
ga.printFitness(population);
int generation = 1;
for (int i = 0; i < G; i++) {
System.out.println("\nGeneration: " + generation);
// Tournament selection
population = ga.tournament(population);
// Tournament winners fitness evaluation
ga.evaluatePop(population);
// Single-point crossover
population = ga.crossover(population);
// Crossover children fitness evaluation
ga.evaluatePop(population);
// Bit-wise mutation
population = ga.mutate(population);
// Post-mutation population fitness evaluation
ga.evaluatePop(population);
// Elitism replacement (remove the worst gene and replace with a copy of the best)
population = ga.elitism(population);
// Post-elitism population fitness evaluation
ga.evaluatePop(population);
ga.printFitness(population);
generation++;
if (ga.bestFitness(population) == N) {
break;
}
}
}
公共类控制器{
公共静态void main(字符串[]args){
final int P=50;//总体大小
final int N=32;//染色体长度
最终双C=0.95;//交叉率
最终双M=(双)1/P;//突变率
最终整数G=50;/#代
GA=新的GA(P,N,C,M);
//初始化随机个体的种群
个体[]总体=ga.initPop();
//“数一”健身评估
System.out.println(“GEN0”);
ga.evaluatePop(人口);
ga.1(人口);
整数代=1;
对于(int i=0;i
`
公共类GA{
国际人口规模;
染色小体;
双重交叉高估;
双突变率;
随机=新随机();
公共GA(int populationSize,int chromosomeSize,双交叉高估,双突变率){
this.populationSize=populationSize;
this.chromosomeSize=chromosomeSize;
this.crossoversate=crossoversate;
this.mutationRate=mutationRate;
}
公共个人[]initPop(){
个人[]人口=新个人[populationSize];
对于(int i=0;i=parent2.getFitness()){
selectionTemp[i]=parent1;
}否则{
selectionTemp[i]=parent2;
}
}
人口=选择温度;
返回人口;
}
公共个体[]交叉(个体[]群体){
对于(int i=0;ipublic class GA {
int populationSize;
int chromosomeSize;
double crossoverRate;
double mutationRate;
Random random = new Random();
public GA(int populationSize, int chromosomeSize, double crossoverRate, double mutationRate) {
this.populationSize = populationSize;
this.chromosomeSize = chromosomeSize;
this.crossoverRate = crossoverRate;
this.mutationRate = mutationRate;
}
public Individual[] initPop() {
Individual[] population = new Individual[populationSize];
for (int i = 0; i < populationSize; i++) {
population[i] = new Individual(chromosomeSize);
}
return population;
}
public void evaluatePop(Individual[] population) {
for (int i = 0; i < population.length; i++) {
population[i].evaluate();
}
}
public Individual[] tournament(Individual[] population) {
Individual[] selectionTemp = new Individual[populationSize];
for (int i = 0; i < population.length; i++) {
Individual parent1 = population[random.nextInt(population.length)];
Individual parent2 = population[random.nextInt(population.length)];
if (parent1.getFitness() >= parent2.getFitness()) {
selectionTemp[i] = parent1;
} else {
selectionTemp[i] = parent2;
}
}
population = selectionTemp;
return population;
}
public Individual[] crossover(Individual[] population) {
for (int i = 0; i < population.length - 1; i += 2) {
Individual offspring1 = new Individual(population[0].getChromosome().length);
Individual offspring2 = new Individual(population[0].getChromosome().length);
int xpoint = 1 + random.nextInt(chromosomeSize - 1);
if (random.nextDouble() < crossoverRate) {
for (int j = 0; j < xpoint; j++) {
offspring1.setGene(j, population[i].getGene(j));
offspring2.setGene(j, population[i+1].getGene(j));
}
for (int j = xpoint; j < population[0].getChromosome().length; j++) {
offspring1.setGene(j, population[i+1].getGene(j));
offspring2.setGene(j, population[i].getGene(j));
}
}
population[i] = offspring1;
population[i+1] = offspring2;
}
return population;
}
public Individual[] mutate(Individual[] population) {
for (int i = 0; i < population.length; i++) {
for (int j = 0; j < population[i].getChromosome().length; j++) {
if (random.nextDouble() < mutationRate) {
population[i].mutate(j);
}
}
}
return population;
}
public Individual[] elitism(Individual[] population) {
Individual min = population[0];
int minOffset = 0;
for (int i = 0; i < population.length; i++) {
if (population[i].getFitness() <= min.getFitness()) {
min = population[i];
minOffset = i;
}
}
Individual max = population[0];
int maxOffset = 0;
for (int i = 0; i < population.length; i++) {
if (population[i].getFitness() >= max.getFitness()) {
max = population[i];
maxOffset = i;
}
}
population[minOffset] = population[maxOffset];
return population;
}
// <editor-fold defaultstate="collapsed" desc="Debug logic...">
public int totalFitness(Individual[] population) {
int population_fitness = 0;
for (int i = 0; i < population.length; i++) {
population_fitness += population[i].getFitness();
}
return population_fitness;
}
public double avgFitness(Individual[] population) {
return (double) totalFitness(population) / population.length;
}
public int bestFitness(Individual[] population) {
int max = population[0].getFitness();
for (int i = 0; i < population.length; i++) {
if (population[i].getFitness() > max) {
max = population[i].getFitness();
}
}
return max;
}
public Individual bestIndividual(Individual[] population) {
Individual max = population[0];
for (int i = 0; i < population.length; i++) {
if (population[i].getFitness() >= max.getFitness()) {
max = population[i];
}
}
return max;
}
public void printFitness(Individual[] population) {
System.out.println("Total fitness: " + totalFitness(population));
System.out.println("Average fitness: " + avgFitness(population));
//System.out.println("Best fitness: " + bestFitness(population));
System.out.println("Best individual: " + bestIndividual(population));
}
public void printPop(Individual[] population) {
for (int i = 0; i < population.length; i++) {
System.out.println(Arrays.toString(population));
}
}
// </editor-fold>
public class Individual {
public int[] chromosome;
public int fitness = 0;
Random random = new Random();
public Individual(int chromosomeSize) {
this.chromosome = new int[chromosomeSize];
for (int i = 0; i < chromosomeSize; i++) {
this.setGene(i, random.nextInt(2));
}
}
// Initializes individual with a blank chromosome (all genes 0)
public Individual(int chromosomeSize, boolean isBlank) {
this.chromosome = new int[chromosomeSize];
Arrays.fill(chromosome, 0);
}
public void mutate(int offset) {
if (this.getGene(offset) == 1) {
this.setGene(offset, 0);
} else {
this.setGene(offset, 1);
}
}
public void evaluate() {
int count = 0;
for (int offset = 0; offset < this.chromosome.length; offset++) {
if (this.getGene(offset) == 1) {
count++;
}
}
this.setFitness(count);
}
public int getGene(int offset) {
return this.chromosome[offset];
}
public void setGene(int offset, int gene) {
this.chromosome[offset] = gene;
}
public int[] getChromosome() {
return chromosome;
}
public int getFitness() {
return fitness;
}
public void setFitness(int fitness) {
this.fitness = fitness;
}
@Override
public String toString() {
String output = "Binary gene representation: ";
for (int i = 0; i < this.chromosome.length; i++) {
output += this.getGene(i);
}
System.out.println(output);
System.out.println("Fitness: " + this.getFitness());
return output;
}
1: prior State AND B[next]
2: prior State OR B[next]
3: NOT
((!(!(prior State | B[next]))) & (prior State & B[next]))
1. State = 0
2. B[next] = 1, State = ((!(!(0 | 1))) & (0 & 1)) = 0
3. B[next] = 0, State = ((!(!(0 | 0))) & (0 & 0)) = 0
4. B[next] = 0, State = ((!(!(0 | 0))) & (0 & 0)) = 0
5. Return final State value (0 here) from evaluation function.