Как реплицировать решателя 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, не подходят для этой проблемы, поскольку они не учитывают матрицы ограничений, а также потому, что они не могут ограничивать значения двоичных переменных.