|
sunsoncheng 发表于 2011-10-21 16:36
法师:
关于随机算法已懂了一点,
但遗传及变异,什么种子堆,总是不明白
==============================
遗传和变异都是方便理解的说法而已,实际上程序是把一个现成的结果,随机变化其中一部分,产生一个新的结果
这种做法类似DNA的变异
遗传则是选取所有结果的最好的一部分,假定这些好结果都有好的DNA,因此下一代的变化就从这些好结果出发,而不是随机算法的“盲目”出发
起始的种子库里不是有200个?为什么后的参与更新的只用100个?
==========================================
种子库就是每一代选取多少个好结果,保留进入下一代。
100个应该是遗传算法对种子库大小的最低要求,取更大的种子库会更好,但是计算时间也随之增加。
新的种子库里的合力既是以最小为标准,为什么不对进行排序,后面的新种子插入到顺序值?
=====================================
因为我用的是 堆 作为种子库数据结构,所以无须排序,堆结构的特点是,其第一个数组元素永远是所有堆元素里面最小(最大)的一个
所以我先建立种子堆,然后第一个数组元素就是最差的种子,新的结果跟这个最差种子比较即可,不需要插入一个排好序的表
堆的详情你可以搜索 堆排序,或者搜索 优先队列
选用的基因原则是什么?
如果我这样选行吗:
现在有200个种子,里面选1/4就是50个最好的,考查其位置,位置出现最多的N个(但这N个不知如何定呢,为什么这样定呢?)
位置不变,而变其它的位置?
这里的变异好象只是两个位置互换?,为什么只是两个位置互换?
=======================================
选用基因的原则可以很多很灵活,不过此题的最终目的还是要合力最佳的结果,所以我直接用最小的合力来选种子
你的方法也可以。
变异的方法也可以很多,不过考虑到计算速度,我就只用简单的位置互换来产生新的结果
实际上遗传算法每一个要素都会大大影响算法的求解结果
1 种子库大小
2 变异的剧烈程度
3 遗传多少代
而衡量上述三点,要综合考虑速度,优化程度,代码复杂程度,要多次测试才能得到一个较佳的经验值,所以我才说遗传算法本身就是个很麻烦的东东。
|
|