Решение задачи оптимизации с помощью CVXR в R, используя несколько ограничений

#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