不知一般动态规划问题的目标函数总是可以配制成在动态编程的维基,这里的目标函数是物品在每一个阶段的动作和状态的总和?或者说仅仅是一个specical情况下,什么是一般的配方?


编辑:

所谓“动态规划问题”,我的意思是可以通过动态编程技术来解决的问题。这样那样的问题具有优化问题和最佳结构

但在租约我有时不易鉴别这样的问题,也许是因为我还没有习惯了那种语言描述的。当我遇到了Bellman方程wiki页面来了,我也觉得成本函数的数学公式,将有助于莫名其妙。我怀疑的总成本/收益函数总是可以表示为来自所有阶段的成本/收益的积累?和积累可以添加剂或multiplitive或其他什么东西?

当我贴我的问题,我没有意识到这是更恰当讨论一些更注重数学优化地方动态规划。但也有相当多的在Stackoverflow.com计算机算法的讨论。所以,我不觉得不当问我的问题在这里无论是。

有帮助吗?

解决方案

这不是我如何评价一个任意优化问题(或动态编程算法)。特别是,因子β牛逼看起来像一个电气工程黑客,程序员通常不会要的。更巧妙的是,它看起来像它不会永远是显而易见的是什么功能的˚F的是一个给定的问题。

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

这是否是做一个有用的东西,取决于这个问题,我想。

其他提示

在计算机科学动态编程表示任何算法在递归分割成子问题时相同的子问题在这种递归膨胀出现多次方面的建筑物。一个简单的例子书,斐波那契数可以使用动态编程来计算:

从通用复发F(N)= F(N-1)+ F(N-2)你可以实现下面的算法:

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

现在这当然是效率不高的根本,因为它创造了递归调用的数量庞大,e.g。

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

所以在这里,我们已经看到,斐波那契数(5)通过实施计算两次。在动态编程范例是现在为 “memoize的” 或 “高速缓冲存储器” 的结果,如下所示:

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个斐波纳契数(n log n)的时间(假设标准为O(log n))的执行关联的阵列 '存储'。

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

民间,

有一个新的(ISH)的网站,致力于对运筹学问题这里但低量流量有可能不会让你一个很好的答案非常快。

肥皂盒时间:

对于那些谁关心什么是适当的堆栈溢出辩论,让我们注意到,一个算法是无论谁声称它作为自己的领域的一部分。单纯形法,Djikstra的方法,分支定界,拉格朗日松弛,都是算法或解决某类问题的方法。许多这些教导,并在这两个领域采用SO或与CS之间的边界是在这个领域非常模糊。

有关实例(和非常强的实例,它是)在算法的本科当然在MIT包括所有下列的 - 随机性竞争算法,动态规划,贪婪算法,最小生成树,最短路径,Dijkstra算法,贝尔曼 - 福特等议题线性规划,深度优先搜索,拓扑排序,和所有对最短路径。我会推迟到MIT在这种情况下。

我喜欢堆栈溢出,因为很多程序员当他们遇到它认识到一个最优化问题,但他们往往只需要决定如何制定的问题,甚至是什么问题是由名,叫做一点帮助。

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