通过将变量传递给带有yield的递归函数来查找最小值

时间:2014-12-04 01:41:21

标签: python python-2.7 yield

我们说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

其中RTTbandwidth是常量。

我正在尝试从具有最低成本的片段集中找到子集。

由于无法使用贪婪算法解决这个问题,我想考虑所有可能的片段集。

我使用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

1 个答案:

答案 0 :(得分:1)

我担心我不能很好地理解你现有的代码,无法确切地看出你出错的地方(astart 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元素)并且它们的数据结构可以被切片,那么您可以摆脱这一步骤。