#r #optimization #constraints #constraint-programming #cvxr
#r #оптимизация #ограничения #ограничение-программирование #cvxr
Вопрос:
Я пытаюсь решить задачу со смешанным целым числом с помощью CVXR в R. Для ее решения используется следующий код:
n <- 6
beta <- Variable(n, n, integer = TRUE)
epsilon <- 0.1*10^-5
objective <- Minimize(1)
constraints <- list(beta >= 1,
beta <= 9,
abs(diff(beta)) >= epsilon,
abs(diff(t(beta))) >= epsilon)
prob <- Problem(objective, constraints)
CVXR_result <- solve(prob)
Это приводит к следующей ошибке:
Error in construct_intermediate_chain(object, candidate_solvers, gp = gp) :
Problem does not follow DCP rules.
Когда я меняю код на следующий код:
n <- 6
beta <- Variable(n, n, integer = TRUE)
epsilon <- 0.1*10^-5
objective <- Minimize(1)
constraints <- list(beta >= 1,
beta <= 9,
abs(diff(beta)) <= epsilon,
abs(diff(t(beta))) <= epsilon)
prob <- Problem(objective, constraints)
CVXR_result <- solve(prob)
CVXR_result$status
CVXR_result$value
cvxrBeta <- CVXR_result$getValue(beta)
cvxrBeta
Это работает, но это не те ограничения, которые я хочу.
Кто-нибудь знает, как это решить?
Ответ №1:
Мы можем решить проблему, введя булеву матрицу y
, такую, что y[i,j]
равна 1, если i,j-е неравенство on diff(beta)
больше, чем и 0 в противном случае. Аналогично yy[i,j]
равно 1, если i,j-е неравенство on diff(t(beta))
больше, чем и 0 в противном случае. Таким образом, мы добавили 2 * (n-1) * n логических переменных. Также установите M
значение 9 и, чтобы избежать числовых трудностей, установите epsilon
значение 0.1. Для получения дополнительной информации см.: https://math.stackexchange.com/questions/37075/how-can-not-equals-be-expressed-as-an-inequality-for-a-linear-programming-model/1517850
library(CVXR)
n <- 6
epsilon <- 0.1
M <- 9
beta <- Variable(n, n, integer = TRUE)
y <- Variable(n-1, n, boolean = TRUE)
yy <- Variable(n-1, n, boolean = TRUE)
objective <- Minimize(1)
constraints <- list(beta >= 1,
beta <= M,
diff(beta) <= -epsilon 2*M*y,
diff(beta) >= epsilon - (1-y)*2*M,
diff(t(beta)) <= -epsilon 2*M*yy,
diff(t(beta)) >= epsilon - (1-yy)*2*M)
prob <- Problem(objective, constraints)
CVXR_result <- solve(prob)
CVXR_result$status
## [1] "optimal"
CVXR_result$getValue(beta)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 9 1 9 8 7
## [2,] 9 8 7 6 9 4
## [3,] 3 2 1 9 8 2
## [4,] 7 6 2 1 7 6
## [5,] 3 5 3 2 8 5
## [6,] 5 1 4 3 6 9