2015-02-23 4 views
2

У меня проблема с линейным программированием. Все переменные являются двоичными, и я хочу получить все возможные решения. Я знаю, что могу установить параметр num.bin.solns для предоставления нескольких решений. Но есть ли простой способ попросить все возможные решения?R lpsolve binary Найти все возможные решения

Например, в нижнем случае я знаю, что максимальное количество ответов равно 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

+0

Хороший вопрос. Я попытался найти его, но не знаю, откуда этот -1. Документация мне не помогла. Поэтому вы видите, что я делаю голову(), чтобы вырезать это. –

+0

Я попробовал ваш ответ, и это имеет смысл. Единственная проблема заключается в том, что если проблема огромна, то она замедляет обработку и иногда возвращает ошибку. Вместо указания num.bin.solns = 1000, есть ли способ сказать, что вернуть все возможные решения? – user2543622