rmpk优化中调用变量计算选中行对应矩阵列均值的实现问题
问题原因分析
你现有代码无法运行的核心原因有两点:
- 优化建模阶段的
x是符号变量对象,不是普通数值向量,R原生的mean、apply、sweep等函数只能处理数值类型数据,无法识别符号变量表达式,直接调用会报错。 - 你最初的写法将变量求和结果放在分母、嵌套使用
sum_expr且混用原生函数,不符合整数规划/数学规划建模的符号表达式书写规则,大部分求解器也不支持这种非线性的分式结构。
可行解决方案
首先明确你的需求逻辑:已经固定选中3行,因此被选行的列均值的分母是固定值k=3,不需要引入变量求和作为分母,可以直接将目标函数展开为符合符号运算规则的形式:
假设A的列数为p,你需要的列均值向量可表示为 (1/k) * sum(x[m] * A[m, ] for all m),代入目标函数展开后可得到纯二次的符号表达式,用支持二次规划的求解器即可正常求解。
示例代码如下(适配你使用的ompr建模包写法):
k <- 3 n <- nrow(A) p <- ncol(A) # 定义变量 x <- model$add_variable("x", type = "binary", i = 1:n) # 加固定选3行的约束 model$add_constraint(sum_expr(x[i], i = 1:n) == k) # 展开后的目标函数(根据你的需求调整sense为max/min) model$set_objective( (1/(k*p)) * sum_expr( A[m, j] * A[i, j] * x[m] * x[i], i = 1:n, m = 1:n, j = 1:p ), sense = "max" )
如果你的求解器不支持二次整数规划,可以通过引入辅助变量的方式将二次项线性化,同样可以实现目标。
关于sum_expr内获取变量值的问题
这种写法不可行。
建模阶段所有优化变量都只是符号占位符,没有实际取值,只有调用solve方法完成求解后,才能通过建模包提供的取值接口(如ompr的get_solution)拿到变量的实际计算结果。建模过程中所有涉及变量的运算都必须使用建模包提供的符号运算接口(如sum_expr)实现,不能和普通R数值处理函数混用。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

