У меня есть две входные матрицы, dt (10,3) & wt (3,3), которые мне нужно использовать для поиска оптимальной матрицы решений (той же размерности), Par (10,3), чтобы максимизировать цель функция. Ниже R код даст некоторое направление в задаче (используемых образцов входов здесь) -Как работать с двоичными контурами в линейной оптимизации?
#Input Matrices
dt <- matrix(runif(300),100,3)
wt <- matrix(c(1,0,0,0,2,0,0,0,1),3,3) #weights
#objective function
Obj <- function(Par) {
P = matrix(Par, nrow = 10, byrow=F) # Reshape
X = t((dt%*%wt)[,1])%*%P[,1]
Y = t((dt%*%wt)[,2])%*%P[,2]
Z = t((dt%*%wt)[,3])%*%P[,3]
as.numeric(X+Y+Z) #maximize
}
Теперь я изо всех сил, чтобы применить следующие ограничения к проблеме:
1) Matrix, Par can only have binary values (0 or 1)
2) rowSums(Par) = 1 (Basically a row can only have 1 in one of the three columns)
3) colSums(Par[,1]) <= 5, colSums(Par[,2]) <= 6, & colSums(Par[,3]) <= 4
4) X/(X+Y+Z) < 0.35, & Y/(X+Y+Z) < 0.4 (X,Y,Z are defined in the objective function)
Я попытался кодирования ограничений в constrOptim, но не уверен, как вводить двоичные & целые ограничения. Я читаю на lpSolve, но не могу понять. Любая помощь очень ценится. Благодаря!
Двоичные переменные только возможно, если решатель поддерживает эти , Обычно это делается в рамках настройки выпуклой оптимизации (Mixed-integer, Mixed-QP, Mixed-QCQP, Mixed-SOCP, и только некоторые исследовательские решатели могут решать смешанные SDP). В невыпуклой конфигурации не намного больше, чем Couenne & Knitro (и проблема очень сложная). constrOptim/optim не может этого сделать! lpSolve может делать это только для MIP. Поскольку я не знаком с R, я не могу рассуждать о выпуклости вашей проблемы. Но если X, Y, Z - переменные (не константы), это выглядит плохо относительно выпуклости! – sascha
Hi Sascha, Спасибо за ответ. Цените свое время. Я не слишком хорошо знаком с различными настройками оптимизации. Основываясь на ответе Эрвина, я закодировал с помощью lpSolve и смог создать модель (борясь с одним ограничением). Хотя сейчас я беспокоюсь о переработке, поскольку мне приходится запускать это на миллион записей. Возможно, мне придется искать опции, отличные от R, которые могут обрабатывать такие данные. Любые мысли по этому поводу? Благодаря! – Rohit