我将使用遗传方法重写一个算法来改变我的解决方案,我想知道我应该期待什么,并且如果算法的各种运行给出相同的结果,则只考虑我的算法“优化”或“完成”。
例如,如果我运行程序一次并获得了一个好的解决方案“A”,但我第二次运行它并获得了一个好的解决方案“B”,这是设计合理的遗传算法的预期行为吗?还是我应该在每次运行时只获得相同解决方案的微小变化的解决方案?
我将使用遗传方法重写一个算法来改变我的解决方案,我想知道我应该期待什么,并且如果算法的各种运行给出相同的结果,则只考虑我的算法“优化”或“完成”。
例如,如果我运行程序一次并获得了一个好的解决方案“A”,但我第二次运行它并获得了一个好的解决方案“B”,这是设计合理的遗传算法的预期行为吗?还是我应该在每次运行时只获得相同解决方案的微小变化的解决方案?
您的优化问题很可能有多个孤立但全局最优的解决方案。它甚至可能有无数个最优解。如果您从不同的运行中获得不同的最佳解决方案,您真的不应该感到惊讶。如果某些运行的最佳目标值不如其他运行的好,那么这表明您不能相信任何一次运行的结果。
如前所述,您可以有各种全局最优解,因此这种行为是可能的。
但是,您也可能拥有一个成本函数表面,该表面根据您用于搜索空间的所选超立方体有很多变化。如果有很多变化并且您在遗传算法中没有使用足够的每一代点,那么您可能没有对表面进行充分采样以最终到达给定的最佳位置。
因此,虽然这种行为并不少见,但您可能希望尝试每代拥有更多点,看看这是否有助于您最终获得一致的全局优化器。
当我使用这样的方法时,我通常会尝试找到前 N 个最佳位置的列表,然后我“放大”这些位置并执行更多优化程序以更好地找出哪些位置是最佳的。
通常,如果您多次获得解决方案,您不能肯定地说解决方案“足够优化”。原因是遗传算法是不完整的方法,没有系统地考虑整个设计空间。只有掌握了完整的信息,即设计空间已被彻底探索,您才能做出肯定的陈述。这不是遗传算法的设计目的。相反,它们旨在快速引导您找到一个好的解决方案。
如果您多次获得相同质量的解决方案,则需要考虑两种情况:
第一种情况更强大,因为至少它告诉您,您正在使用的特定实现不太可能找到更好的东西。第二种情况只告诉你有很多好的解决方案可以找到。特别是,在第一种情况下运行足够次数后终止进程可能是合理的,但在第二种情况下,您没有迹象表明后续运行可能不会为您提供更好的解决方案(当然假设不知道设计空间)。
正如其他答案中指出的那样,可能有许多全局最优解决方案,而这些就是您找到的解决方案。但是,您无法知道这一点。可能只是这样的情况,即存在许多局部最优解,而您正在寻找这些解,但在您的遗传算法的下一次运行中,您会发现更好的全局最优解。
例如,考虑一个全局最优值只能通过特定基因的突变以非常低的概率找到的情况。它永远不会被组合发现,因为基因很弱,会被任何与它结合的东西所支配。所有没有突变的个体的表现都是一样的。遗传算法会为您提供许多运行质量完全相同的解决方案,并且永远找不到最佳解决方案,即使它可能要好得多。
总之,你得到的行为更多地取决于搜索空间,而不是遗传算法的实现。特别是找到许多好的解决方案不一定是衡量遗传算法实施质量的好方法——它可能会针对不同类型的搜索空间进行优化。
至于终止条件,如果足够数量的单独运行给您完全相同的合理答案,我会考虑终止 - 但不是因为您现在可以合理地确定已经找到接近全局最优值的东西,而是因为它是您的特定遗传算法不太可能改进它之前发现的内容。