2016-09-14 25 views
2

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を読んでいますが、理解することはできません。どんな助けでも大歓迎です。ありがとう!

+0

バイナリ変数にのみ可能です

感謝を。これは通常、凸最適化設定(混合整数、混合QP、混合QCPP、混合SOCP、一部の研究ソルバーのみが混合SDPを解くことができる)で行われます。非凸面の設定では、Couenne&Knitroよりもそれほど多くはありません(問題は非常に困難です)。 constrOptim/optimはこれを行うことはできません! lpSolveはMIPに対してのみこれを行うことができます。私はRに精通していないので、あなたの問題の凸面を理由に考えることはできません。しかし、X、Y、Zが変数(定数ではない)であれば、凸面に関しては悪く見えます! – sascha

+0

こんにちはSascha、 ありがとうございました。あなたの時間を感謝します。私は、さまざまな最適化設定にあまり慣れていません。アーウィンの応答に基づいて、lpSolveを使ってコード化し、モデルをフレームすることができました(1つの制約で苦労しています)。私は100万レコードでこれを実行しなければならないので、今は処理が心配ですが。私はそのようなデータを扱うことができるR以外のオプションを探す必要があるかもしれません。これについての考えは?ありがとう! – Rohit

答えて

0

私はこれが確かにMIPだと信じているので、凸凹に問題はありません。

enter image description here

このモデルは、簡単にLP/MIPソルバーは(NLPソルバではなく)目的と制約のための関数を使用していないR.注に転写することができます:私は正しいだ場合のようにモデルを見ることができます。 Rでは、典型的には、LP係数を有する行列を構築する。

注:私は50,60,40を使用した列合計の制限をもっと大きくする必要がありました。

+0

モデルを公式化してくれてありがとうございました。私はあなたの時間を感謝します。私は上記のほとんどを、Rの中のlpSolve(MIPソルバ)を使って書くことができます。xlim&ylim(上記の私の問題では4番目の制約)に制約を適用しようとしています。この制約は目的関数/値(X/Obj <= 0.35など)に依存するため、この制約をモデルに追加する方法はわかりません。私は以下のコードを共有しました。あなたがここから案内することができれば素晴らしいだろう。ありがとう! – Rohit

+0

変数wとzをモデルに追加してそれらを実行しました。 –

+0

最後に、4番目の制約をコード化することができます。ご協力いただきありがとうございます! – Rohit

0

アーウィンの応答に基づいて、私はモデルの中でlpSolveを使って定式化することができます。しかし、最終的な制約をモデルに追加するのはまだ難しいです(私の質問の4番目の制約)。ここでは、私がこれまでにコーディングすることができる午前何:フィニッシュラインに私を取得することができ

#input dimension 
r <- 10 
c <- 3 

#input matrices 
dt <- matrix(runif(r*c),r,c) 
wt <- matrix(c(1,0,0,0,2,0,0,0,1),3,3) #weights 

#column controller 
c.limit <- c(60,50,70) 

#create structure for lpSolve 
ncol <- r*c 
lp.create <- make.lp(ncol=ncol) 
set.type(lp.create, columns=1:ncol, type = c("binary")) 

#create objective values 
obj.vals <- as.vector(t(dt%*%wt)) 
set.objfn(lp.create, obj.vals) 
lp.control(lp.create,sense='max') 

#Add constraints to ensure sum of parameters for every row (rowSum) <= 1 
for (i in 1:r){ 
add.constraint(lp.create, xt=c(1,1,1), 
      indices=c(3*i-2,3*i-1,3*i), rhs=1, type="<=") 
} 

#Add constraints to ensure sum of parameters for every column (colSum) <= column limit (defined above) 
for (i in 1:c){ 
add.constraint(lp.create, xt=rep(1,r), 
      indices=seq(i,ncol,by=c), rhs=c.limit[i], type="<=") 
} 

#Add constraints to ensure sum of column objective (t((dt%*%wt)[,i])%*%P[,i) <= limits defined in the problem) 
#NOT SURE HOW TO APPLY A CONSTRAINT THAT IS DEPENDENT ON THE OBJECTIVE FUNCTION 

solve(lp.create) 
get.objective(lp.create) #20 
final.par <- matrix(get.variables(lp.create), ncol = c, byrow=T) # Reshape 

すべてのヘルプははるかに高く評価される:)ソルバはこれらをサポートしている場合

関連する問題