Здесь я обеспечиваю минимальный полный поддающуюся проверку Пример моей проблемы:столбцов на основе модели прямоугольной матрицы Манкреса взаимоисключающее распределение
прямоугольная матрица размера 3 х 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 х 17, и если стоимость оказалась отрицательным это заменяется суммированием всех значений столбцов (ничего конкретного, кроме как для обеспечения огромного значения). Теперь необходимо выполнить минимальное распределение затрат. Я установил библиотеку Манкрес с помощью Суд APT-получить установку питон-Манкрес и побежал следующий код:
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], тогда остальная часть шаблонов, содержащих любой из выделенного элемента, т.е. 2,5 здесь, не должна быть доступна для распределения или соответствующие связанные с шаблоном затраты в матрице должны быть обновлены до слишком высокого значения, так что те, которые больше не рассматриваются в следующем ряду, должны действовать следующим образом.
В конечном счете, если распределение возможно, соответствующие шаблоны должны быть взаимоисключающими по своей природе.
Может ли кто-нибудь предложить, как решить эту проблему?
Показатели в матрице, соответствующие минимальной стоимости (0,3), (1,10) и (2,4). Ни один из этих конфликтов. ps: Это не Python 3.x (утверждения печати неверны). pps: 'column' выглядит уже как int. Вам не нужно указывать это. – Yay295
Спасибо за оформление тега. Значение столбца берется из файла, поэтому оно имеет строку типа. Чтобы выполнить арифметику по этим значениям, мне нужно преобразовать в int. – bambi
(0,3) соответствует [2,5] и 91,10) соответствует столбцу [1,5]. [2,5] и [1,5] имеют 5 общих, так что это конфликт. Как только [2,5] распределяется на r1, для r2 не следует рассматривать любой столбец, имеющий либо «2», либо «5». – bambi