一般动态规划问题的制定

时间:2010-02-12 22:43:06

标签: algorithm dynamic-programming

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


编辑:

“动态编程问题”是指动态编程技术可以解决的问题。这类问题具有optimal problem and optimal structure的性质。

但对我而言,有时候识别这些问题并不容易,也许是因为我还没有习惯那种口头描述。当我遇到Bellman方程的WIKI页面时,我确实感觉到成本函数的数学公式将有所帮助。我怀疑整体成本/收益函数总是可以表示为所有阶段的成本/收益累积?积累可以是加法或多重或其他什么?

当我发布我的问题时,我确实意识到在一些更倾向于数学优化的地方讨论动态编程更为恰当。但Stackoverflow.com中有很多关于计算机算法的讨论。所以我在这里问我的问题并不合适。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

在计算机科学中动态编程表示在相同的子问题在此递归扩展中出现多次时递归地将其分解为子问题的任何算法的构建。一个简单的书籍例子,Fibonacci数字可以使用动态编程计算:

从通用递归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)] = ... 

所以在这里我们已经看到斐波那契(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)时间(假设标准O(log n))实现中的第n个Fibonacci数array'store'。

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

答案 2 :(得分:1)

伙计,

有一个新的(ish)网站专注于运营研究问题here,但是那里的流量低可能不会很快给你一个好的答案。

肥皂盒时间:

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

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

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

相关问题