Как реплицировать решателя excel в R
Я использовал excel solver для решения проблемы оптимизации, и я пытаюсь реплицировать его в R.
Я нашел много пакетов, таких как optim, ROI и т.д., но кажется, что все они берут вектор только как объект для оптимизации и позволяют переменным принимать любое непрерывное значение. В моем случае у меня есть матрица ограничений, которая также должна быть удовлетворена, и мои переменные могут принимать только двоичные значения.
Вот проблема, которую я хочу решить:
A-D - это машины, 1-3 - задачи, а число в первой матрице - это значение, сгенерированное с помощью машины X для выполнения задачи Y. Ограничения: A-D может выполнять и выполнять только одну задачу (не может разделить); каждая задача может работать и обрабатываться только одной машиной.
Вот код, который я использую:
par = rep(c(0,1),6)
mat <- matrix(c(9,10,11,4,5,10,1,3,5,7,5,4), nrow = 3)
fr <- function(x) {
y= matrix(x,nrow = 4)
sum(mat %*% y)
}
a = optim(par, fr)
Некоторые вопросы: Как оптимизировать максимум, кажется, эта функция по умолчанию оптимизирует минимум? Как я могу добавить в него ограничения? Как ограничить двоичные переменные?
Ответы
Ответ 1
Вам нужно построить вектор для целевой функции и матрицы ограничений, окончательно разрешив один из решателей R LP:
library(lpSolve)
costs <- matrix(c(9, 10, 11, 4, 5, 10, 1, 3, 5, 7, 5, 4), nrow=3)
nr <- nrow(costs)
nc <- ncol(costs)
columns <- t(sapply(1:nc, function(x) rep(c(0, 1, 0), c(nr*(x-1), nr, nr*(nc-x)))))
rows <- t(sapply(1:nr, function(x) rep(rep(c(0, 1, 0), c(x-1, 1, nr-x)), nc)))
mod <- lp("max", as.vector(costs), rbind(columns, rows), "<=", rep(1, nr+nc), binary.vec=rep(TRUE, nr*nc))
Теперь вы можете захватить решение и целевую функцию:
mod$objval
# [1] 27
matrix(mod$solution, nrow=nr)
# [,1] [,2] [,3] [,4]
# [1,] 0 0 0 1
# [2,] 1 0 0 0
# [3,] 0 1 0 0
Обратите внимание, что такие функции, как optim
, не подходят для этой проблемы, поскольку они не учитывают матрицы ограничений, а также потому, что они не могут ограничивать значения двоичных переменных.