哪种进化算法可以优化二进制问题?

时间:2011-10-31 10:15:46

标签: c++ windows algorithm genetic-algorithm evolutionary-algorithm

在我们的程序中,我们多年来使用遗传算法来解决n个变量的唯一问题,每个变量都有一组固定的m个值。这通常适用于~1,000个变量和10种可能性。

现在我有一个新任务,每个变量只有两种可能性(开/关),但我可能需要解决具有10,000或更多变量的系统。现有的GA确实有效,但解决方案的改进速度非常慢。

我发现的所有EA都是针对连续或整数/浮点问题而设计的。哪一个最适合二进制问题?

3 个答案:

答案 0 :(得分:4)

嗯,遗传算法的规范形式是最适合二元决策问题的元启发式算法。我将尝试的默认配置是这样的遗传算法,它使用1-精英并配置轮盘赌选择,单点交叉(100%交叉率)和位翻转突变(例如5%突变概率)。我建议你尝试这种组合适度的人口规模(100-200)。如果这不能很好地运作,我建议增加人口规模,同时也将选择方案改为锦标赛选择方案(从二元锦标赛选项开始,如果你需要更多的选择压力,增加锦标赛组的规模)。原因是,在人口规模较大的情况下,适应度比例选择方案可能不会超出必要的选择压力来推动搜索到最佳区域。

作为替代方案,我们开发了GA的高级版本并称之为Offspring Selection Genetic Algorithm。您还可以考虑尝试使用基于轨迹的算法(如禁忌搜索或模拟退火)来解决此问题,该算法仅使用突变通过进行小的更改从一个解决方案移动到另一个解决方案。

我们有一个GUI驱动的软件(HeuristicLab),可以让你在几个问题上试验一些metaheuristics。遗憾的是,你的问题没有被包括在内,但它是GPL许可的,你可以在那里实现你自己的问题(甚至通过GUI,也有一个方法)。

答案 1 :(得分:1)

就像DonAndre所说,规范GA几乎是针对二元问题而设计的。

...然而

没有进化算法本身就是一个神奇的子弹(除非它有数十亿年的运行时间)。最重要的是你的表现形式,以及它与你的变异和交叉算子的相互作用:它们共同定义了基本上是伪装的启发式搜索的“智能”。目标是让每个操作员都有机会生成与父母具有相似适应性的后代,因此如果您具有特定领域的知识,可以比随机翻转位或拼接位串更好,那么请使用此。

轮盘赌和锦标赛的选择和精英主义是好主意(可能保留超过1,这是一种黑色艺术,可以说......)。您也可能受益于自适应变异。老的经验法则是1/5的后代应该比父母更好 - 跟踪这个数量并适当地改变突变率。如果后代出现更糟,那么变异就会减少;如果后代一直更好,那么变异更多。但突变率需要一个惯性组件,所以它不能太快适应,就像任何元参数一样,设置这是一种黑色艺术。祝你好运!

答案 2 :(得分:1)

为什么不尝试线性/整数程序?