2015-02-23 89 views
2

我有一个线性规划问题。所有的变量都是二进制的,我想获得所有可能的解决方案。我知道我可以设置参数num.bin.solns来提供多种解决方案。但是有没有简单的方法来寻求所有可能的解决方案?R lpsolve二进制查找所有可能的解决方案

例如在下面的情况下,我知道答案的最大数量是6.但如果我不知道最大可能的解决方案,那么我怎样才能设置num.bin.solns参数,使它将返回所有可能的解决方案?

library("lpSolve") 
A=matrix (c(1,1,1,1), nrow=1, byrow=TRUE) 
b=(2) 
signs='==' 
c_=rep(0,4) 
res = lpSolve::lp('max', c_, A, signs, b, all.bin = TRUE, num.bin.solns=6) 

回答

1

下面介绍一种方法。 lpSove实际上为您提供了它找到的num.bin.solns,并且您可以使用$表示法访问它。

您可以初步设置num.bin.solns为一些大数字(比如1000)。然后访问mylp $ num.bin.solns以获取确切的值。

mylp <- lp('max', c_, A, signs, b, all.bin = TRUE, num.bin.solns=1000) 
numcols <- 4 
numsols <- mylp$num.bin.solns 

solutions <- matrix(head(mylp$solution, numcols*numsols), nrow=numsols, byrow=TRUE) 

> numsols 
[1] 6 

而且你可以打印出个性化解决方案:

> solutions 
    [,1] [,2] [,3] [,4] 
[1,] 0 0 1 1 
[2,] 0 1 0 1 
[3,] 1 0 0 1 
[4,] 1 0 1 0 
[5,] 1 1 0 0 
[6,] 0 1 1 0 
+0

感谢,让我试试吧。 QQ:任何想法什么mylp $解决方案有超过我们预期的1个元素?即如果我们把num.bin.solns = 1000,那么解向量的长度是4001 ...它应该是4000 ...第4001个元素表示什么? – user2543622 2015-02-25 01:00:55

+0

好问题。我试图寻找它,但不知道-1从哪里来。文档没有帮助我。因此,你看我做头()来切断它。 – 2015-02-25 01:06:27

+0

我试过你的答案,这很有道理。唯一的问题是,如果问题很严重,那么它会减慢处理速度,有时会返回错误。而不是指定num.bin.solns = 1000,有没有办法说,返回所有可能的解决方案? – user2543622 2015-02-25 01:15:37

相关问题