簡體   English   中英

使用記憶的遞歸算法

[英]Recursive algorithm using memoization

我的問題如下:我有一個任務列表,每個任務花費特定的時間並授予特定的點數,並指定了執行時間“ k”:

例如: missions = [(14,3),(54,5),(5,4)]time = 15

在此示例中,我執行了3個任務,第一個任務給了我14分,耗時3分鍾。 我總共有15分鍾。 每個任務都是一個元組,第一個值為該任務的點數,第二個值為執行此任務所需的分鍾數。

我必須使用記憶來遞歸地找到給定任務列表和給定時間可以獲取的最大積分。

我正在嘗試實現一個稱為choose(missions,time)的函數,該函數將遞歸操作,並使用函數choose_mem(missions,time,mem,k)達到我的目標。 函數select_mem應該得到'k',這是要選擇的任務數,而mem是一個空字典,mem,它將包含之前已經解決的所有問題。

這就是我到目前為止所得到的,我需要幫助來實現上面的要求,我的意思是字典的用法(當前一直在那兒並且一直空着),還有我的choice_mem函數輸入是i,j,missions,d的事實i,j,missions,d應該是choose_mem(missions, time, mem, k) ,其中mem = d,k是可供選擇的任務數。

如果有人可以幫助我調整我的代碼,將不勝感激。

mem = {}

def choose(missions, time):
    j = time
    result = []
    for i in range(len(missions), 0, -1):
        if choose_mem(missions, j, mem, i) != choose_mem(missions, j, mem, i-1):
            j -= missions[i - 1][1]
    return choose_mem(missions, time, mem, len(missions)) 

def choose_mem(missions, time, mem, k): 
    if k == 0: return 0
    points, a = missions[k - 1]
    if a > time:
        return choose_mem(missions, time, mem, k-1) 
    else:
        return max(choose_mem(missions, time, mem, k-1),
                   choose_mem(missions, time-a, mem, k-1) + points)

這有點含糊,但是您的問題可以大致翻譯成一個非常著名的NP完全問題,即背包問題。

您可以在Wikipedia上了解更多有關它的信息,如果您用時間代替重量,就會遇到問題。

動態編程是解決該問題的常用方法,如您在此處看到的: http : //en.wikipedia.org/wiki/Knapsack_problem#Dynamic_programming

對於實用而言,記憶化或多或少地等同於動態編程,因此,不要讓花哨的名字欺騙您。

基本概念是您使用其他數據結構來存儲已經解決的部分問題。 由於您要實現的解決方案是遞歸的,因此許多子問題將重疊,而備注僅允許您對每個子問題進行一次計算。

因此,最困難的部分是讓您考慮問題,需要在字典中存儲什么,以便在使用已計算出的值調用choose_mem時,您只需從字典中檢索它們,而無需執行其他遞歸操作呼叫。

如果您想檢查通用的0-1背包問題的實現(您的情況,因為您不能部分添加商品),那么在我看來,這就像一個不錯的資源:

https://sites.google.com/site/mikescoderama/Home/0-1-knapsack-problem-in-p

解釋得很好,代碼也足夠可讀。 如果您了解矩陣用於存儲成本的用法,那么您會為您解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM