линейное программирование с двойным симплексом в R

У меня есть проблема линейного программирования, которую я пытаюсь решить в R. Я использовал lpSolve пакет. lpSolve по умолчанию использует простой симплексный алгоритм для получения решения. Что, если я хочу изменить алгоритм на двойной симплекс? Результаты сильно различаются между двумя алгоритмами. Существуют ли другие пакеты, которые помогли бы решить указанную ниже проблему с использованием двойного симплексного алгоритма.

library("lpSolve")

f.obj <- c(rep(1,12),rep(0,4))
f.cons <- matrix(c(1,-1,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,
                   0,0,1,-1,0,0,0,0,0,0,0,0,1,0,-1,0,
                   0,0,0,0,1,-1,0,0,0,0,0,0,1,0,0,-1,
                   0,0,0,0,0,0,1,-1,0,0,0,0,0,1,-1,0,
                   0,0,0,0,0,0,0,0,1,-1,0,0,0,1,0,-1,
                   0,0,0,0,0,0,0,0,0,0,1,-1,0,0,1,-1),nrow=6,byrow=T)

f.dir <- rep("=",6)

f.rhs <- c(-1.0986,1.6094,-1.0986,1.94591,1.3863,-1.7917)

g <- lp ("min", f.obj, f.cons, f.dir, f.rhs,compute.sens=TRUE)
g$solution

Primal Simplex с использованием lpSolve в R выглядит следующим образом:

0 0 0 0 0 0.91630 0.0 0.76209 0.47 0 0 0 1.60940 2.70800 0 1.79170

Двойной симплекс с использованием программного обеспечения Lingo и SAS выглядит следующим образом:

0 0.76214 0 0 1.23214 0 0 0 0.15415 0 0 0 0.8473 1.9459 0 1.7918

Целевая функция одинакова для обоих алгоритмов 2.14839


person forecaster    schedule 09.12.2016    source источник
comment
Если вы используете lpSolveAPI, вы можете управлять симплексным типом, например, lp.control(lprec, simplextype="dual")   -  person Karsten W.    schedule 09.12.2016
comment
@KarstenW. отлично сработало, спасибо. Не могли бы вы оставить свой комментарий в качестве ответа, чтобы я мог его принять?   -  person forecaster    schedule 09.12.2016


Ответы (1)


С lpSolveAPI вы можете точно настроить свой решатель:

lprec <- make.lp(0, ncol=16) 
set.objfn(lprec, obj=c(rep(1,12), rep(0,4)))

add.constraint(lprec, xt=c(1,-1,1,-1), indices=c(1, 2, 13, 14), type="=", rhs=-1.0986)
add.constraint(lprec, xt=c(1,-1,1,-1), indices=c(3, 4, 13, 15), type="=", rhs=1.6094)
add.constraint(lprec, xt=c(1,-1,1,-1), indices=c(5, 6, 13, 16), type="=", rhs=-1.0986)
add.constraint(lprec, xt=c(1,-1,1,-1), indices=c(7, 8, 14, 15), type="=", rhs=1.94591)
add.constraint(lprec, xt=c(1,-1,1,-1), indices=c(9, 10, 14, 16), type="=", rhs=1.3863)
add.constraint(lprec, xt=c(1,-1,1,-1), indices=c(11, 12, 15, 16), type="=", rhs=-1.7917)

lp.control(lprec, simplextype="dual", pivoting="dantzig", verbose="detailed")
solve(lprec)
get.variables(lprec)
#  [1] 0.00000 0.00000 0.76209 0.00000 0.00000 0.15421 0.00000 0.00000 1.23209
# [10] 0.00000 0.00000 0.00000 0.84731 1.94591 0.00000 1.79170

См. ?lp.control.options для получения более подробной информации. Однако мне не удалось воспроизвести решение, данное LINGO / SAS.

person Karsten W.    schedule 09.12.2016