【发布时间】:2025-12-03 20:25:02
【问题描述】:
让我们说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,并定义片段u 和v 之间存在edge 如果u[0] < v[0] <= u[1] <= v[1]。
叶子节点是以 100 结尾的片段。
通过下面的函数,我能够获得表示(可能)构成整个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, ])
但是,我不确定如何在dfs 函数中使用上面提到的get_marginal_cost 函数,以及如何将minimum 变量传递和更新为dfs 函数,以便找到终止程序的最低成本。
它应该不断地在最小值上加上边际成本,并且只在if start[1] == space:(空格为100)中检查和更新最小值。
一个测试用例,代码在http://ideone.com/oN4jWa
【问题讨论】:
-
在我看来,您不仅需要传入和传出 dfs,还需要传入和传出到目前为止的成本。
-
什么是“所有可能的片段集”?那应该是给定的,而不仅仅是空间 [0, 100] 内的所有数字对,对吗?否则我会想象涉及的碎片越少,成本就越低。
-
因为你的成本函数只涉及边际成本加上一个片段。我想每个新的附加片段都会增加成本:
previous score + get_marginal_cost(fragmt)。看来,它涉及的碎片越少,成本就越低。 -
不一定。边际成本涉及两个因素,分片数量和分片长度。
-
你能告诉我片段长度的定义是什么吗?
标签: python python-2.7 yield