R Солвер для комбинаций - PullRequest
       12

R Солвер для комбинаций

0 голосов
/ 07 ноября 2018

У меня есть фрейм данных, который содержит десятичные числа в 5 столбцах. Попробуйте представить это как файл Excel. Для каждого столбца я нахожу сумму. Я приведу пример ниже:

enter image description here

Проблема в том, что я хочу сохранить оптимальные линии / наблюдения, которые они будут:

  • Имейте индивидуальную сумму, максимально приближенную к 0 - для col1, col2 и col3
  • И одновременно col4 и col5 для суммирования (опять же по отдельности) ближе к (скажем, 3).

Пример создан со случайной выборкой, поэтому он не содержит отрицательных чисел, но я привел его в качестве примера.

Я думаю, что проблемы этого случая решаются с помощью Солвера в R. Я хотел бы найти код, который решает вышеуказанную проблему.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Я думаю, что есть два очевидных способа сделать это.

Я запишу математические модели, которые сделают более формальной мою интерпретацию вашей проблемы.

Квадратичная формулировка

Первый - это метод наименьших квадратов .Пусть

x(i) = 1 if row i is selected
       0 otherwise

Тогда мы можем написать:

min sum(j, w(j)*d(j)^2)
    d(j) = sum(i, a(i,j)*x(i)) - t(j)
    d(j) : free variable (can be substituted out if wanted)

где

    t(j) : target sum for column j (0 and 3 in your example)
    w(j) : weight for column j  (choose 1 if there is no good reason to use something else)
    a(i,j) : your data matrix (or data frame)

Это называется моделью MIQP (смешанное целочисленное квадратичное программирование).Существуют решатели MIQP для R.

Линейная формулировка

Вместо наименьших квадратов мы можем выбрать наименьших абсолютных отклонений .Модель высокого уровня может выглядеть следующим образом:

min sum(j, w(j)*|d(j)|)
    d(j) = sum(i, a(i,j)*x(i)) - t(j)
    d(j) : free variable (can be substituted out if wanted)

Чтобы сделать эту модель MIP (Mixed Integer Programming) правильной, нам нужно сделать все линейным.Одна из возможных формулировок:

min sum(j, w(j)*y(j))
    d(j) = sum(i, a(i,j)*x(i)) - t(j)
    -y(j) <= d(j) <= y(j)  (we can write this as two inequalities)
    d(j) : free variable 
    y(j) >= 0  (positive variable)

Существует множество решателей MIP, доступных для использования с R.

0 голосов
/ 07 ноября 2018

Я использовал ранее пакет lpSolve с функцией lp для решения задач линейного программирования с ограничениями. Это будет легко настроить, так как у вас, похоже, нет многих ограничений. Однако, поскольку это одна целевая функция, вам необходимо определить целевую функцию, вероятно, как минимальную разность суммы ваших двух ветвей (читай: Колы от 1 до 3 и Колы от 4 до 5).

Потенциально были бы другие методы, но этот должен быть довольно простым.

Надеюсь, это поможет.

Привет

...