Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 活动选择的动态规划解法_Algorithm_Dynamic Programming_Greedy - Fatal编程技术网

Algorithm 活动选择的动态规划解法

Algorithm 活动选择的动态规划解法,algorithm,dynamic-programming,greedy,Algorithm,Dynamic Programming,Greedy,在16.1算法简介的活动选择问题中,该问题的动态规划解如下所示: 如果Si,j为空,则c[i,j]=0 c[i,j]=max{c[i,k]+c[k,j]+1}如果Si,j不是空的 其中,Si,j表示活动ai完成后开始的活动集和活动aj开始前完成的活动集,c[i,j]表示集合Si,j的最优解的大小 然而,我正在考虑另一个更简单的解决方案 c[i] = max { c[i - 1], c[f(i)] + 1 } 其中,fi给出了与ai兼容的活动,该活动具有最长完成时间,并在ai开始之前完成 这样行

在16.1算法简介的活动选择问题中,该问题的动态规划解如下所示:

如果Si,j为空,则c[i,j]=0

c[i,j]=max{c[i,k]+c[k,j]+1}如果Si,j不是空的

其中,Si,j表示活动ai完成后开始的活动集和活动aj开始前完成的活动集,c[i,j]表示集合Si,j的最优解的大小

然而,我正在考虑另一个更简单的解决方案

c[i] = max { c[i - 1], c[f(i)] + 1 }
其中,fi给出了与ai兼容的活动,该活动具有最长完成时间,并在ai开始之前完成


这样行吗?如果是,作者为什么提供这种复杂的解决方案。如果没有,我遗漏了什么?

我认为您遗漏了设计dp解决方案的许多细节

初始值是多少? 基本情况是什么? 如果有几个与ai兼容的活动具有相同的完成时间,会发生什么? 设计dp解决方案时,所需的属性之一是

特定状态的计算顺序,即c[i]是重要的,它只能由其子问题计算。你的解决方案不符合这个要求,因为当你计算c[i]时,你必须先用j=fi计算c[j],让我们假设j>i甚至j=i+1,然后你必须在计算c[j]之前计算c[i]!所以c[i]依赖于c[j],而c[j]依赖于c[i]==>不正确

另一个与这个问题非常相似的例子是

您可能想看看:

编辑: 在看到您编辑问题后,我的回答如下:

假设你可以在合理的时间内预先计算fi,这显然是可以的,你的解决方案是正确的,因为它是贪婪的解决方案,正如其他答案告诉你的那样

从字面上说,它起作用的原因很简单

在第i个活动之前,您可以选择活动i,即c[fi]+1部分,也可以不选择活动i,即c[i-1]部分

你也可以试着构造一个形式证明,贪婪方法的正确性通常可以用矛盾来证明,粗略地说,你可以试着看看,如果你不选择活动i,为什么不可能有一个比c[i-1]更大的集合,类似于你选择活动i的情况

为了回答您关于为什么作者要演示dp解决方案的问题,我认为这与编程环境无关,但我的想法是,用户正在尝试演示两种不同的方法来解决问题,并且在此进一步说明一个想法:给定一个可以通过贪婪方法解决的问题,它也可以通过dp解决,但这是过度杀伤力

然后,作者试图帮助读者认识贪婪和dp之间的区别,因为它们与新手非常相似。这就是为什么作者首先给出DP解来表示痛苦,然后是贪婪解,最后是贪婪与DP的一段

So TL;DR:你的解决方案是正确的,因为它基本上是解决问题的贪婪方法,当然它比书中给出的DP解决方案要容易得多,因为这是本书想要说明的要点。
第382页书中的一句话:……当贪婪的解决方案足够时,可能会临时生成问题的dp解决方案,或者可能会错误地认为贪婪的解决方案足够……当需要dp解决方案时……

我认为您缺少了设计dp解决方案的许多细节

初始值是多少? 基本情况是什么? 如果有几个与ai兼容的活动具有相同的完成时间,会发生什么? 设计dp解决方案时,所需的属性之一是

特定状态的计算顺序,即c[i]是重要的,它只能由其子问题计算。你的解决方案不符合这个要求,因为当你计算c[i]时,你必须先用j=fi计算c[j],让我们假设j>i甚至j=i+1,然后你必须在计算c[j]之前计算c[i]!所以c[i]依赖于c[j],而c[j]依赖于c[i]==>不正确

另一个与这个问题非常相似的例子是

您可能想看看:

编辑: 在看到您编辑问题后,我的回答如下:

假设你可以在合理的时间内预先计算fi,这显然是可以的,你的解决方案是正确的,因为它是贪婪的解决方案,正如其他答案告诉你的那样

从字面上说,它起作用的原因很简单

在第i个活动之前,您可以选择活动i,即c[fi]+1部分,也可以不选择活动i,即c[i-1]部分

你也可以试着构造一个形式证明,贪婪方法的正确性通常可以用矛盾来证明,粗略地说,你可以试着看看,如果你不选择活动i,为什么不可能有一个比c[i-1]更大的集合,类似于你选择活动i的情况

为了回答您关于作者为什么要演示dp解决方案的问题,我认为它超出了progra的范围 mming上下文,但我的想法是,用户试图演示解决问题的两种不同方法,并且在此进一步说明一个想法:给定一个可以通过贪婪方法解决的问题,它也可以通过dp解决,但它是过度杀伤力

然后,作者试图帮助读者认识贪婪和dp之间的区别,因为它们与新手非常相似。这就是为什么作者首先给出DP解来表示痛苦,然后是贪婪解,最后是贪婪与DP的一段

So TL;DR:你的解决方案是正确的,因为它基本上是解决问题的贪婪方法,当然它比书中给出的DP解决方案要容易得多,因为这是本书想要说明的要点。 第382页书中的一句话:……当贪婪的解决方案足够时,人们可能会临时生成问题的dp解决方案,或者当需要dp解决方案时,人们可能会错误地认为贪婪的解决方案足够

这样行吗

是的,那也行

为什么作者提供了这个复杂的解决方案

这不是他们提出的解决方案,而是问题分析的一部分。在你引用的方程式后面的下一段中,作者说:

但我们会忽略另一个重要的特征 活动选择问题,我们可以利用很大的优势

贪婪活动选择器的最终解决方案与您的类似,但更简单

据我所知,他们的观点是,DP解决方案几乎可以按照第15.3章中所述的机械方式构建,而不考虑特定问题的具体情况,但提出更好的算法需要对问题进行深入了解,而不仅仅是优化子结构

您的解决方案依赖于定理16.1,但一旦定理被证明,创建另一个DP算法就没有意义了,因为您已经足够了解这个问题,可以创建一个更简单的贪婪算法

这样行吗

是的,那也行

为什么作者提供了这个复杂的解决方案

这不是他们提出的解决方案,而是问题分析的一部分。在你引用的方程式后面的下一段中,作者说:

但我们会忽略另一个重要的特征 活动选择问题,我们可以利用很大的优势

贪婪活动选择器的最终解决方案与您的类似,但更简单

据我所知,他们的观点是,DP解决方案几乎可以按照第15.3章中所述的机械方式构建,而不考虑特定问题的具体情况,但提出更好的算法需要对问题进行深入了解,而不仅仅是优化子结构


您的解决方案依赖于定理16.1,但一旦定理被证明,创建另一个DP算法就没有意义了,因为您已经足够了解这个问题,可以创建一个更简单的贪婪算法。

您的解决方案不是与该章中的贪婪活动选择器算法相同吗?不,我不认为这是贪婪的,因为它没有事先作出决定。你的解决方案和那章中的贪婪活动选择器算法不一样吗?不,我不认为这是贪婪的,因为它没有事先作出决定。是的,这是后一种情况。fi表示ai开始之前完成的所有活动。我在这里引用了这一章,而没有提供太多的细节。实际上,ai应该按照完成时间进行排序。在反例中,它们不按完成时间排序。如果切换a1和a2,该算法实际上可以工作。我想知道的是,我的解决方案要简单得多,而且它的运行时间与贪婪的解决方案相同,似乎作者在这里故意选择了一个更难的DP解决方案。@user571 470您的意思是您的解决方案比您在问题中引用的解决方案更简单,还是比本章中的最终算法更简单?因为我看到您的解决方案和贪婪活动选择器之间的唯一区别是,您存储所有c[I],而贪婪活动选择器只存储添加到结果集中的最后一个活动的索引。我的意思是,它比问题中引用的DP简单。这就是为什么我在问题中根本没有提到贪婪。@user571470这就是我感到困惑的地方。你说作者提供的解决方案太复杂,但你引用的算法不是解决方案。他们的最终解决方案是本章末尾描述的贪婪算法,您没有提到的那个。它本质上是您的算法,但需要进一步优化/简化:不存储所有中间答案,只处理与当前部分解决方案兼容的活动。我更新了答案。@user571470您可能还会问,为什么他们要将过于复杂的DP解决方案与贪婪的解决方案进行比较,而不是将
最佳DP解与最佳贪婪解?这就是你的意思吗?我也编辑了答案来解决这个问题。是的,是后一种情况。fi表示ai开始之前完成的所有活动。我在这里引用了这一章,而没有提供太多的细节。实际上,ai应该按照完成时间进行排序。在反例中,它们不按完成时间排序。如果切换a1和a2,该算法实际上可以工作。我想知道的是,我的解决方案要简单得多,而且它的运行时间与贪婪的解决方案相同,似乎作者在这里故意选择了一个更难的DP解决方案。@user571 470您的意思是您的解决方案比您在问题中引用的解决方案更简单,还是比本章中的最终算法更简单?因为我看到您的解决方案和贪婪活动选择器之间的唯一区别是,您存储所有c[I],而贪婪活动选择器只存储添加到结果集中的最后一个活动的索引。我的意思是,它比问题中引用的DP简单。这就是为什么我在问题中根本没有提到贪婪。@user571470这就是我感到困惑的地方。你说作者提供的解决方案太复杂,但你引用的算法不是解决方案。他们的最终解决方案是本章末尾描述的贪婪算法,您没有提到的那个。它本质上是您的算法,但需要进一步优化/简化:不存储所有中间答案,只处理与当前部分解决方案兼容的活动。我更新了答案。@user571470您可能还会问,为什么他们要将过于复杂的DP解决方案与良好贪婪解决方案进行比较,而不是将最佳DP解决方案与最佳贪婪解决方案进行比较?这就是你的意思吗?我也编辑了答案来解决这个问题。