[英]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.