在这里,我提供了我的问题的最小完整可验证示例:
考虑大小为 3 X 17 的矩形矩阵:行 = [10,6,9] 考虑。其中列是模式,每个模式都与一个值相关联
example file: "patterns_list" <pattern <space> associated value>
['2','3'] 12
['2','1'] 11
['2','5'] 11
['3','4'] 10
['3','5'] 9
['4','1'] 9
['4','5'] 9
['3','6'] 8
['4','6'] 8
['1','5'] 8
['2'] 7
['1','6'] 7
['3'] 5
['4'] 5
['1'] 4
['5'] 4
['6'] 3
现在,列值和行值之间的差异被视为矩阵 3 X 17 中的成本,如果成本结果为负,则将其替换为所有列值的总和(没有什么特别的,但要确保一些巨大的价值)。现在需要进行最低成本分配。我使用sudo apt-get install python-munkres安装了库munkres 并运行了以下代码:
from munkres import Munkres, print_matrix
import linecache
rows=[10,6,9]
v=[]
diff=[]
value=[]
f = open("patterns_list","r")
for line in f:
line=line.strip()
line=line.split(' ')
v.append(int(line[1]))
total=sum(v)
for i in range(0,len(rows)):
for j in range(0,len(v)):
x=v[j]-rows[i]
if x<0:
value.append(total)
else:
value.append(v[j]-rows[i])
diff.append(value)
value=[]
matrix=diff
m = Munkres()
indexes = m.compute(matrix)
print_matrix(matrix, msg='Lowest cost through this matrix:\n')
total = 0
patterns=[]
print "Allocation indices:"
for row, column in indexes:
value = matrix[row][column]
total += value
print '(%d, %d) -> %d' % (row, column, value)
patterns.append(int(column))
print 'total cost: %d' % total
print "Corresponding allocated patterns:\n"
for i in range(0,len(patterns)):
line = linecache.getline("patterns_list",patterns[i])
print line
生成以下输出:
Lowest cost through this matrix:
[ 2, 1, 1, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130]
[ 6, 5, 5, 4, 3, 3, 3, 2, 2, 2, 1, 1, 130, 130, 130, 130, 130]
[ 3, 2, 2, 1, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130]
Allocation indices:
(0, 3) -> 0
(1, 10) -> 1
(2, 4) -> 0
total cost: 1
Corresponding allocated patterns:
['2','5'] 11
['1','5'] 8
['3','4'] 10
问题是 [2,5],[1,5],[3,4] 是最终分配的模式,对应于最低成本。这里的模式 [2,5],[1,5] 不是相互排斥的。“5”有共同之处。一旦 r1 得到 [2,5] 分配,则包含已分配元素的其余模式 ie,2,5 此处不应可用于分配,或者矩阵中相应的模式相关成本应更新为太高的值,这样那些不再考虑到下一行的人应该像这样进行。
最终意味着如果分配是可能的,则相应的模式本质上应该是互斥的。
谁能建议如何解决这个问题?