在人工智能中,是否有任何简单和/或非常直观的例子来说明如何将基因组实现为模拟?
基本上,我想要的是一个简单的演练(不是一个教程,而是一个总结性的东西),它详细说明了如何实现一个基因组,它在求和中改变了“个体”的特征。
这些基因不是,是这样的:
相反,它们应该是定义上述事物的东西,从模拟的居民的实际特征中提取基因组。
我清楚我想要什么了吗?
无论如何,如果您已经尝试过更好的方法,并且以像这些性游泳者这样的形式实现了进化,那么无论如何,继续发布它吧!越有趣的灵感越好:)
发布于 2011-09-15 16:39:35
如果你自己正在实现你的“个体”,那么任何物体都可以充当你的基因组。
Characteristics
进一步简化这一点的一种方法是将你的特征转化为枚举。通过这种方式,你可以简单地重组父母的基因,从它们中选择特征,并通过随机选择一个特征的枚举值来突变基因。
一旦这起作用,你可以得到更多的价值范围,但使用枚举帮助我保持清楚的事情在一开始。
健身
然后,为了给出这些特性,意味着您需要一个描述性能的适应度函数。特征之间的关系取决于你,所以你可以用任何有意义的方式来描述它。这为比较两个基因组提供了一种一致的方法。
仿真
然后,要运行一个模拟,只需从几个家长开始,并生成一群孩子,以完成彼此。当然,这可以是自动化的,但是这里是一个清晰的例子。
Java示例
import java.util.PriorityQueue;
class Genome implements Comparable<Genome> {
    public enum Mass {
        LIGHT(1),
        AVERAGE(2),
        HEAVY(3);
        final Integer value;
        Mass(Integer value) {
            this.value = value;
        }
    }
    public enum Strength {
        WEAK(1),
        AVERAGE(2),
        STRONG(3);
        final Integer value;
        Strength(Integer value) {
            this.value = value;
        }
    }
    public enum Length {
        SHORT(1),
        AVERAGE(2),
        LONG(3);
        final Integer value;
        Length(Integer value) {
            this.value = value;
        }
    }
    private final Mass mass;
    private final Strength strength;
    private final Length length;
    public Genome(Mass mass, Strength strength, Length length) {
            this.mass = mass;
            this.strength = strength;
            this.length = length;
    }
    private Integer fitness() {
        return strength.value * length.value - mass.value * mass.value;
    }
    @Override public int compareTo(Genome that) {
        // notice the fitter is less in precedence
        if(this.fitness() > that.fitness())
            return -1;
        else if(this.fitness() < that.fitness())
            return 1;
        else // this.fitness() == that.fitness()
            return 0;
    }
    public static Genome recombine(Genome... parents) {
        if(parents.length < 1)
            return null;
        // Select parents randomly and then characteristics from them
        Mass mass = parents[(int)(Math.random() * parents.length)].mass;
        Strength strength = parents[(int)(Math.random() * parents.length)].strength;
        Length length = parents[(int)(Math.random() * parents.length)].length;;
        return new Genome(mass, strength, length);
    }
    public static Genome mutate(Genome parent) {
        // Select characteristics randomly
        Mass mass = Mass.values()[(int)(Math.random() * Mass.values().length)];
        Strength strength = Strength.values()[(int)(Math.random() * Strength.values().length)];
        Length length = Length.values()[(int)(Math.random() * Length.values().length)];
        return new Genome(mass, strength, length);
    }
    public static void main() {
        PriorityQueue<Genome> population = new PriorityQueue<Genome>();
        Genome parent1 = new Genome(Mass.LIGHT, Strength.STRONG, Length.SHORT);
        Genome parent2 = new Genome(Mass.AVERAGE, Strength.AVERAGE, Length.AVERAGE);
        Genome parent3 = new Genome(Mass.HEAVY, Strength.WEAK, Length.LONG);
        population.add(parent1);
        population.add(parent2);
        population.add(parent3);
        Genome child1 = Genome.recombine(parent1, parent2);
        Genome child2 = Genome.recombine(parent1, parent2);
        Genome child3 = Genome.recombine(parent1, parent3);
        Genome child4 = Genome.recombine(parent1, parent3);
        Genome child5 = Genome.recombine(parent2, parent3);
        Genome child6 = Genome.recombine(parent2, parent3);
        Genome child7 = Genome.recombine(parent1, parent2, parent3);
        Genome child8 = Genome.recombine(parent1, parent2, parent3);
        Genome child9 = Genome.recombine(parent1, parent2, parent3);
        child1 = Genome.mutate(child1);
        child2 = Genome.mutate(child2);
        child4 = Genome.mutate(child4);
        child8 = Genome.mutate(child8);
        population.add(child1);
        population.add(child2);
        population.add(child3);
        population.add(child4);
        population.add(child5);
        population.add(child6);
        population.add(child7);
        population.add(child8);
        population.add(child9);
        // and the winner is...
        Genome fittest = population.peek();
    }
}编码
因为这听起来像是您想要将这些特征编码成一个序列,其中有一些在序列中显式的特征,而另一些则是从这些特征派生出来的。
您可以这样做,我将您的值的标尺(如上面的枚举)编码成一个整数,其中的块表示您的显式特征。
例如,如果您有两个显式特征,每个特征有四个可能的值,则可以将集合编码为一个整数,形式为00XX + XX00。例如,0111可能对应于质量为01,长度为11,这是通过改变序列本身中的位来进行变异的。
Java示例
import java.util.PriorityQueue;
class Genome implements Comparable<Genome> {
    private final Integer sequence;
    private static final Integer bitmaskChunk = 3; // ...0011
    private static final Integer shiftMass = 0; // ...00XX
    private static final Integer shiftLength = 2; // ...XX00
    private static final Integer shiftModulus = 4; // ...0000
    private Integer getMass() {
        return (sequence >>> shiftMass) & bitmaskChunk;
    }
    private  Integer getLength() {
        return (sequence >>> shiftLength) & bitmaskChunk;
    }
    public Integer getStrength() {
        return getMass() * getLength();
    }
    public Genome(Integer sequence) {
        this.sequence = sequence % (1 << Genome.shiftModulus);
    }
    private Integer fitness() {
        // Some performance measure
        return getStrength() * getLength() - getMass() * getMass();
    }
    @Override public int compareTo(Genome that) {
        // notice the fitter is less in precedence
        if(this.fitness() > that.fitness())
            return -1;
        else if(this.fitness() < that.fitness())
            return 1;
        else // this.fitness() == that.fitness()
            return 0;
    }
    public static Genome recombine(Genome... parents) {
        if(parents.length < 1)
            return null;
        Integer sequence = 0;
        // Select parents randomly and then characteristics from them
        sequence += parents[(int)(Math.random() * parents.length)].getMass() << Genome.shiftMass;
        sequence += parents[(int)(Math.random() * parents.length)].getLength() << Genome.shiftLength;
        return new Genome(sequence);
    }
    public static Genome mutate(Genome parent) {
        Integer sequence = parent.sequence;
        // Randomly change sequence in some way
        sequence *= (int)(Math.random() * (1 << Genome.shiftModulus));
        return new Genome(sequence);
    }
    public static void main() {
        PriorityQueue<Genome> population = new PriorityQueue<Genome>();
        Genome parent1 = new Genome((int)(Math.random() * (1 << Genome.shiftModulus)));
        Genome parent2 = new Genome((int)(Math.random() * (1 << Genome.shiftModulus)));
        Genome parent3 = new Genome((int)(Math.random() * (1 << Genome.shiftModulus)));
        population.add(parent1);
        population.add(parent2);
        population.add(parent3);
        Genome child1 = Genome.recombine(parent1, parent2);
        Genome child2 = Genome.recombine(parent1, parent2);
        Genome child3 = Genome.recombine(parent1, parent3);
        Genome child4 = Genome.recombine(parent1, parent3);
        Genome child5 = Genome.recombine(parent2, parent3);
        Genome child6 = Genome.recombine(parent2, parent3);
        Genome child7 = Genome.recombine(parent1, parent2, parent3);
        Genome child8 = Genome.recombine(parent1, parent2, parent3);
        Genome child9 = Genome.recombine(parent1, parent2, parent3);
        child1 = Genome.mutate(child1);
        child2 = Genome.mutate(child2);
        child4 = Genome.mutate(child4);
        child8 = Genome.mutate(child8);
        population.add(child1);
        population.add(child2);
        population.add(child3);
        population.add(child4);
        population.add(child5);
        population.add(child6);
        population.add(child7);
        population.add(child8);
        population.add(child9);
        // and the winner is...
        Genome fittest = population.peek();
    }
}我希望这就是你要找的。祝好运。
https://stackoverflow.com/questions/7431770
复制相似问题