C++ 哪种进化算法用于二进制问题的优化?

C++ 哪种进化算法用于二进制问题的优化?,c++,windows,algorithm,genetic-algorithm,evolutionary-algorithm,C++,Windows,Algorithm,Genetic Algorithm,Evolutionary Algorithm,在我们的程序中,我们多年来一直使用遗传算法来解决n个变量的问题,每个变量都有一组固定的m个可能值。这通常适用于约1000个变量和10种可能性 现在我有一个新任务,其中每个变量只有两种可能性(开/关),但我可能需要解决10000个或更多变量的系统。现有的遗传算法确实有效,但解决方案的改进非常缓慢 我发现的所有EA都是针对连续或整数/浮点问题设计的。哪一种最适合解决二元决策问题?好吧,标准形式的遗传算法是最适合解决二元决策问题的元启发式算法之一。我将尝试的默认配置是使用1-精英主义的遗传算法,并配置

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

现在我有一个新任务,其中每个变量只有两种可能性(开/关),但我可能需要解决10000个或更多变量的系统。现有的遗传算法确实有效,但解决方案的改进非常缓慢


我发现的所有EA都是针对连续或整数/浮点问题设计的。哪一种最适合解决二元决策问题?

好吧,标准形式的遗传算法是最适合解决二元决策问题的元启发式算法之一。我将尝试的默认配置是使用1-精英主义的遗传算法,并配置轮盘赌轮选择、单点交叉(100%交叉率)和位翻转变异(例如5%变异概率)。我建议你在适当的人口规模(100-200)下尝试这种组合。如果效果不好,我建议增加总体规模,但也将选择方案更改为锦标赛选择方案(从二进制锦标赛选择开始,如果需要更多选择压力,则增加锦标赛组规模)。其原因是,在种群规模较大的情况下,适应度比例选择方案可能不会超过必要的选择压力,从而促使搜索向最优区域移动

作为替代方案,我们开发了GA的高级版本,并将其命名为。你也可以考虑用一种基于轨迹的算法来解决这个问题,比如Tabu搜索或模拟退火,它只是使用突变来从一个解决方案移动到另一个解决方案。
我们有一个GUI驱动的软件(),它允许您在几个问题上试验许多元启发式方法。不幸的是,您的问题没有包括在内,但它是GPL许可的,您可以在那里实现自己的问题(甚至通过GUI,也有一个解决方法)。

正如DonAndre所说,canonical GA基本上是为二进制问题设计的

然而

任何进化算法本身都不是一颗灵丹妙药(除非它有数十亿年的运行时间)。最重要的是你的表现,以及它如何与你的变异和交叉算子相互作用:这些共同定义了本质上是伪装的启发式搜索的“智能”。这样做的目的是让每个操作员都有公平的机会生产出适合父母的后代,因此,如果您拥有特定领域的知识,可以比随机翻转位或拼接位串做得更好,那么就使用这个方法


轮盘赌、锦标赛选择和精英主义都是好主意(也许不止一种,这是一种黑人艺术,谁能说…)。你也可以从适应性变异中获益。传统的经验法则是,1/5的后代应该比父母更好——跟踪这个数量,并适当改变突变率。如果后代的情况更糟,那么变异就更少;如果后代总是更好,那么变异就更多。但是突变率需要一个惯性分量,所以它不会适应得太快,而且与任何元参数一样,设置这一点有点像黑魔法。祝你好运

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

你能提供一个更详细的问题描述吗?你可以把它看作是电子电路中的一些“开关”,需要满足一些安全标准。我们定义了电路布局和一些潜在的开关位置。然后,我们希望尽量减少所需的开关数量。1/5成功规则是由Rechenberg为进化策略发明的。通过对某一数学函数的分析计算表明,在整个搜索空间内,改善儿童的期望值约为父母数量的1/5。更现代的自适应变异方案是sigma自适应和协方差矩阵自适应,然而,再次发展了主要用于实值优化的进化策略。对于GAs来说,突变通常被视为一种无偏随机扰动,它将一些多样性转化为一种快速收敛的进化搜索。如果我只有32个开关,那么这就意味着4.294.967.295种可能性。如果我们假设一台机器每秒评估100个组合,则总运行时间将为42.949.672秒,这超过497天的运行时间。如果你想尝试10.000个开关的所有组合,我想为可能的总数写一个整数是很困难的:它的2**10000。整数编程不是蛮力搜索。它考虑到了问题的约束条件,可以快速找到问题所在,并且总是找到全局最小值。不幸的是,并不是所有的问题都能有效地解决,然而,一个惊人的数字却可以。也许值得尝试重新表述你的问题。