使用遗传算法解决0-1背包问题是否更好?

时间:2019-04-23 17:14:45

标签: algorithm dynamic-programming computer-science genetic-algorithm knapsack-problem

背包问题是一个组合优化问题,必须在不超过其容量的情况下最大化背包中对象的利益。我们知道,有很多方法可以解决此问题,包括遗传算法,动态编程和贪婪方法。我想知道与动态编程相比,使用遗传算法的优点和缺点是什么?空间复杂度,时间复杂度和最优性?

1 个答案:

答案 0 :(得分:2)

因此,要回答这个问题,重要的是要考虑您认为最重要的内容:速度准确性

遗传算法do not guarantee finding the most optimal solution,但是它们通常运行很快。

对遗传算法的一些快速描述可能会产生:

  • 这是 estimation 函数,不能保证找到全局最优解
  • 它通常运行非常快(在内存使用和复杂性上)
  • 实际的计算很困难,因为遗传算法通常特定于问题并且本质上是混乱的。复杂性的良好基础: O( O(Fitness) * (O(mutation) + O(crossover)))

但是,动态编程 不能保证 找到运行时间更长的最佳解决方案。对动态编程的一些快速描述可能会产生:

  • 这是一个精确的函数-确保在全球范围内最佳解决方案上收敛
  • 高内存使用率和很长的运行时间
  • 背包01问题的复杂度类似:O(numItems * knapsackCapacity),而存储器复杂度则类似O(knapsackCapacity)(为此而获得this post的积分)

如果您要问什么是首选,那是特定于学科的。如果您想快速做出足够好的猜测,那么GA可能是您的最佳选择。但是,如果您需要一个有保证且可验证的解决方案,那么DP是可行的方法。

这应该满足基本的比较。