Я хочу реализовать что-то вроде Алгоритм Кнута X в R.
Проблема: у меня есть матрица тревожных сигналов A, n> = k, с действительными значениями, представляющимистоимость.Как правило, n и k будут довольно малы (n <10, k <5).Я хочу найти отображение строк на столбцы, которое минимизирует общую стоимость матрицы при условии ограничения, что ни одна строка не может использоваться дважды. </p>
Я думаю, что это похоже на алгоритм X в том, чторазумный подход выглядит следующим образом:
- Выберите столбец в A и найдите в нем минимальное значение.
- Удалите эту строку и этот столбец.Теперь вы остались с Asub.
- Перейдите к шагу 1 и повторите с Asub и новым выбором столбца, пока ncol (Asub) = 1.
Но я не могу 't понять, как создать рекурсивную структуру данных в R, которая будет хранить результирующее дерево затрат на уровне ячеек.Вот то, что у меня есть до сих пор, которое сводит его только на одну ветку и поэтому не находит оптимального решения.
# This version of the algorithm always selects the first column. We need to make it
# traverse all branches.
algorithmX <- function(A) {
for (c in 1:ncol(A)) {
r <- which.min(A[,c])
memory <- data.frame(LP_Number = colnames(A)[c],
Visit_Number = rownames(A)[r],
cost = as.numeric(A[r,c]))
if (length(colnames(A))>1) {
Ared <- A[-r, -c, drop=FALSE]
return( rbind(memory, algorithmX(Ared)) )
}
else {
return(memory)
}
}
}
foo <- c(8.95,3.81,1.42,1.86,4.32,7.16,12.86,7.59,5.47,2.12,
0.52,3.19,13.97,8.79,6.52,3.37,0.91,2.03)
colnames(foo) <- paste0("col",c(1:3))
rownames(foo) <- paste0("row",c(1:6))
algorithmX(foo)
Я уверен, что упускаю что-то базовое в том, как обрабатывать рекурсиюфункция R.Я также рад услышать другие способы решения этой проблемы, если этот алгоритм на самом деле не подходит лучше всего.