【问题标题】:maximize profit through trading通过交易实现利润最大化
【发布时间】:2016-03-13 17:00:02
【问题描述】:

我在这个问题上纠结了一段时间,试图找出以下问题的递归关系。

问题描述:

假设在一个市场中可能存在以下交易选项:

  • 1 金属 2 木材
  • 1 木材到 0.2 玻璃
  • 1 玻璃比 1.5 金属
  • 1 木材到 0.4 火
  • 1 火烧 3 金属

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

例如在上述场景中,我们可以通过以下操作从金属中获利:

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

我被困在的部分是应该如何分解子问题。这个问题似乎对括号乘法问题很熟悉,我们试图通过一系列乘法来最大化最终结果,但有更多限制。

我不想要完整的答案,但可以将我推向正确方向的提示将不胜感激!

谢谢!

【问题讨论】:

  • 提示:这看起来像是一个可以很好地表示为图表的问题。此图中的解决方案是什么样的?你能证明,如果有一个解,那么一定有一个最小这样的解,它有一些特别简单的结构吗?
  • 我会将其视为图形问题。每个项目都是一个节点,每个可能的交易都是一个优势。那么,是什么决定了一个有利可图的交易场景呢?
  • @j_random_hacker 谢谢我试一试,作为一个图形问题看起来简单多了!
  • @VincentvanderWeele 谢谢,我试一试,作为图形问题,它似乎简单得多!
  • 提示:Bellman Ford 找到负循环,如果有的话。

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


【解决方案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) 的值恰好是一个单位的v1 产生的vk 的数量。

类似地,对于从某个u 到其自身的任何循环:u->v1->v2->v3->...vk->vw'(u,v1)*w'(v1,v2),...,w'(vk,u) 的值是您可以通过这种方式生产多少个单位,并且该值大于 1 当且仅当-log(w'(u,v1)*w'(v1,v2),...,w'(vk,u) < 0

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

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2016-02-25
    • 2021-10-11
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多