遗传算法Population

package chapter2;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;

/**
 * A population is an abstraction of a collection of individuals. The population
 * class is generally used to perform group-level operations on its individuals,
 * such as finding the strongest individuals, collecting stats on the population
 * as a whole, and selecting individuals to mutate or crossover.
 *
 * @author bkanber
 *
 */
public class Population {
    private Individual population[];
    private double populationFitness = -1;

    /**
     * Initializes blank population of individuals
     *
     * @param populationSize
     *            The number of individuals in the population
     */
    public Population(int populationSize) {
        // Initial population
        this.population = new Individual[populationSize];
    }

    /**
     * Initializes population of individuals
     *
     * @param populationSize
     *            The number of individuals in the population
     * @param chromosomeLength
     *            The size of each individual‘s chromosome
     */
    public Population(int populationSize, int chromosomeLength) {
        // Initialize the population as an array of individuals
        this.population = new Individual[populationSize];

        // Create each individual in turn
        for (int individualCount = 0; individualCount < populationSize; individualCount++) {
            // Create an individual, initializing its chromosome to the given
            // length
            Individual individual = new Individual(chromosomeLength);
            // Add individual to population
            this.population[individualCount] = individual;
        }
    }

    /**
     * Get individuals from the population
     *
     * @return individuals Individuals in population
     */
    public Individual[] getIndividuals() {
        return this.population;
    }

    /**
     * Find an individual in the population by its fitness
     *
     * This method lets you select an individual in order of its fitness. This
     * can be used to find the single strongest individual (eg, if you‘re
     * testing for a solution), but it can also be used to find weak individuals
     * (if you‘re looking to cull the population) or some of the strongest
     * individuals (if you‘re using "elitism").
     *
     * @param offset
     *            The offset of the individual you want, sorted by fitness. 0 is
     *            the strongest, population.length - 1 is the weakest.
     * @return individual Individual at offset
     */
    public Individual getFittest(int offset) {
        // Order population by fitness
        Arrays.sort(this.population, new Comparator<Individual>() {
            @Override
            public int compare(Individual o1, Individual o2) {
                if (o1.getFitness() > o2.getFitness()) {
                    return -1;
                } else if (o1.getFitness() < o2.getFitness()) {
                    return 1;
                }
                return 0;
            }
        });

        // Return the fittest individual
        return this.population[offset];
    }

    /**
     * Set population‘s group fitness
     *
     * @param fitness
     *            The population‘s total fitness
     */
    public void setPopulationFitness(double fitness) {
        this.populationFitness = fitness;
    }

    /**
     * Get population‘s group fitness
     *
     * @return populationFitness The population‘s total fitness
     */
    public double getPopulationFitness() {
        return this.populationFitness;
    }

    /**
     * Get population‘s size
     *
     * @return size The population‘s size
     */
    public int size() {
        return this.population.length;
    }

    /**
     * Set individual at offset
     *
     * @param individual
     * @param offset
     * @return individual
     */
    public Individual setIndividual(int offset, Individual individual) {
        return population[offset] = individual;
    }

    /**
     * Get individual at offset
     *
     * @param offset
     * @return individual
     */
    public Individual getIndividual(int offset) {
        return population[offset];
    }

    /**
     * Shuffles the population in-place
     *
     * @param void
     * @return void
     */
    public void shuffle() {
        Random rnd = new Random();
        for (int i = population.length - 1; i > 0; i--) {
            int index = rnd.nextInt(i + 1);
            Individual a = population[index];
            population[index] = population[i];
            population[i] = a;
        }
    }
}
时间: 2024-11-13 08:59:04

遗传算法Population的相关文章

遗传算法

遗传算法 ( GA , Genetic Algorithm ) ,也称进化算法 . 遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出的一种启发式搜索算法.因此在介绍遗传算法前有必要简单的介绍生物进化知识. 一.进化论知识  作为遗传算法生物背景的介绍,下面内容了解即可: 种群(Population):生物的进化以群体的形式进行,这样的一个群体称为种群. 个体:组成种群的单个生物. 基因 ( Gene ) :一个遗传因子.  染色体 ( Chromosome ) :包含一组的基因. 生存竞

遗传算法简介

优化算法入门系列文章目录(更新中): 1. 模拟退火算法 2. 遗传算法 遗传算法 ( GA , Genetic Algorithm ) ,也称进化算法 . 遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出的一种启发式搜索算法.因此在介绍遗传算法前有必要简单的介绍生物进化知识. 一.进化论知识  作为遗传算法生物背景的介绍,下面内容了解即可: 种群(Population):生物的进化以群体的形式进行,这样的一个群体称为种群. 个体:组成种群的单个生物. 基因 ( Gene ) :一个遗传

转载:通俗理解遗传算法

一.遗传算法的应用 函数优化(遗传算法的经典应用领域):组合优化(实践证明,遗传算法对于组合优化中的NP完全问题,如0-1背包问题,TSP等,非常有效):自动控制: 机器人智能控制: 组合图像处理和模式识别: 人工生命: 遗传程序设计:     二.遗传学基本概念与术语 基因型(genotype):性状染色体的内部表现: 表现型(phenotype):染色体决定性状的外部表现,或者说,根据基因型形成的个体: 进化(evolution):逐渐适应生存环境,品质不断得到改良.生物的进化是以种群的形式

使用遗传算法实现迷宫游戏(genetic maze)

强烈推荐一本书 <游戏编程中的人工智能技术>(AI.Techniques.for.Game.Programming).(美)Mat.Buckland 一.缘起 在之前的c印记系列当中有有一个迷宫小游戏,算是一个关于数组应用的例子. 其中有通过接收按键(人工操作)的方式来走出迷宫,也有使用递归算法或非递归算法的方式来实现自动(AI操作)走出迷宫. 后来我对近两三年比较火的人工智能,机器学习,深度学习之类的比较感兴趣了.于是乎,我找了很多书籍或网上的文章来看.但基本上都是两个类别的,其中一类就是一

遗传算法,实数编码的交叉操作之SBX(模拟二进制交叉)

本文主要介绍遗传算法(实数编码)的交叉操作中的SBX,模拟二进制交叉. 首先,给出个人用python2.7实现的代码,具体模块已上传到: https://github.com/guojun007/sbx_cross 1 #!/usr/bin/env python 2 #encoding:UTF-8 3 import numpy as np 4 import random 5 6 """ 7 SBX 模拟二进制交叉 8 9 输入: 10 population 种群矩阵 11 a

遗传算法求解TSP问题

遗传算法是一种启发式搜索,属于进化算法的一种.它最初是人们根据自然界对物种的自然选择和遗传规律而设计的.它模拟自然界物种的自然选择.遗传和变异等,对一个种群的基因进行改良. 遗传算法需要设置交叉概率.变异概率和迭代次数等参数,且算法的收敛性受其参数设置影响较大. 遗传算法中把每一个候选解看做是一个个体,个体组成的集合看作是一个种群.遗传算法通过对每个解进行二进制编码把每个解转化为0-1字符串,其中每一个位叫做一个基因.不同基因的组合构成的个体的表现型也不同.它从一个初始种群开始,经过N次迭代最终

CSharp遗传算法求解背包问题

断断续续写了四天,感觉背包问题是最适合了解遗传算法的问题模型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Bag { /// <summary> /// 背包类 /// </summary> public class Bag { public int Size { get; }

多目标遗传算法 ------ NSGA-II (部分源码解析)二元锦标赛选择 tourselect.c

tourselect.c  文件中共有两个函数: selection (population *old_pop, population *new_pop) individual* tournament (individual *ind1, individual *ind2) 首先,第一个函数代码如下: 1 /* Routine for tournament selection, it creates a new_pop from old_pop by performing tournament

遗传算法入门

关于遗传算法 遗传算法的有趣应用很多,诸如寻路问题,8数码问题,囚犯困境,动作控制,找圆心问题(这是一个国外网友的建议:在一个不规则的多边形 中,寻找一个包含在该多边形内的最大圆圈的圆心.),TSP问题(在以后的章节里面将做详细介绍.),生产调度问题,人工生命模拟等.直到最后看到一个非 常有趣的比喻,觉得由此引出的袋鼠跳问题(暂且这么叫它吧),既有趣直观又直达遗传算法的本质,确实非常适合作为初学者入门的例子.  问题的提出与解决方案 让我们先来考虑考虑下面这个问题的解决办法.已知一元函数: 现在