lpsolveAPI在RStudio中

时间:2013-07-11 19:49:45

标签: r linear-programming

我在RStudio中使用lpsolveAPI。当我键入具有很少决策变量的模型的名称时,我可以读取模型中当前约束的打印输出。例如

> lprec  
Model name: 
          COLONE    COLTWO  COLTHREE   COLFOUR          
Minimize         1         3      6.24       0.1          
THISROW          0     78.26         0       2.9  >=  92.3
THATROW       0.24         0     11.31         0  <=  14.8
LASTROW      12.68         0      0.08       0.9  >=     4
Type          Real      Real      Real      Real          
Upper          Inf       Inf       Inf     48.98          
Lower         28.6         0         0        18  

但是当我制作一个包含9个以上决策变量的模型时,它不再提供完整的摘要,而是我看到:

> lprec
Model name:
    a linear program with 13 decision variables and 258 constraints

当有大量决策变量时,有谁知道如何看到模型的相同详细摘要?

奖金问题:RStudio是使用R的最佳控制台吗?

以下是一个例子:

>lprec <- make.lp(0,5) 

这使得一个名为lprec的新模型具有0个约束和5个变量。即使你现在叫这个名字,你也会得到:

>lprec
Model name: 
        C1    C2    C3    C4    C5    
Minimize     0     0     0     0     0    
Kind       Std   Std   Std   Std   Std    
Type      Real  Real  Real  Real  Real    
Upper      Inf   Inf   Inf   Inf   Inf    
Lower        0     0     0     0     0 

C列对应于5个变量。现在没有约束,目标函数是0.

您可以使用

添加约束
>add.constraint(lprec, c(1,3,4,2,-8), "<=", 0)

这是约束C1 + 3 * C2 + 4 * C3 + 2 * C4 - 8 * C5 <= 0.现在打印输出是:

Model name: 
            C1    C2    C3    C4    C5       
Minimize     0     0     0     0     0       
R1           1     3     4     2    -8  <=  0
Kind       Std   Std   Std   Std   Std       
Type      Real  Real  Real  Real  Real       
Upper      Inf   Inf   Inf   Inf   Inf       
Lower        0     0     0     0     0    

无论如何,重点是无论有多少约束,如果有超过9个变量,那么我就不会得到完整的打印。

>lprec <- make.lp(0,15)
>lprec
Model name:
    a linear program with 15 decision variables and 0 constraints

2 个答案:

答案 0 :(得分:6)

因为它是类lpExtPtr的S3对象, 被调用以显示它的函数是print.lpExtPtr。 如果检查其代码,您将看到它显示该对象 根据其大小不同 - 非常大的对象的细节不是很有用。 不幸的是,门槛无法改变。

class(r)
# [1] "lpExtPtr"
print.lpExtPtr
# function (x, ...) 
# {
# (...)
#     if (n > 8) {
#         cat(paste("Model name: ", name.lp(x), "\n", "  a linear program with ", 
#             n, " decision variables and ", m, " constraints\n", 
#             sep = ""))
#         return(invisible(x))
#     }
# (...)

您可以使用各种get.*函数访问对象的内容, 正如print方法那样。

或者,您只需更改print方法即可。

# A function to modify functions
patch <- function( f, before, after ) { 
  f_text <- capture.output(dput(f))
  g_text <- gsub( before, after, f_text )
  g <- eval( parse( text = g_text ) )
  environment(g) <- environment(f)
  g
}

# Sample data
library(lpSolveAPI)
r <- make.lp(0,5) 
r  # Shows the details
r <- make.lp(0,20) 
r  # Does not show the details

# Set the threshold to 800 variables instead of 8
print.lpExtPtr <- patch( print.lpExtPtr, "8", "800" )
r  # Shows the details

答案 1 :(得分:5)

将其写入文件进行检查

当我使用lpSolveAPI处理LP时,我更喜欢将它们写入文件。 lp 格式可以满足我的需求。然后我使用任何文本编辑器检查LP模型。如果你点击RStudio中“文件”面板中的输出文件,它也会打开它,你可以检查它。

 write.lp(lprec, "lpfilename.lp", "lp") #write it to a file in LP format

如果您愿意,也可以将其写为MPS格式。

以下是 write.lp()

上的帮助文件

希望有所帮助。