通过交易最大化利润

时间:2016-03-13 17:00:03

标签: algorithm dynamic-programming maximum-profit-problem

我一直坚持这个问题一段时间试图找出以下问题的重复关系。

问题描述:

假设市场上有以下交易选择:

  • 1金属到2木
  • 1木到0.2玻璃
  • 1玻璃至1.5金属
  • 1木到0.4火
  • 1火到3金属

确定是否可以通过交易在某个项目上获利。

例如,在上述情景中,我们可以通过以下方式在金属上获利:

1金属 - > 2木 - > 0.8火 - > 2.4金属

我坚持的部分是如何分解子问题。这个问题在括号乘法问题中似乎很常见,我们试图通过一系列乘法来最大化最终结果,但有更多限制。

我不想要完整的答案,但是能够推动我走向正确方向的提示将非常感激!

谢谢!

1 个答案:

答案 0 :(得分:1)

提示:您可以通过“玩”权重并将其减少到已知的加权最短路径问题来解决此问题。

剧透:详细解释

这可以通过在图表上找到负的怀疑周期来很好地解决,权重:

w'(u,v)为将u的一个单位转换为v的费用。 定义:

w(u,v) = -log(w'(u,v))

这个想法是路径v1->v2->...->vk的成本

COST = w(v1,v2) + w(v2,v3) + ... + w(vk-1,vk) = 
     = -log(w'(v1,v2)) + -log(w'(v2,v3)) + ... + -log(w'(vk-1,vk)) = 
     = -log (w'(v1,v2)*w'(v2,v3)*...*w'(vk-1,vk))

现在,很容易看到w'(v1,v2)*w'(v2,v3)*...*w'(vk-1,vk)的值恰好是vk的一个单位产生的v1的数量。

同样,对于从某些u到自身u->v1->v2->v3->...vk->v的任何周期,w'(u,v1)*w'(v1,v2),...,w'(vk,u)的值是您可以通过这种方式生成的单位数,如果此值大于1,则此值大于1并且只有-log(w'(u,v1)*w'(v1,v2),...,w'(vk,u) < 0

因此,这个问题可以很容易地简化为一个已知的算法 - Bellman-Ford,它可以很容易地检测出负循环的存在。