簡體   English   中英

在數字組合中求和

[英]Find the Highest Sum in a Combination of Numbers

可以說我有這個:

1A=6 2A=4.5  3A=6

1B=7 2B=6    3B=7.5

1C=6 2C=6.75 3C=9

我想找到產生最高總和的數字組合。 字母前的數字均不能重復使用,數字后的字母均不能重復使用。 例如。 1A+2B+3C, 1C+2B+3A有效。 1A+1B+2B,3A+2B+3B,1A+2A+3A無效。

在這種情況下,最高和為1A+2B+3C=21 如何使用python找到此結果和組合?

提前致謝

對於每個具有相同數字前綴的條目,請在其中找到最大值。 然后將所有這些最大值相加,您將獲得具有給定限制的最大和。

如果數字和字母必須唯一,那么這將成為匈牙利算法可以解決的問題。

匈牙利方法是一種組合優化算法,可以解決多項式時間中的分配問題 [...]

分配問題的描述:

分配問題是數學優化或運籌學分支中最基本的組合優化問題之一。 它包括在加權二部圖中找到最大權重匹配

以最一般的形式,問題如下:

有許多代理和許多任務。 可以分配任何座席以執行任何任務,這會產生一些費用,該費用可能會因座席任務分配而異。 要求執行所有任務,方法是將每個任務恰好分配給一個代理,將每個任務恰好分配給一個代理,以使分配的總成本最小化。

我不是python專家,因此以下代碼似乎不是那種“ python風格”,但是算法應該可以。

#test input. the matrix can be any n * n size.
matrix = [[6,7,6],[4.5,6,6.75],[6,7.5,9]]

#assistant array to track which numbers we have already used.
#check[i] = 1 if i has been used
check = [0]* len(matrix)

#max sum
max_sum = 0

def getMax(matrix,check,row,curr_sum):
    global max_sum
    #base case, we have reached the last letter.
    #check to see if this combination is max
    if(row==len(matrix)-1):
        for i in range(len(check)):
            if(check[i]==0 and (matrix[row][i]+curr_sum)>max_sum):
                max_sum = matrix[row][i]+curr_sum
    #recursive case, pick the current available number, go to next letter.
    else:
        for i in range(len(check)):
            if(check[i]==0):
                check[i]=1
                getMax(matrix,check,row+1,curr_sum+matrix[row][i])
                check[i]=0

getMax(matrix,check,0,0)

print max_sum

請注意,這是使用遞歸的一種蠻力算法。 就時間復雜度而言,存在更好的算法(例如動態編程方法)。 您可以向該方法添加緩存以提高效率。

另外,如果您想了解組合,我們需要付出額外的努力來跟蹤組合。 (例如,使用另一個矩陣進行記錄)

這可以通過以下方式完成:

l1 = [6, 7, 6]
l2 = [4.5, 6, 6.75]
l3 = [6, 7.5, 9]

map(max, [l1, l2, l3])

實際上,python具有可以為您完成此操作的庫。 看到這里: Munkres

暫無
暫無

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

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