1

我在 R 中使用 lpsolveAPI 并想为指定的列和行设置系数(指定约束编号和决策变量编号的系数)。

但是,虽然我可以添加新列(新决策变量)或设置现有列,但我无法编辑该列,因为该选项将删除该列中所有先前的系数。

例如,假设为 5 个约束和 2 个决策变量。然后:

lps.model <- make.lp(5, 2) #create lp model
#set coefficients for the first 3 constraint for both variables
for (i in seq(1,2)) set.column(lps.model, i, c(1,2,3), indices = c(1,2,3)) 

该模型如下所示:

Model name: 
            C1    C2    C3    C4         
Minimize     0     0     0     0         
R1           1     1     0     0  free  0
R2           2     2     0     0  free  0
R3           3     3     0     0  free  0
R4           0     0     0     0  free  0
R5           0     0     0     0  free  0
Kind       Std   Std   Std   Std         
Type      Real  Real  Real  Real         
Upper      Inf   Inf   Inf   Inf         
Lower        0     0     0     0  

现在我想为第 4 个和第 5 个约束添加系数。

for (i in seq(1,2)) set.column(lps.model, i, c(4,5), indices = c(4,5))

代码将重写模型,因为 set.column 函数将函数参数中未列出的所有系数设置为 0。

Model name: 
            C1    C2         
Minimize     0     0         
R1           0     0  free  0
R2           0     0  free  0
R3           0     0  free  0
R4           4     4  free  0
R5           5     5  free  0
Kind       Std   Std         
Type      Real  Real         
Upper      Inf   Inf         
Lower        0     0 

我有一个很大的约束和决策变量矩阵,需要为不同的变量集运行类似的循环。有没有办法在不重写现有列的情况下编辑它们?

4

1 回答 1

1

您可以使用set.mat它一次在 A 矩阵中设置一个值。请参阅此处的帮助

例如:

> set.mat(lps.model, 4,5,3)

将使第 4 行第 5 列的值为 3,而不会覆盖其他任何内容。因此,您可以set.mat在双循环中调用并更改单个值。

但是,如果您可以一次创建整个列(预处理以创建系数列表)然后将它们添加到lps.model一个镜头中,set.column特别是因为您说您有一个很大的决策变量矩阵,那么效率会更高。

于 2015-08-04T17:57:50.250 回答