【问题标题】:formulation of general dynamic programming problem一般动态规划问题的表述
【发布时间】:2010-02-12 22:43:05
【问题描述】:

我想知道一般动态规划问题的目标函数是否总是可以表述为dynamic programming on wiki,其中目标函数是每个阶段的动作和状态项的总和?或者这只是一个特例,一般的表述是什么?


编辑:

“动态规划问题”是指可以通过动态规划技术解决的问题。此类问题具有optimal problem and optimal structure的性质。

但至少对我来说,识别这些问题有时并不容易,也许是因为我还没有习惯那种口头描述。当我遇到贝尔曼方程的 WIKI 页面时,我确实觉得成本函数的数学公式会有所帮助。我怀疑整体成本/收益函数总是可以表示为所有阶段的成本/收益的累积?累积可以是加法或乘法还是其他?

当我发布我的问题时,我确实意识到在更面向数学优化的某个地方讨论动态编程更合适。但是在 Stackoverflow.com 上有很多关于计算机算法的讨论。所以我在这里问我的问题也没有什么不妥。

【问题讨论】:

  • 我不知道你在说什么。事实上,似乎我并不孤单。也许你应该发布一个链接到你在说什么的一些定义?无论如何,这听起来像计算机科学,这是一个编程网站。
  • @Moron:他在问链接中给出的 动态规划 的公式是否是一种特殊情况,或者它是否是所有动态规划解决方案的一般形式。
  • @John:排序算法、贪心算法、动态规划算法都属于计算机科学。我想现在必须关闭任何带有问题标签的算法。
  • @Thomas:与其毫无意义地扯皮,不如推断出明显的意图:“那些可以通过动态规划解决的问题。”
  • @约翰。你只是在提取数字。有多少人可以回答有关 Algol 的问题?还是 Fortran III,或其他一些小众编程语言? OP是从一个角度来看动态编程,并不意味着动态编程与编程无关。事实上,动态编程不仅仅是“数学优化”,还有很多(编程相关),这个问题和答案可能与其他程序员有关。

标签: algorithm dynamic-programming


【解决方案1】:

这不是我描述任意优化问题(或动态规划算法)的方式。特别是,因子 βt 看起来像是程序员通常不想要的电气工程技巧。更微妙的是,对于给定问题,F 函数的作用似乎并不总是很明显。

但是,是的,将 β 设置为 1,任何任意目标函数都可以以这种方式制定。通常,目标函数可以是初始状态和所采取的所有动作的任何函数;给定这样一个函数,很容易定义一个函数 F 来插入该公式。

我想这是否有用取决于问题。

【讨论】:

  • 谢谢,杰森!我只是忽略了 βt,就像您将其设置为 1 一样。我将 F 解释为从一个阶段到下一个阶段的增益/成本。事后看来,我认为整体成本/收益函数总是可以表示为所有阶段的成本/收益的累积?并且积累可以是加法或乘法或其他?
  • 是的,有很多方法可以将目标函数分解为每个阶段的部分。您引用的公式将其分解为附加部分;这具有可以描述每个可能的目标函数的优点。您可以将目标函数分解为每个阶段的因素,但不是每个目标函数:如果任何一步将目标设为 0,而下一步将其设为 1,则 没有可能的值i>F 第二步。
【解决方案2】:

在计算机科学中动态编程表示当相同的子问题在此递归扩展中多次出现时,根据递归地将其拆分为子问题来构建任何算法。一个简单的书本示例,可以使用动态规划计算斐波那契数:

从通用递归 F(n) = F(n-1) + F(n-2) 你可以实现以下算法:

int fibonacci(n):
  if (n < 2): return 1
  else: return fibonacci(n-1) + fibonacci(n-2)

现在这当然根本没有效率,因为它会创建大量的递归调用,例如

F(8) = F(7) + F(6) = [F(6) + F(5)] + [F(5) + F(4)] = ... 

所以在这里我们已经看到 fibonacci(5) 被实现计算了两次。 动态编程范式现在是“记忆”或“缓存”结果,如下所示:

integer_map store;
int memofibo(n):
  if (n < 2) : return 1
  else if (store.find_key(n)): return store.find_value(n)
  else:
    int f = memofibo(n-1) + memofibo(n-2)
    store.set(n, f)
    return f

此实现确保对于 n 的每个参数值最多执行一次递归步骤,因此它在 O(n log n) 时间内计算第 n 个斐波那契数(假设标准 O(log n))实现关联数组“存储”。

所以从计算机科学的角度来看,您提供的链接是同一想法的运筹学/优化问题版本(将问题划分为子问题),但该想法在实践中已抽象为领域中的这种递归+记忆模式一般计算机科学。我希望这有助于清除一些乌云。

【讨论】:

  • 谢谢,安蒂!感谢您对实施细节的回复。是的,我同意这个问题更多的是运筹学和数学背景。
【解决方案3】:

伙计们,

有一个新的(ish)网站专注于运筹学问题here,但那里的低流量可能无法很快为您提供一个好的答案。

皂盒时间:

对于那些关心什么适合堆栈溢出进行辩论的人,让我们注意算法是一种算法,无论谁声称它是他们领域的一部分。单纯形法、吉克斯特拉法、分支定界法、拉格朗日松弛法,都是解决某些类型问题的算法或方法。其中许多都是在这两个领域中教授和应用的,因此 OR 和 CS 之间的边界在该领域非常模糊。

例如(并且是一个非常强大的例子)麻省理工学院的算法本科课程包括以下所有内容 - 随机竞争算法、动态规划、贪心算法、最小生成树、最短路径、Dijkstra 算法、Bellman-Ford 、线性规划、深度优先搜索、拓扑排序和所有对最短路径等主题。在这种情况下,我将遵从麻省理工学院。

我喜欢堆栈溢出,因为许多程序员在遇到优化问题时会识别它,但通常他们只需要一点帮助来决定如何制定问题,甚至问题的名称。

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 2012-04-09
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多