【问题标题】:Minimum cost of travel path using dynamic programming使用动态规划的最小旅行路径成本
【发布时间】:2019-10-16 04:24:54
【问题描述】:

假设我们要从 A 到 B,在旅行过程中,有一些站点 d_1,...,d_n 其中 d_1=A, d_n=B,我们可以选择在每个站点添加燃料成本 C_i,假设如果我们在 d_i 站加气,那么我们可以行驶 a_i 多公里。我想找到一种动态规划算法来找到前往 B 的最低成本(假设存在这样的序列)。

我尝试使用 D[i] 作为从 A 到车站 i 的最低旅行成本,但我无法弄清楚递归关系。我想我可能需要跟踪我们目前可以旅行多长时间。但这太复杂了……

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    正如您所说,您可能需要跟踪我们目前可以旅行多长时间。 您应该使用 D[i][j] 作为从 A 到站 i 并留下 j 公里燃料的最低成本。 在这种情况下,递归关系如下。

    D[i][j] = min( min{ D[i-k][j+(d_i - d_{i-k})] | k<i }, D[i][j-a_i] + C_i );

    第一个词min{ D[i-k][j+(d_i - d_{i-k})] | k<i }表示从i-k站移动到i站,(d-i - d_{i-k})公里油耗。 k 可以取 0 到 i-1 之间的值。

    第二个术语D[i][j-a_i] + C_i 表示在d_i 站添加a_i 公里汽油,C_i 成本消耗。 此外,如果您允许在同一站点多次添加气体,则必须小心。

    最后,min{ D[n][*] | '*' is any positive value } 成为答案。

    【讨论】:

      【解决方案2】:

      我们可以根据数据考虑可以修剪搜索空间的潜在优化。选择d_1 的可能性会产生一个(cost, distance) 元组。在d_i,我们通过将cost_idistance_i 与之前的元组组合来生成新的元组,保留所有(cost, distance) 元组,其中距离大于d_(i+1),并且没有元组同时具有更高的成本和更低的距离其他。换句话说,我们不想将加油站i 与之前的元组 where 一起使用

      prev1.cost + c_i ≥ prev2.cost
      prev1.dist + d_i ≤ prev2.dist
      
      for some (prev1, prev2)
      

      我们可以在几何上将这种关系视为点对之间的零斜率或负斜率。

      distance
       |                b
       |              f
       |       c   
       |            e
       |     a   d
       |
        -----------------cost
      

      c --> ec --> da --> d 具有非正斜率意味着 ac 总是更好的选择,因此我们可以丢弃 de。我们正在寻找沿成本维度严格增加距离的序列,而不是凸包。从最低成本开始(打破平局的距离更高),注意到greater-cost-with-equal-or-lower-distance 从来没有一个有用的点。

      在每次迭代中,如果我们保持元组按成本排序,我们可以从第一个等于或大于d_(i+1) 的距离开始从低到高扫描(丢弃左侧的任何点),丢弃任何带有更大或相等的成本,但更低或相等的距离。

      【讨论】:

        猜你喜欢
        • 2020-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 1970-01-01
        • 2020-04-01
        • 2021-07-22
        相关资源
        最近更新 更多