讓我們說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
片段u
和v
如果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, ])
但是,我不知道我怎麼能使用get_marginal_cost
功能上面我提到我dfs
功能裏面,我怎麼可以傳遞和更新minimum
變量dfs
函數,這樣我能找到的最小成本程序終止。
它應該不斷增加最小值的邊際成本,並檢查並更新if start[1] == space:
(空間爲100)中的最小值。
測試用例和代碼是http://ideone.com/oN4jWa
它看起來像我需要傳入和傳出dfs,而不僅僅是路徑,但也是迄今爲止的成本。 – huggie 2014-12-04 02:15:54
什麼是「所有可能的片段集合」?這應該是給定的,而不僅僅是空間內的所有數字對[0,100],對吧?否則,我會想象得到的碎片越少成本越低。 – huggie 2014-12-04 02:27:02
由於您的成本函數只涉及邊際成本以及一個片段。我想象每一個新的附加片段都會增加成本:'先前的分數+ get_marginal_cost(fragmt)'。看來它涉及的碎片越少成本越低。 – huggie 2014-12-04 02:31:18