Как заменить переменную в lpSolveAPI в R

Я решаю линейную программу с помощью lpSolveAPI и хочу заменить переменную объектной функции на переменную объекта.

например, я имитирую оригинал моего LP вот так

x5 <- x1 + x2
x6 <- x2 + x3 + x4

object funtion 
min x5 + x6 

subject to
x1 + x2                <=  2
         x3 +  x4      <=  5
      x2    +  x4      <=  3
x1, x2, x3, x4 = binary
x5, x6 = integer

to do this by lpSolveAPI, I try it like below


lprec <- make.lp(3, 4) # make.lp
var_lp <- matrix(c( rep(1, 12)), nrow = 3) # variable as var_lp

set.column(lprec, 1, var_lp[1,1], indices = 1) # s.t.
set.column(lprec, 2, c(var_lp[1,2], var_lp[3,2], indices = c(1,3))
set.column(lprec, 3, var_lp[2,3], indices = 2)
set.column(lprec, 4, c(var_lp[2,4], var_lp[3,4], indices = c(2,3))

я больше не знаю, как выразить x5, x6 в lpSolveAPI

Спасибо за ваше лидерство. я надеюсь, что кто-то даст мне ответ об этом

* плюс, мои исходные данные имеют ограничение около 5000. можно ли анализировать с помощью lpSolveAPI??


person MINGYU LEE    schedule 04.05.2016    source источник


Ответы (1)


Функция set.type позволяет указывать целочисленные домены

set.type(lprec, 5, type="integer")

Однако вам нужно будет увеличить определение проблемы:

lprec <- make.lp(5,6)

Изменить: фрагмент кода для этой проблемы

library(lpSolveAPI)
lprec <- make.lp(5,6)
set.objfn(lprec, obj=c(1,1), indices=c(5,6)) # sense defaults to "min"
set.row(lprec, 1, xt=c(1,1), indices=c(1,2))
set.row(lprec, 2, xt=c(1,1), indices=c(3,4))
set.row(lprec, 3, xt=c(1,1), indices=c(2,4))
set.row(lprec, 4, xt=c(1,1,-1), indices=c(1,2,5))
set.row(lprec, 5, xt=c(1,1,1,-1), indices=c(2,3,4,6))
set.type(lprec, 1, type="binary")
set.type(lprec, 2, type="binary")
set.type(lprec, 3, type="binary")
set.type(lprec, 4, type="binary")
set.type(lprec, 5, type="integer")
set.type(lprec, 6, type="integer")
set.constr.type(lprec, types=c(rep("<=",3), rep("=",2)))
set.rhs(lprec, b=c(2,5,3,0,0))

Вы можете использовать print или write.lp, чтобы убедиться, что указанная программа является программой, которую вы хотите решить. С помощью solve вы вычисляете решение, которое было бы в этом всем нулевым:

solve(lprec)
get.variables(lprec)

(Я считаю, что неявно lpSolve предполагает неотрицательность всех переменных.)

person Karsten W.    schedule 04.05.2016
comment
Спасибо за совет. а вы умеете выражать х5, х6 в lpSolveAPI?? (х5 = х1 + х2, х6 = х2 + х3 + х4) - person MINGYU LEE; 08.05.2016
comment
Вы можете добавить x5, x6 в качестве дополнительных ограничений, см. отредактированный ответ. - person Karsten W.; 09.05.2016
comment
Я так Спасибо за вашу помощь. Я решаю свою проблему с лп. Хорошего дня :) - person MINGYU LEE; 09.05.2016