R 如何生成案例的独特组合以最大化一个价值,同时最小化另一个价值?

R 如何生成案例的独特组合以最大化一个价值,同时最小化另一个价值?,r,function,statistics,combinations,R,Function,Statistics,Combinations,我目前正在尝试编写一些代码,我希望这些代码能够为类似这样的数据完成两件事(大约100次观察): Lines如果问题是在货币总额大于或等于某个已知常数M的情况下,找到误差总和最小化的行子集,则可将其表示为0-1整数线性规划问题: 最小化误差'x受金钱影响'x>=M,x是0和1的向量 就R代码而言: library(lpSolve) M <- 4000000 res <- lp("min", DF$error, t(DF$money), ">=", M, all.bin = TRU

我目前正在尝试编写一些代码,我希望这些代码能够为类似这样的数据完成两件事(大约100次观察):


Lines如果问题是在货币总额大于或等于某个已知常数M的情况下,找到误差总和最小化的行子集,则可将其表示为0-1整数线性规划问题:

最小化误差'x受金钱影响'x>=M,x是0和1的向量

就R代码而言:

library(lpSolve)
M <- 4000000
res <- lp("min", DF$error, t(DF$money), ">=", M, all.bin = TRUE)

res
## Success: the objective function is 0.96 

DF$key[res$solution == 1]
## [1] 7223 7256
N通过切割平面的最佳可行解决方案

N个最佳可行解决方案的另一种可能性是,对于第i个解决方案,通过添加排除它们的约束,切断第一个i-1解决方案,然后重新运行:

res <- list(objval = 0)
N <- 3 # no of solutions desired

for(i in 1:N) {
  res <- lp("min", DF$error, rbind(DF$money, DF$error), ">=", c(M, res$objval * 1.0001), 
           all.bin = TRUE)
  print(res)
  print(DF$key[res$solution == 1])
}
需要注意的是,该方法只返回多个值中的一个,即给出相同目标值(或目标值彼此非常接近)的可行解。例如,如果有两个组合的目标值均为0.96,则循环的第一次迭代将找到其中一个,第二次迭代将查找大于等于0.96*1.0001的目标值,因此它将从进一步考虑中消除这两个组合

注:可复制形式的输入
DF

Lines <- "   key     error   money
1 7224 0.5500000 2483118
2 7223 0.5200000 2451469
3 7222 1.6600000 2425693
4 7247 0.6400000 2324070
5 7256 0.4400000 1785569
6 7248 0.2541168 1476720"
DF <- read.table(text = Lines)

Lines如果问题是在货币总额大于或等于某个已知常数M的情况下,找到误差总和最小化的行子集,则可将其表示为0-1整数线性规划问题:

最小化误差'x受金钱影响'x>=M,x是0和1的向量

就R代码而言:

library(lpSolve)
M <- 4000000
res <- lp("min", DF$error, t(DF$money), ">=", M, all.bin = TRUE)

res
## Success: the objective function is 0.96 

DF$key[res$solution == 1]
## [1] 7223 7256
N通过切割平面的最佳可行解决方案

N个最佳可行解决方案的另一种可能性是,对于第i个解决方案,通过添加排除它们的约束,切断第一个i-1解决方案,然后重新运行:

res <- list(objval = 0)
N <- 3 # no of solutions desired

for(i in 1:N) {
  res <- lp("min", DF$error, rbind(DF$money, DF$error), ">=", c(M, res$objval * 1.0001), 
           all.bin = TRUE)
  print(res)
  print(DF$key[res$solution == 1])
}
需要注意的是,该方法只返回多个值中的一个,即给出相同目标值(或目标值彼此非常接近)的可行解。例如,如果有两个组合的目标值均为0.96,则循环的第一次迭代将找到其中一个,第二次迭代将查找大于等于0.96*1.0001的目标值,因此它将从进一步考虑中消除这两个组合

注:可复制形式的输入
DF

Lines <- "   key     error   money
1 7224 0.5500000 2483118
2 7223 0.5200000 2451469
3 7222 1.6600000 2425693
4 7247 0.6400000 2324070
5 7256 0.4400000 1785569
6 7248 0.2541168 1476720"
DF <- read.table(text = Lines)

行不同的键如何组合?相应的错误和金钱是如何组合的?或者说“键的组合”是指“键的值”@Gregor我想到的是,组合将是由
key
的各种情况组合,其
错误
金钱
的总和将最小化和最大化以设置阈值@哲远里谢谢你的提示!我已经开始看
combn
,这绝对是最好的起点。我怀疑我将不得不使用它的
FUN=x
部分来做我想做的事情。如果你在SO或互联网上搜索,有几个软件包可以帮你解决这个问题。不同的密钥是如何组合的?相应的错误和金钱是如何组合的?或者说“键的组合”是指“键的值”@Gregor我想到的是,组合将是由
key
的各种情况组合,其
错误
金钱
的总和将最小化和最大化以设置阈值@哲远里谢谢你的提示!我已经开始看
combn
,这绝对是最好的起点。我怀疑我将不得不使用它的
FUN=x
部分来做我想做的事情。如果你在SO或互联网上搜索,有几个软件包可以帮你解决这个问题。基本上就是这样——我很欣赏这说明的清晰性。我的目的不是找到行的子集,而是找到行的各种可能组合,以便对这些
key
组合进行选择。尽管如此,这是一个惊人的开始,就像@Gregor所说的,因为我不知道正确的术语(线性规划)。请参阅文章中添加的其他信息。基本上就是这样-我很欣赏这说明的清晰性。我的目的不是找到行的子集,而是找到行的各种可能组合,以便对这些
key
组合进行选择。然而,这是一个惊人的开始,就像@Gregor所说的,因为我不知道正确的术语(线性规划)。