我们说space = [0, 100]
。
我得到了空间的片段,可能重叠。
例如,
[0, 30], [0, 20], [10, 40], [30, 50], [50, 90], [70, 100]
是一组片段。
跨越从上述集合中选择的整个空间的一组片段的示例是:
[0, 30], [10, 40], [30, 50], [50, 90], [70, 100]
这组片段跨越整个空间,因为它包含[0,100]
中的所有元素另一个例子是
[0, 30], [30, 50], [50, 90], [70, 100]
这是上一个示例中没有[10, 40]
的设置。
对于每组片段,可以计算成本。
集合的成本是添加片段的边际成本之和。
将片段添加到集合的边际成本函数由下式给出:
def get_marginal_cost(fragment):
return RTT + (fragment[1] - fragment[0])/bandwidth
其中RTT
和bandwidth
是常量。
我正在尝试从具有最低成本的片段集中找到子集。
由于无法使用贪婪算法解决这个问题,我想考虑所有可能的片段集。
我使用Depth First Search
算法来考虑所有可能的情况,将每个片段视为node
,并定义片段edge
和{{1}之间存在u
如果v
。
叶子节点是以100结尾的片段。
我能够通过下面的函数获得生成器对象,这些对象代表(可能)构成整个u[0] < v[0] <= u[1] <= v[1]
的片段集的所有可能情况。
space
但是,我不确定如何在def dfs(a, start, path=None):
if path is None:
path = [start, ]
if start[1] == space:
yield path
for frgmt in a - set(path):
l = frgmt[0]
r = frgmt[1]
if start[0] < l <= start[1] <= r:
yield dfs(a, frgmt, path + [frgmt, ])
函数中使用上面提到的get_marginal_cost
函数以及如何将dfs
变量传递给minimum
函数,以便我可以在程序终止时找到最低成本。
应该继续将边际成本添加到最小值,并仅在dfs
(空格为100)中检查并更新最小值。
测试用例,代码位于http://ideone.com/oN4jWa
答案 0 :(得分:1)
我担心我不能很好地理解你现有的代码,无法确切地看出你出错的地方(a
或start
dfs
中的from operator import itemgetter
def dfs(space, fragments, path=None, cost=0):
if path == None:
path = []
path_end = space[0]
else:
path_end = path[-1][1]
for i, fragment in enumerate(fragments):
if fragment[0] > path_end: # this fragment would leave a gap (as
break # will all the rest) so we can stop
elif path_end < fragment[1]: # useless fragments are skipped
new_path = path + [fragment]
new_cost = cost + get_marginal_cost(fragment)
if fragment[1] == space[1]: # this fragment reaches the end,
yield new_path, new_cost # so this is a base case
else: # recursive case
for result in dfs(space, fragments[i+1:], # slice frag list
new_path, new_cost):
yield result # in Python 3.3 and later, you can skip the
# loop and just use "yield from dfs(...)"
def find_minimum_cost_path(space, fragments):
fragments.sort(key=itemgetter(0)) # sort by start of the fragments
path, cost = min(dfs(space, fragments), key=itemgetter(1))
return path
或min
不清楚, 例如)。但是,我想我会抓住你想要解决的问题。以下是我自己使用您描述的基本算法解决它的方法:
dfs
我解决了通过在查找所有有效路径(使用递归深度优先遍历)和选择最小成本路径(调用dfs
)之间拆分工作来找到最小成本路径的问题。您可能可以将sorted
更改为仅返回其找到的路径的最低成本,但这会更复杂一些。为简单起见,我将各部分分开。
它们对find_minimum_cost_path
函数的关键在于它只适用于已分类的片段序列。目前尚不清楚您使用的是哪种数据结构,因此我在{{1}}函数中调用了{{1}}。如果您的片段已经被排序(通过它们的start元素)并且它们的数据结构可以被切片,那么您可以摆脱这一步骤。