Оптимизировать функцию в R с целочисленным входным вектором, который добавляет к определенному значению
У меня есть функция в R fun
который возвращает стоимость вектора решения x
, Входными данными для функции является целочисленный вектор длиной 40. Заданные входные векторы a
, b
, а также c
(также длиной 40), функция определяется как:
fun <- function(x) sum(pmax(a, b, c*x))
Сумма входного вектора должна быть 80. Я хочу узнать входной вектор Vec
где fun(Vec)
сводится к минимуму Я предполагаю, что это довольно простая проблема, но я теряюсь с того, с чего начать, учитывая, что я новичок в задачах оптимизации в R.
1 ответ
Это проблема с 40 целочисленными переменными решения, x_1, x_2, ..., x_40. Способ оптимального определения того, как установить их так, чтобы ваша цель была минимизирована, а их сумма составляла 80, это:
- Установите все переменные в 0
- Повторно увеличивайте на 1 переменную, которая вызывает наименьшее увеличение цели
- Остановитесь, как только они достигнут 80.
(Я вижу, что Эрвин опубликовал несколько часов назад решение с той же идеей)
Это может быть легко реализовано в R. Во-первых, давайте настроим образцы входных векторов:
set.seed(144)
n <- 40
wanted.sum <- 80
A <- rnorm(n, 10, 1)
B <- rnorm(n, 10, 1)
C <- rnorm(n, 10, 1)
Далее, давайте рассчитаем добавочную стоимость добавления элементов с номерами от 1 до 80 для каждой из наших 40 переменных:
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