R 中的全局约束优化规范
Global constrained optimization specification in R
我正在尝试在 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
您可以通过以下方式实现:
# 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,])
它为您提供了符合您条件的行号的索引:
[1] "97" "44" "57" "98" "95" "43" "29" "46" "100" "64" "74" "19" "36" "75" "1" "15" "20" "48" "31" "13"
因为您现在有一个具有最高值的行索引 mail.goal
也满足其他两个条件,这意味着这些值的平均值也被最大化。
我不是线性规划方面的专家,也不知道如何在 R 中实现它,但这就是我的想法。我将其视为建模如下的整数线性规划问题:
x1, ..., x100 - 逻辑(即 0 到 1 之间的整数)变量,其中 xi 表示我们是否采用第 i 行数据。
objective 函数:
x1*d2optim$main.goal[1] + ... + x100*d2optim$main.goal[100] -> 最大值
约束条件:
0 <= x1,..,. x100 <= 1
x1 + ... + x100 = 20
x1*d2optim$minor.goal.1[1] + ... + x100*d2optim$minor.goal.1[100] >= c1
x1*d2optim$minor.goal.2[1] + ... + x100*d2optim$minor.goal.2[100] >= c2
我们可以在任何地方求和而不是均值,c1、c2 是足以满足您的问题规范的常量。
我正在尝试在 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
您可以通过以下方式实现:
# 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,])
它为您提供了符合您条件的行号的索引:
[1] "97" "44" "57" "98" "95" "43" "29" "46" "100" "64" "74" "19" "36" "75" "1" "15" "20" "48" "31" "13"
因为您现在有一个具有最高值的行索引 mail.goal
也满足其他两个条件,这意味着这些值的平均值也被最大化。
我不是线性规划方面的专家,也不知道如何在 R 中实现它,但这就是我的想法。我将其视为建模如下的整数线性规划问题:
x1, ..., x100 - 逻辑(即 0 到 1 之间的整数)变量,其中 xi 表示我们是否采用第 i 行数据。
objective 函数:
x1*d2optim$main.goal[1] + ... + x100*d2optim$main.goal[100] -> 最大值
约束条件:
0 <= x1,..,. x100 <= 1
x1 + ... + x100 = 20
x1*d2optim$minor.goal.1[1] + ... + x100*d2optim$minor.goal.1[100] >= c1
x1*d2optim$minor.goal.2[1] + ... + x100*d2optim$minor.goal.2[100] >= c2
我们可以在任何地方求和而不是均值,c1、c2 是足以满足您的问题规范的常量。