R中的全局约束优化规范

时间:2016-02-18 12:47:02

标签: r linear-programming

我正在尝试在R中设置全局约束优化。

实验数据可能看起来像

set.seed(123)
data.frame(main.goal = abs(rnorm(100)),
                     minor.goal.1 = abs(rnorm(100)),
                     minor.goal.2 = abs(rnorm(100))) -> d2optim

mean(sort(d2optim$minor.goal.1,
                    decreasing = TRUE)[1:20]) -> minor.goal.1.treshhold
mean(sort(d2optim$minor.goal.2,
                    decreasing = TRUE)[1:20]) -> minor.goal.2.treshhold

我想找到20行的索引(ind

修改

  • 最大化mean(d2optim$main.goal[ind])
  • mean(d2optim$minor.goal.1[ind]) >= 0.3 minor.goal.1.treshhold
  • mean(d2optim$minor.goal.2[ind]) >= 0.5 minor.goal.2.treshhold

结束编辑

有没有办法使用任何线性编程包(如lpSolve)而不是网格检查每个$ \ choose {100,20} $配置然后将它们排序?像

all_configuration_of_indexes <- combn(100, 20) # doesn't fit in RAM
for( i in 1:length(all_configuration_of_indexes) ) {
   i <- all_configuration_of_indexes[[i]]
   if ( mean(d2optim$minor.goal.1[i]) >= 0.3 minor.goal.1.treshhold &
        mean(d2optim$minor.goal.2[i]) >= 0.5 minor.goal.2.treshhold) {
      res[[i]] <- mean(d2optim$major.goal[i])
   } else {
      res[[i]] <- 0
   }
}
res[[which(max(unlist(res) = unlist(res))]]

我正在寻找100行的最佳子集,它给出了1个变量的最大平均值,但是其余2个变量的平均值不小于0.3 * minor.goal.1.treshhold nor 0.5 * minor.goal.2.treshhold

2 个答案:

答案 0 :(得分:3)

您可以通过以下方式实现此目的:

# create an index withe the row meeting condition 2 and 3
idx <- d2optim$minor.goal.1 >= 0.3*minor.goal.1.treshhold & d2optim$minor.goal.2 >= 0.5*minor.goal.2.treshhold

# get the index of rownmubers with the highest values for the `main.goal` variable
rownames(d2optim[idx,][order(-d2optim2$main.goal),][1:20,])

它为您提供符合条件的rownumber的索引:

[1] "97"  "44"  "57"  "98"  "95"  "43"  "29"  "46"  "100" "64"  "74"  "19"  "36"  "75"  "1"   "15"  "20"  "48"  "31"  "13" 

因为您现在有一个mail.goal值最高的行索引,它也符合其他两个条件,这意味着这些值的平均值也会最大化。

答案 1 :(得分:3)

我不是线性编程的专家,也不知道如何在R中实现它,但这就是我的想法。我将其视为整数线性规划问题,模拟如下:

x1,...,x100 - 逻辑(即0到1之间的整数)变量,其中xi表示我们是否采用第i行数据。

目标函数:

x1 * d2optim $ main.goal [1] + ... + x100 * d2optim $ main.goal [100] - &gt;最大

约束:

0&lt; = x1,..,。 x100 <= 1

x1 + ... + x100 = 20

x1 * d2optim $ minor.goal.1 [1] + ... + x100 * d2optim $ minor.goal.1 [100]&gt; = c1

x1 * d2optim $ minor.goal.2 [1] + ... + x100 * d2optim $ minor.goal.2 [100]&gt; = c2

而不是意味着我们可以在任何地方获取总和,c1,c2足以满足您的问题规范。