2つの入力行列dt(10,3)& wt(3,3)があり、目的行列を最大にするために最適な決定行列(同じ次元)、Par(10,3)を見つける必要があります。関数。 Rコードの下には問題(ここで使用するサンプル・インプット)に、いくつかの方向性を与えるだろう -線形最適化でバイナリ制約を扱うには?
#Input Matrices
dt <- matrix(runif(300),100,3)
wt <- matrix(c(1,0,0,0,2,0,0,0,1),3,3) #weights
#objective function
Obj <- function(Par) {
P = matrix(Par, nrow = 10, byrow=F) # Reshape
X = t((dt%*%wt)[,1])%*%P[,1]
Y = t((dt%*%wt)[,2])%*%P[,2]
Z = t((dt%*%wt)[,3])%*%P[,3]
as.numeric(X+Y+Z) #maximize
}
今、私が問題に次の制約を適用するために苦労しています:
1) Matrix, Par can only have binary values (0 or 1)
2) rowSums(Par) = 1 (Basically a row can only have 1 in one of the three columns)
3) colSums(Par[,1]) <= 5, colSums(Par[,2]) <= 6, & colSums(Par[,3]) <= 4
4) X/(X+Y+Z) < 0.35, & Y/(X+Y+Z) < 0.4 (X,Y,Z are defined in the objective function)
私は制約をコード化しようとしましたconstrOptimですが、バイナリ&の整数制約を入力する方法がわかりません。私はlpSolveを読んでいますが、理解することはできません。どんな助けでも大歓迎です。ありがとう!
バイナリ変数にのみ可能です
感謝を。これは通常、凸最適化設定(混合整数、混合QP、混合QCPP、混合SOCP、一部の研究ソルバーのみが混合SDPを解くことができる)で行われます。非凸面の設定では、Couenne&Knitroよりもそれほど多くはありません(問題は非常に困難です)。 constrOptim/optimはこれを行うことはできません! lpSolveはMIPに対してのみこれを行うことができます。私はRに精通していないので、あなたの問題の凸面を理由に考えることはできません。しかし、X、Y、Zが変数(定数ではない)であれば、凸面に関しては悪く見えます! – sascha
こんにちはSascha、 ありがとうございました。あなたの時間を感謝します。私は、さまざまな最適化設定にあまり慣れていません。アーウィンの応答に基づいて、lpSolveを使ってコード化し、モデルをフレームすることができました(1つの制約で苦労しています)。私は100万レコードでこれを実行しなければならないので、今は処理が心配ですが。私はそのようなデータを扱うことができるR以外のオプションを探す必要があるかもしれません。これについての考えは?ありがとう! – Rohit