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
for (int generation = 0; generation < MAX_GENERATIONS; generation++) {
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
ArrayList
for (int i = 0; i < POP_SIZE; i++) {
population.add(new Individual());
}
return population;
}
private static Individual selectParent(ArrayList
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
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;
}
}
}
最新发布