我有一个关于动态编程的问题,我试图描述一个算法。
问题: 将建立一条管道,您必须决定沿着已经确定的路径的站点的最佳位置。管道连接点x1和xn并经过位置x2,x3 ...... x(n-1)。在x1和xn处有站,但问题的一部分是决定是否在点xi处为i = 2,3 ... n-1建立一个站。如果建立了一个站,则相关的成本为bi,如果是管道在xi和xj站之间建立,相应的成本是cij。总成本是站点成本和相应管道段成本的总和。目标是确定站点的最佳位置,以便最大限度地降低总成本。
我们必须使用动态编程来描述这种通用算法。 我的方法是将其视为切杆问题,并尝试制作矩阵并最大限度地降低成本,但我不知道如何处理正在建造的站点的额外成本变量。鉴于许多变量,我该如何处理这个问题?我将如何开发递归公式? 任何帮助将不胜感激!
编辑:是的我同意这个问题有点不清楚,一开始也让我感到困惑,但这就是问题中给出的全部内容。我相信由于车站和管道都有不同的成本,应该有一个最佳的方法。答案 0 :(得分:1)
这方面的关键见解是连接任意两点的最低成本,x i 和x j (称之为 ij )独立于该段之外的配置(即x * 1 *到x i 和x j 到x n )。
您的动态编程问题是索引并存储找到的每个成本,浮动部分解决方案会备份调用树。
基本情况是连接两个相邻节点的成本,x i 和x j (其中j = i + 1),只是cij(你可以在那里建立一个新站。
最简单的情况是当j = i + 2时;在i + 1建站是否有利可图。在代数术语中,是c(i)(i + 2)< b(i + 1)+ c(i)(i + 1)+ c(i + 1)(i + 2)?
通常,您需要重复使用find_first_station(i, j)
功能。这应该找到在已经在i和j的站之间建立的最低索引站的位置。对于每个点'k , i<k<j, build a station at
k , run a pipe
ik , and then recur with
find_first_station(k,j). Return the solution (all station locations) with the minimum cost for any
k`,如果cij是最低费用,则为空列表。
你能从那里拿走吗?