文章目录
遗传算法的优化
1. 遗传算法的优化理念
1.1 遗传算法一般思路
这篇文章是上一篇 遗传算法解决多维背包问题 文章的后续,或者说升华。多维背包的问题规模如下:
// 多维背包问题,将其用列表形式表示即为:
Value=[100, 220, 90, 400, 300, 400, 205, 120, 160, 580, 400, 140, 100, 1300, 650];
Attribute=[ 8 24 13 80 70 80 45 15 28 90 130 32 20 120 40
8 44 13 100 100 90 75 25 28 120 130 32 40 160 40
3 6 4 20 20 30 8 3 12 14 40 6 3 20 5
5 9 6 40 30 40 16 5 18 24 60 16 11 30 25
5 11 7 50 40 40 19 7 18 29 70 21 17 30 25
5 11 7 55 40 40 21 9 18 29 70 21 17 30 25
0 0 1 10 4 10 0 6 0 6 32 3 0 70 10
3 4 5 20 14 20 6 12 10 18 42 9 12 100 20
3 6 9 30 29 20 12 12 10 30 42 18 18 110 20
3 8 9 35 29 20 16 15 10 30 42 20 18 120 20 ];
Limit=[ 550; 700; 130; 240; 280; 310; 110; 205; 260; 275 ];
/*
对于任意解 X(诸如此类[0,1,0], 采用二进制编码)
使满足 X.*Attribute < Limit, 值得注意 X.*Attribute代表的是两个向量的点乘
求 TotalValue=X.*Value 的最大值
*/
1.2 遗传算法的槽点
经过作者不计其数的测试,一般的遗传算法甚至是那些优化版的遗传算法,例如 自适应概率,父子代竞争,保留父代最优等等策略
,都不会明显的使得种群的下一代比上一代更优秀,简而言之所谓的进化只是理想。但是这个理想在我看来几乎不会实现。可能有些人也对遗传算法做了一定的优化,甚至有使用到我上述提到的方法或者策略,别急往下看~
遗传算法的初衷就是模仿生物界 “物竞天择,适者生存” 的法则,模拟交叉变异并选择等操作来企图达到进化的目的。但是值得一提的是,相比生物界进化的过程,遗传算法最欠缺的就是选择过程没有对交叉变异起到诱导作用,交叉还是随机交叉,变异还是随机变异,选择的概念名存实亡
,它没有起到它应有的作用,也就是诱导个体朝着更加优秀的方向去进化。如果你不信,可以将你们每一代的每一个染色体基因及其目标函数值打印出来,做个对比,你一定会有所发现的~
其实说实话,遗传算法就是一个全局搜索过程
,他获取到的最优值是所有搜索过程中的最优值而不是最后一代种群中的最优值。所以说获取到最优值的概率完全是随机的,在所有种群迭代过程中你搜索到的样本越多,越有机会获得最优解,所以 理论上来说只要迭代次数无穷大,就一定会找到最优解
。也很容易的看到如果不对遗传算法做出根本性的变革,那些细枝末节的修补是根本不可能突破遗传算法的瓶颈的。
1.3 遗传算法的深度优化
遗传算法说白了就是这样,没有任何的高明之处,可能正在看的一些读者对遗传算法有较深的了解,知道各种交叉变异以及选择策略,例如PMX,OX,轮盘赌,锦标赛等等,但是在我看来这些策略可能是在一定程度地提高种群的多样性,我试过了其中大部分优化方法,效果一般还徒增运行时长。
说了这么多,是时候提出作者优化的思路了。优秀的人都是相似的
,这句话可能有些绝对,但是也不为过,正好可以用到遗传算法中。在我们的算法中加入了一点学习的概念,具体的操作就是先用遗传算法来迭代若干代,在全局内搜索到若干个 (这里取10个)较优解,优秀的解是有很大一部分共性的基因。
优化前的结果图:
这是10个种群分别迭代200代的最优结果,从这个矩阵不难看出有很多基因位置都是相同的,我们将将这些完全相同的位置基因变异概率设置为0.001,不完全相同的位置设置为0.6(这个参数不固定),将这10个基因重新作为种群初始解,以全新的变异概率来进行迭代,迭代次数可以设置为100左右(不固定)。如果愿意,完全可以将这个过程重复多次来获取到最优值。然后我们运行一次的时间消耗大概在900ms左右,找到最优值的概率为90以上。这有点局部搜索的意思,但是恕我直言,如果大概率变异的基因位小到一定的范围内,例如六七位,这时候用局部搜索效率会奇高。
优化后的结果图:
当然这个算法有一个缺点,就是可能永远找不到最优值,且最后获取到的10个解完全是一模一样的局优值。这样的结果并不奇怪,因为如果你的初始10个种群迭代过后获取到的10个最优染色体的某一位基因刚好全部避开最优染色体的该位基因,那找到最优值的概率就会很小,那我找到的是什么呢?科学来说,找到的是当前这几位基因确定情况下的最优值,也就是局优。
那有没有办法避免呢?其实是有的,我只需要让初始10个种群的最优值基因多样性尽可能大,那么找到最优值的概率就会加大。可以适当增加初始种群的迭代次数来解决。
不需要灰心。为什么呢?经过作者测试,来源于OR-Library的测试数据集,在50x5,28x10等维度的多维背包问题下,求解是毫无压力,800ms可以找到最优解,并且概率相当可观。如果有维度更大,求解难度更大的问题,当前算法可能会有更好的突破。
当然读者也可以根据本篇文章的思路,设计出更好的寻优算法。
2. 源代码下载地址
2.1 源码链接
下载分值是官方动态调整的,如果需要,可以私信我拿代码