就用途而言,动态编程和贪婪方法之间的主要区别是什么?
据我了解, 贪婪 方法有时会提供最佳解决方案。在其他情况下, 动态编程 方法可提供最佳解决方案。
为了使用一种方法(或另一种方法)以获得最佳解决方案,是否必须满足任何特定条件?
基于Wikipedia的文章。
贪婪算法是遵循在每个阶段做出局部最优选择以寻求全局最优的启发式问题解决算法。在许多问题中,贪婪策略通常不会产生最优解,但是贪婪启发式方法可能会产生局部最优解,该局部最优解在合理的时间内近似于全局最优解。
我们可以选择目前最合适的选择,然后解决以后出现的子问题。 贪婪算法 *做出的选择 _可能取决于到目前为止所做的选择 _ *,而不取决于将来的选择或子问题的所有解决方案 。反复进行一个贪婪的选择,将每个给定的问题简化为一个较小的问题。
动态编程的思想非常简单。通常,要解决给定的问题,我们需要解决问题的不同部分(子问题), _ 然后组合子问题的解决方案以获得整体解决方案 。通常,使用更幼稚的方法时,许多子问题会生成并解决很多次。动态编程方法 _试图只解决每个子问题 一次 ,从而减少了计算量:一旦计算出给定子问题的解,就将其存储或“记忆化”:下次需要相同的解时,它将只是抬头。当重复子问题的数量根据输入的大小呈指数增长时,此方法特别有用。
我们可以选择目前最合适的选择,然后解决以后出现的子问题。贪心算法做出的选择可能取决于到目前为止所做的选择,而不取决于将来的选择或子问题的所有解决方案。反复进行一个贪婪的选择,将每个给定的问题简化为一个较小的问题。换句话说,贪婪算法永远不会重新考虑其选择。
这是与动态编程的主要区别,后者是详尽无遗的,可以保证找到解决方案。在每个阶段之后,动态编程都会根据前一阶段中的所有决策来做出决策,并且可能会重新考虑前一阶段的算法路径。
例如,假设您必须在高峰时段在给定的城市中尽快从A点到达B点。动态规划算法将调查整个交通报告,调查您可能会走的所有可能的道路组合,然后才告诉您哪种方法最快。当然,您可能需要等一会儿,直到算法完成,然后才能开始驾驶。您将采用的路径将是最快的路径(假设外部环境没有任何变化)。
另一方面,贪婪算法将使您立即开始驾驶,并会选择在每个路口看起来最快的道路。可以想象,这种策略可能不会导致最快的到达时间,因为您可能会走一些“轻松”的街道,然后发现自己无可救药地陷入了交通拥堵的境地。
在数学优化中, 贪心算法 可解决具有拟阵特性的组合问题。
动态规划 适用于 具有重叠子问题和最优子结构性质的问题 。