使用添加到某个值的整数输入向量优化 R 中的函数
Optimize a function in R with integer input vector which adds to a certain value
我在 R fun
中有一个函数 returns 决策向量的成本 x
。函数的输入是一个长度为 40 的整数向量。给定输入向量 a
、b
和 c
(长度也是 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 的方法是:
- 将所有变量设置为 0
- 将objective
中引起最小增加的变量重复加1
- 总和为 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
我在 R fun
中有一个函数 returns 决策向量的成本 x
。函数的输入是一个长度为 40 的整数向量。给定输入向量 a
、b
和 c
(长度也是 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 的方法是:
- 将所有变量设置为 0
- 将objective 中引起最小增加的变量重复加1
- 总和为 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