R lpsolve посмотреть все возможные решения интеграла LP

Есть ли способ заставить lpSolve возвращать несколько решений? В приведенном ниже случае я хочу (5,0) и (0,5) оба.

Если lpSolve не может этого сделать, то есть ли другой пакет R, который вернет все возможные решения интегральной программы линейной оптимизации?

 library("lpSolve")
  A=matrix (c(1, 1), nrow=1, byrow=TRUE)

  b=(5)
  signs='=='
  c_=c(1,1)
  res = lpSolve::lp('max', c_, A, signs, b,  all.int = TRUE)
  res$solution

=======================================================================

Я также хотел бы знать, почему пакет lpSolve предоставляет все возможные решения, если все переменные решения являются двоичными. Почему он не может повторить то же самое, когда все переменные являются целыми числами...


person user2543622    schedule 19.02.2015    source источник
comment
Я чувствую, что кто-то, должно быть, нашел способ обойти это. будем надеяться, что я получу это за щедрость   -  person user2543622    schedule 21.02.2015
comment
Вы можете сделать это с CPLEX, но это не совсем бесплатно (если вы не можете получить академическую лицензию). Вам будет интересен этот вариант?   -  person Ioannis    schedule 22.02.2015
comment
спасибо за вклад. Но нет. Я не могу использовать cplex. Это должно быть Р   -  person user2543622    schedule 23.02.2015
comment
Я говорил о R API CPLEX. Все тот же R, но CPLEX вместо lpsolve. В противном случае, если вы хотите использовать lpsolve, вы можете сформулировать свою задачу с целочисленными переменными как задачу с двоичными переменными, но это увеличит количество переменных. Если интересно, могу дать ответ.   -  person Ioannis    schedule 23.02.2015
comment
что касается двоичных переменных, я уже пытаюсь это сделать. Если возможно, ответьте на stackoverflow.com /вопросы/28666795/. Что касается R API для cplex: если это R API, то должен ли я беспокоиться о том, является ли cplex бесплатным или нет?   -  person user2543622    schedule 23.02.2015


Ответы (1)


Код:

library(lpSolveAPI)

vBiv_of_v <- function (nbits,v){
   taillev<-length(v)
   taillevBivalent<-nbits*taillev
   vBivalent<-rep(0,taillevBivalent)

   for(iLg in seq(1,taillev)) {
     iCoef<-1
     for(iDelta in seq(1,nbits)){
       vBivalent[(iLg-1)*nbits+iDelta]<- iCoef*v[iLg]
       iCoef<-iCoef*2
     }
   }
   vBivalent
}

vBiv_to_v <- function (nbits,vBivalent) {
   taillevBivalent<-length(vBivalent)
   taillev<-taillevBivalent/nbits

   v<-rep(0,taillev)
   for(iLg in seq(1,taillev)) {
     for(iDelta in seq(1,nbits)){
       v[iLg]<-v[iLg]+2^(iDelta-1)*vBivalent[(iLg-1)*nbits+iDelta]
     }
   }
   v
}
nbVariable<-2
nbBits=3
nbVariableBivalentes<-nbVariable*nbBits
f.obj<-rep(0,nbVariableBivalentes)
mylp <- make.lp(0, nbVariableBivalentes)
set.objfn(mylp,f.obj)
add.constraint(mylp, vBiv_of_v(nbBits,c(1,1)), "=", 5)
set.type(mylp, 1:nbVariableBivalentes , type = "binary")

repeat {
  status<-solve(mylp)

  if(status == 0) {
    last_sol<-get.variables(mylp)

    vRes<-vBiv_to_v(nbBits,last_sol)
    cat(vRes[1],vRes[2],"\n")

    #add cutting
    new_rhs <- 0;
    f.condSup<-rep(0,nbVariableBivalentes)
    for (iCol in 1:nbVariableBivalentes) {
      f.condSup[iCol] <-  2 * last_sol[iCol] - 1
      new_rhs <- new_rhs + last_sol[iCol];
    }
    add.constraint(mylp, f.condSup, "<=", new_rhs - 1)
  }
  else if(status == 2) {
    cat("No more solution.\n") 
    break
  }
}

Результат:

5 0
4 1
3 2
1 4
2 3
0 5
No more solution.
person V. Michel    schedule 29.09.2015