遗传算法:创建自己的遗传算法

2022-08-16  本文已影响0人  大龙10

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
第9章目录

9.9 遗传算法:创建自己的遗传算法

第1点:更改变量

float mutationRate = 0.01;
int totalPopulation = 150;
个体数量 突变率 解决问题所需代数 解决问题所需时间(秒)
150 1% 1089 18.8
300 1% 448 8.2
1000 1% 71 1.8
50 000 1% 27 4.3

第2点:适应度函数

1)重点

2)适应度分值

句子B 801个正确字符 适应度 = 80.1%
句子A 800个正确字符 适应度 = 80%
正确字符数 适应度
5 25
6 36

随着正确字符数的增加,适应度分值呈指数性增长。B的适应度分值比A高44%。

3)定制

最后,如果适应度函数不能有效地评估个体的表现,你将无法使系统发生进化。
某个特定程序的适应度函数并不适合用在其他项目上。
因此,你需要发挥自己的才智,重新设计自己的适应度函数。
fitness()函数的功能就是计算适应度分值,你只需修改它的实现就能创建自己的适应度函数。

void fitness() {
    ????????????
    ????????????
    fitness = ??????????
}

第3点:基因型和表现型

class Vehicle {
    float maxspeed;
    float maxforce;
    float size;
    float separationWeight;
    //……
class DNA {
    float[] genes; 浮点数组
    DNA(int num) {
        genes = new float[num];
        for (int i = 0; i < genes.length; i++) {
                genes[i] = float(1); 挑选介于0~1的浮点数
        }
    }
}
class Vehicle {
    DNA dna; 在Vehicle类中添加DNA对象
    float maxspeed;
    float maxforce;
    float size;
    float separationWeight;
    Vehicle() {
        DNA = new DNA(4);
        maxspeed = dna.genes[0]; 用基因设置变量
        maxforce = dna.genes[1];
        size = dna.genes[2];
        separationWeight = dna.genes[3];
        }
}
size = map(dna.genes[2], 0, 1, 10, 72);
class DNA {
    PVector[] genes; 基因型是向量数组
    DNA(int num) {
    genes = new float[num];
    for (int i = 0; i < genes.length; i++) {
        genes[i] = PVector.random2D(); 指向随机方向的向量
        genes[i].mult(random(10)); 将向量设为随机长度
        }
    }
}
class Rocket {
    DNA dna;
    //……
}
上一篇 下一篇

猜你喜欢

热点阅读