使用添加到某个值的整数输入向量优化 R 中的函数

Optimize a function in R with integer input vector which adds to a certain value

我在 R fun 中有一个函数 returns 决策向量的成本 x。函数的输入是一个长度为 40 的整数向量。给定输入向量 abc(长度也是 40),函数定义为:

fun <- function(x) sum(pmax(a, b, c*x))

输入向量的总和需要为 80。我想找出一个输入向量 Vec,其中 fun(Vec) 被最小化。我假设这是一个相当简单的问题,但我不知道从哪里开始,因为我是 R 中优化问题的新手。

这是一个有 40 个 integer-valued 个决策变量的问题,x_1,x_2,...,x_40。一种最佳确定如何设置它们以使 objective 最小化并且它们总和为 80 的方法是:

  1. 将所有变量设置为 0
  2. 将objective
  3. 中引起最小增加的变量重复加1
  4. 总和为 80 时停止。

(我看到Erwin几个小时前发了一个解决方案,思路一样)

这可以在 R 中轻松实现。首先,让我们设置样本输入向量:

set.seed(144)
n <- 40
wanted.sum <- 80
A <- rnorm(n, 10, 1)
B <- rnorm(n, 10, 1)
C <- rnorm(n, 10, 1)

接下来,让我们为 40 个变量中的每一个计算添加项目编号 1 到 80 的增量成本:

inc.cost <- expand.grid(var=factor(1:n), num=1:80)
inc.cost$cost <- with(inc.cost, pmax(A[var], B[var], C[var]*num) -
                                pmax(A[var], B[var], C[var]*(num-1)))
table(head(inc.cost$var[order(inc.cost$cost)], wanted.sum))
#  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 
#  1  1  1  1  1  2  1  2  1  2  1  1  2  1  2 29  1  1  1  2  1  1  1  1  2  1  1  1  2  1  1  2  1  1  2  2  2 
# 38 39 40 
#  1  1  1