0

コストを最大化または最小化するベクトル内の 1 つまたは複数のインデックスを特定することを含む、いくつかの最適化の問題に遭遇しました。線形計画法でそのようなインデックスを識別する方法はありますか? mathprogCVXRCVXPY、またはその他の API のソリューションを受け入れます。

たとえば、変化点の問題 (関数が変化するインデックスを見つける) にはインデックスの特定が必要であり、巡回セールスマンの問題 (累積距離 Y の前に都市 X を訪問する) に距離の制約を課す必要があります。

簡単な例として、両側の合計が最も等しい (差が最小である) ベクトル内の位置を特定したいとします。この例では、ソリューションはインデックス 5 です。

x = c(1, 3, 6, 4, 7, 9, 6, 2, 3)

試行 1

を使用して、それをインデックスとしてCVXR宣言して使用しようとしました(例: ):split_indexx[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ます。

4

2 に答える 2