Использование lpSolve в R для минимизации абсолютных значений в целевой функции

Я хотел бы настроить линейную программу (если это возможно, я не уверен) для решения этой проблемы в R:

Я хочу свести к минимуму функцию:
abs(x1) + abs(x2) + abs(x3) + abs(x4)

Ограничения:
x1 + x2 + x3 + x4 = 0
0.2x1 + 0.3x2 + 0.5x3 + 0.1x4 = 0.2

Ограничения обычно записываются в виде неравенств, поэтому я предполагаю, что могу иметь по два уравнения каждого из них, одно с ‹= 0 и‹ = 0,2, а два других с ›= 0 и› = 0,2. Переменные решения являются непрерывными и могут быть положительными или отрицательными.

Я могу настроить матрицу ограничений для использования lpSolve, но меня больше всего смущает то, как реализовать функции абсолютного значения в целевой функции. Этот сайт (http://lpsolve.sourceforge.net/5.1/absolute.htm ) было хорошо прочитано, но я не уверен, как перевести это во входные данные для lpSolve в R. Любая помощь или руководство были бы очень признательны!


person Kevin    schedule 16.01.2021    source источник


Ответы (1)


Я отвечу на этот вопрос о том, как правильно смоделировать линейную программу с абсолютными значениями, чтобы любой решатель LP мог легко решить. Уловка состоит в том, чтобы ввести две вспомогательные переменные для каждой переменной, имеющей абсолютное значение. Например:

Введите переменные z (1, p) и z (1, n), где значения в скобках являются индексами для переменной z. 1 отмечает, что это соответствует x1, а p означает положительное, а n означает отрицательное. Добавьте эти ограничения:

z(1,p) - z(1,n) = x1

z(1,p) >= 0

z(1,n) >= 0

Посмотрите, что это делает: когда x1 положительно, тогда z (1, p) = x1 и z (1, n) = 0. Когда x1 отрицательно, то -z (1, n) = x1 и z (1, p) ) = 0. Таким образом, ясно, что abs (x1) = z (1, p) + z (1, n). Поэтому вам просто нужно заменить это в своей целевой функции и добавить эти ограничения (для каждого индекса 1, ..., 4).

person Mason    schedule 16.01.2021
comment
Ваше объяснение было действительно полезным! Спасибо! - person Kevin; 17.01.2021