如何自学遗传算法

2025-07-08 21:39:58

import java.util.ArrayList;

import java.util.Random;

public class GeneticAlgorithm {

private static final int POP_SIZE = 100;

private static final int GENE_LENGTH = 10;

private static final int MAX_GENERATIONS = 1000;

public static void main(String[] args) {

ArrayList population = initializePopulation();

for (int generation = 0; generation < MAX_GENERATIONS; generation++) {

ArrayList newPopulation = new ArrayList<>();

for (int i = 0; i < POP_SIZE; i++) {

Individual parent1 = selectParent(population);

Individual parent2 = selectParent(population);

Individual child = crossover(parent1, parent2);

if (new Random().nextInt(100) < 1) { // 1% mutation rate

mutate(child);

}

newPopulation.add(child);

}

population = newPopulation;

}

Individual bestIndividual = getBestIndividual(population);

System.out.println("Best fitness: " + bestIndividual.getFitness());

}

private static ArrayList initializePopulation() {

ArrayList population = new ArrayList<>();

for (int i = 0; i < POP_SIZE; i++) {

population.add(new Individual());

}

return population;

}

private static Individual selectParent(ArrayList population) {

int totalFitness = population.stream().mapToInt(Individual::getFitness).sum();

int randomValue = new Random().nextInt(totalFitness);

int runningSum = 0;

for (Individual individual : population) {

runningSum += individual.getFitness();

if (runningSum > randomValue) {

return individual;

}

}

return population.get(population.size() - 1);

}

private static Individual crossover(Individual parent1, Individual parent2) {

Individual child = new Individual();

int crossoverPoint = new Random().nextInt(GENE_LENGTH);

for (int i = 0; i < GENE_LENGTH; i++) {

if (i < crossoverPoint) {

child.setGene(i, parent1.getGene(i));

} else {

child.setGene(i, parent2.getGene(i));

}

}

child.calculateFitness();

return child;

}

private static void mutate(Individual individual) {

int mutationPoint = new Random().nextInt(GENE_LENGTH);

individual.setGene(mutationPoint, 1 - individual.getGene(mutationPoint));

individual.calculateFitness();

}

private static Individual getBestIndividual(ArrayList population) {

return population.stream().max((a, b) -> Integer.compare(a.getFitness(), b.getFitness())).orElse(null);

}

}

class Individual {

private static final int GENE_LENGTH = 10;

private int[] genes = new int[GENE_LENGTH];

private int fitness;

public Individual() {

for (int i = 0; i < GENE_LENGTH; i++) {

genes[i] = new Random().nextInt(2);

}

calculateFitness();

}

public int getGene(int index) {

return genes[index];

}

public void setGene(int index, int value) {

genes[index] = value;

}

public int getFitness() {

return fitness;

}

public void calculateFitness() {

fitness = 0;

for (int gene : genes) {

fitness += gene;

}

}

}