我正在尝试在动态编程中获取使用最佳子结构属性的更全面的照片,但我已经盲目地对什么我们必须证明任何最佳解决问题包含在子问题的最佳解决方案中。

一些一些的最佳解决方案有关这个属性,然后用它来争辩说,由于我们的递归算法构建的解决方案至少与最佳解决方案,本身将是最佳的吗?换句话说,我未能发现我们算法的正确性论证的位置,我们需要所有最佳解决方案都包含对子问题的最佳解决方案。

澄清:

最佳子结构的CLRS定义说:“如果任何最佳解决问题,则问题表现出最佳的子结构包含在其上的最佳解决方案中。

为什么不足以说“如果一些最佳的问题,则问题呈现出最佳的子结构,则在问题上包含到子问题的最佳解决方案中”?

有帮助吗?

解决方案

我在我对近似算法的研究中遇到了一点,这涉及发现大约最佳解决方案的动态程序。我认为,思考动态计划正确性的正确方法是从问题到子问题的问题减少(在复杂性理论意义上)。这种减少通常是递归和备忘,但现在是细节。

让一个问题,b是子问题。只有一个子问题,因为我们可以通过广泛的笛卡尔产品将多个独立的子问题组合成一个。还原由两个功能组成:f,从一个实例到B-instance和h,从b-solution到a-solution。我们需要的正确性属性是,对于从每个B形的每个功能g到相应的最佳B溶液(Oracle),组合物H. G 。 F是来自每个A类实例到相应的最佳A解决方案的函数。 (如果h需要访问A-insion,则扩展B,以便其实例包含一个-tument,必须将逐字复制到相应的B-solution中。)

为了使您的观点成为特定的A-实例和最佳A解决方案,不需要存在Oracle G,使得管道H. G 。 F从给定实例生成该解决方案。 (换句话说,H无需设置。)另一方面,H必须能够处理由F构造的B-实例的G.

的所有可能的最佳B溶液。

为了确保H是正确的一种常见策略是从A-solution找到“子结构”功能k到B-solutions的方法,以及“拼接”子结构的方式,即给定A解决方案的证据X和B溶液Y不比k(x)更差,存在a-solution x'不比x差,使得k(x')= y。然后H可以优化在其输入的k下的逆图像中的所有内容上。拼接不必适用于所有解决方案x,只有一个最佳的解决方案。

其他提示

在动态编程中,我们将问题分开到较小的子问题,做一些操作并为更大的答案提供答案 - 非常类似于递归方法(并且无巧合)。

现在,当我们正式证明这种算法的正确性时,这是通过诱导完成的。我们证明我们的“基本条款”是正确的(通常很容易),然后我们假设任何小于当前的问题 - 也是最佳的。然后我们使用这个假设证明了更大的问题的正确性。

如果我们不知道所有解决方案都是最佳的 - 我们将无法证明使用额外的步骤我们能够修改最佳解决方案对更大问题的更大问题 - 更大的问题 - 不会足够的信息来证明这一索赔。

如果我们知道一些子问题是最佳解决方案 - 这是不够的,以确保使用此子问题,我们有最佳解决方案 - 确实是我们需要获得更大问题的最佳解决方案。


例如在背包上看,让我们看看其DP步骤:

f(x,i) = max(f(x-weight[i],i-1) +val[i], f(x,i-1))
.

如果我们只知道其中一个是最佳的 - 我们无法证明算法是正确的,因为我们可能需要“其他”案例,我们没有最佳解决方案。

如果我们在f(x,i-1)中选择了生成的max() - 它可能是错误的选择。通过确保我们对所有子问题有最佳解决方案,我们确保不会发生这种情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top