Я столкнулся с несколькими проблемами оптимизации, которые связаны с определением одного или нескольких индексов в векторе, который максимизирует или минимизирует стоимость. Есть ли способ идентифицировать такие показатели в линейном программировании? Я открыт для решений в mathprog
, CVXR
, CVXPY
или любом другом API.
Например, определение индекса требуется для проблем с точкой изменения (найдите индекс, в котором функция изменения), накладывая ограничения на расстояние для задачи коммивояжера (посетите город X до совокупного расстояния Y).
В качестве простого примера предположим, что мы хотим определить положение в векторе, где сумма с обеих сторон является наиболее равной (их разница наименьшая). В этом примере решением является индекс 5:
x = c(1, 3, 6, 4, 7, 9, 6, 2, 3)
Попытка 1
Используя CVXR
, я попытался объявить split_index
и использовать это как индекс (например, x[1:split]
):
library(CVXR)
split_index = Variable(1, integer = TRUE)
objective = Minimize(abs(sum(x[1:split_index]) - sum(x[(split_index+1):length(x)])))
result = solve(objective)
Он ошибается 1:split_index
с NA/NaN argument
.
Попытка 2
Объявить явный вектор-индекс (indices
) и выполнить поэлементно логический тест, есть ли split_index <= indices
. Затем поэлементно умножьте этот двоичный вектор на x
, чтобы выбрать одну или другую сторону разделения:
indices = seq_along(x)
split_index = Variable(1, integer = TRUE)
is_first = split_index <= indices
objective = Minimize(abs(sum(x * is_first) - sum(x * !is_first)))
result = solve(objective)
Он ошибается в x * is_first
на non-numeric argument to binary operator
. Я подозреваю, что эта ошибка возникает из-за того, что is_first
теперь является объектом IneqConstraint
.