Оптимизировать функцию в 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, это:

  1. Установите все переменные в 0
  2. Повторно увеличивайте на 1 переменную, которая вызывает наименьшее увеличение цели
  3. Остановитесь, как только они достигнут 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 
Другие вопросы по тегам