我在R中使用lpsolveAPI,并希望为指定的列和行设置系数(指定约束数和决策变量数的系数)。
然而,虽然我可以添加新列(新决策变量)或设置现有列,但我无法编辑该列,因为该选项将删除该列中的所有先前系数。
例如,让它成为5个约束和2个决策变量。然后:
SQL> GRANT GLOBAL QUERY REWRITE to mydbdba;
SQL> CREATE MATERIALIZED VIEW customers_mw ENABLE QUERY REWRITE
AS
SELECT COUNT(*) c,state_id FROM sg.customers GROUP BY state_id;
SQL> alter session set QUERY_REWRITE_ENABLED=TRUE;
Session altered.
SQL> SELECT COUNT(*) c,state_id FROM sg.customers GROUP BY state_id;
Execution Plan
Plan hash value: 799451518
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 52 | 364 | 3 (0)| 00:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| CUSTOMERS_MW | 52 | 364 | 3 (0)| 00:00:01 |
SQL> alter session set QUERY_REWRITE_ENABLED=FALSE;
Session altered.
SQL> SELECT COUNT(*) c,state_id FROM sg.customers GROUP BY state_id;
Execution Plan
Plan hash value: 1577413243
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 52 | 156 | 327 (1)| 00:00:01 |
| 1 | HASH GROUP BY | | 52 | 156 | 327 (1)| 00:00:01 |
| 2 | TABLE ACCESS FULL| CUSTOMERS | 50000 | 146K| 326 (1)| 00:00:01 |
该模型如下所示:
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))
现在我想为第4和第5个约束添加系数。
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
代码将重写模型,因为set.column函数将函数参数中未列出的所有系数设置为0。
for (i in seq(1,2)) set.column(lps.model, i, c(4,5), indices = c(4,5))
我有一个很大的约束和决策变量矩阵,需要为不同的变量集运行相似的循环。有没有办法编辑现有列而不重写它们?
答案 0 :(得分:1)
您可以使用set.mat
来一次设置A矩阵中的值。请参阅此处的help。
例如:
> set.mat(lps.model, 4,5,3)
将第4行,第5列的值设为3,而不覆盖其他任何内容。因此,您可以在双循环内调用set.mat
并更改单个值。
但是,如果您可以一次创建整列(预处理以创建系数列表),然后使用lps.model
一次性将它们添加到set.column
,效率会更高因为你说你有一个大的决策变量矩阵。