2015-12-07 18 views
0

我已經編寫了一些代碼,試圖使用本文提到的一系列啓發式算法和算法來最小化反饋弧集/最大化有向圖的最大非循環子圖(最多n = 100個節點)的頂點排名排序啓發式反饋Arc Set Problem由Franz J. Brandenburg和Kathrin Hanauer,德國帕紹大學。python - 迭代後清除memoized函數緩存?

讀入的數據是一個鄰接矩陣,它被轉換爲一個igraph.Graph實例。

我正在記憶成本函數和篩選函數。這兩個函數的參數是一個秩(包含頂點排序的元組)和edgeList(包含表示邊的元組)。

因爲我一次處理多個實例並且頂點由整數表示,所以我需要確保兩個函數的緩存在處理完一個實例(圖)之後被清除,並且我不完全確定這是發生。我發現了一些memoize定時緩存實現和memoize與_remove方法,雖然我不斷得到相同的結果。

這是爲了今天早些時候(2015年6月12日下午5:00)到期的項目,但與我一樣固執,我一直在努力,並且希望確保Im正確使用memoize方法。

我附上相關的代碼,我已經使用:

@memoize 
def cost(rank, edgeList): 
    rankMap = {} 
    for i in range(len(rank)): 
     rankMap[rank[i]] = i 
    cost = 0 
    for edge in edgeList: 
     u, v = edge[0], edge[1] 
     if rankMap[u] < rankMap[v]: 
      cost += 1 
    return cost 

class memoize: 

    """Gives the class it's core functionality.""" 
    def __call__(self, *args): 
     if args not in self._memos: 
      self._memos[args] = self._function(*args) 
     return self._memos[args] 

    def __init__(self, function): 
     self._memos = {} 
     self._function = function 

    """Removes all memos. This is particularly useful if something that  affects the output has changed.""" 
    def remove_memos(self): 
     self._memos = {} 

def alg_star(algorithm, costFunc, graph, rank): 
    edgeList = tuple([i.tuple for i in graph.es()]) 
    while True: 
     rankPrime = rank 
     rank = algorithm(tuple(rank), edgeList) 
     if costFunc(tuple(rank), edgeList) <= costFunc(tuple(rankPrime), edgeList): 
      break 
    return rankPrime 


@memoize 
def sifting(rank, edgeList): 
    copyRank = list(rank) 
    rankValues = {} 
    for node in rank: 
     rankValues[tuple(copyRank)] = cost(tuple(copyRank), edgeList) 
     for i in range(1,len(copyRank)): 
      copyRank[i-1], copyRank[i] = copyRank[i], copyRank[i-1] 
      rankValues[tuple(copyRank)] = cost(tuple(copyRank), edgeList) 
     copyRank = list(argMax(rankValues)) 
    return copyRank 

# def evaluateFAS(fileNameList): 
rankings = [] 
for fileName in fileList: 
print fileName 
adjMatrix, incoming, outgoing = fasGraph(fileName) 
instance = igraph.Graph.Adjacency(adjMatrix.tolist()) 
pre_process(instance) 
# rank = kss200(instance) 
rank = fasAlg(adjMatrix, incoming, outgoing) 
rank = alg_star(sifting, cost, instance, rank) 
rank = np.array(rank) + 1 
rankings.append(rank) 
cost.remove_memos() #not sure if working properly 
sifting.remove_memos() # not sure if working properly 
# return rankings 

任何幫助和指導,將不勝感激。

回答

0

對我來說沒關係。讓我們給它一點試駕

class memoize: 

    """Gives the class it's core functionality.""" 
    def __call__(self, *args): 
     if args not in self._memos: 
      self._memos[args] = self._function(*args) 
     return self._memos[args] 

    def __init__(self, function): 
     self._memos = {} 
     self._function = function 

    """Removes all memos. This is particularly useful if something that  affects the output has changed.""" 
    def remove_memos(self): 
     self._memos = {} 


@memoize 
def f(x, y): 
    print('f') 
    return x + y 

@memoize 
def g(x, y): 
    print('g') 
    return x * y 

print(f(2,3)) 
print(f(2,3)) 
print(g(2,3)) 
print(g(2,3)) 
print(f._memos) 
print(g._memos) 
f.remove_memos() 
g.remove_memos() 
print(f._memos) 
print(g._memos) 

輸出

f 
5 
5 
g 
6 
6 
{(2, 3): 5} 
{(2, 3): 6} 
{} 
{} 

爲什麼你認爲它不能正常工作?

+0

只是偏執我猜。我並不完全確定memoization在全球/本地環境方面的工作原理。而且由於我得到的輸出和以前一樣,所以我把兩條線放在「不知道它是否有效」的地方,我以爲我沒有正確記憶/清除。我也不知道如何做一個簡單的測試,非常感謝你的迴應。 –