4

我在 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
4

2 回答 2

6

由于它是类的 S3 对象lpExtPtr,因此调用来显示它的函数是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
于 2013-07-12T13:43:55.957 回答
5

将其写入文件以供检查

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

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

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

这是关于write.lp().

希望有帮助。

于 2013-07-12T17:31:41.590 回答