Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R lpsolve see all possible solutions of an integral LP

Is there a way to make lpSolve return multiple solutions? In below case i want (5,0) and (0,5) both.

If lpSolve cannot do that then is there any other R package which will return all possible solutions of an integral linear optimization program?

 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

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

I would also like to know why lpSolve package provides all possible solutions if all decision variables are binary. Why cannot it repeat the same when all variables are integer...

like image 854
user2543622 Avatar asked Oct 20 '22 17:10

user2543622


1 Answers

Code:

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
  }
}

Result:

5 0
4 1
3 2
1 4
2 3
0 5
No more solution.
like image 154
V. Michel Avatar answered Nov 03 '22 06:11

V. Michel