2016-12-07 75 views
3

lpsolveパッケージを使用してRで線形計画問題を解決しようとしています。私がどのような場合には、小さな問題のために、手動でこの問題を解決することができるよlpsolveを使用したRの線形プログラミング

library("lpSolve") 
a <- matrix(c(1,2,5, 
       1/2,1,3, 
       1/5,1/3,1),nrow=3,byrow=T) 

# 
f.obj <- c(1,0,0,0) 

f.con <- matrix (c(
    1,1,-a[1,2],0, #Contraint 1 for a12 
    1,-1,a[1,2],0, #Contraint 2 for a12 
    1,1,0,-a[1,3], #Contraint 1 for a13 
    1,-1,0,a[1,3], #Contraint 2 for a13 
    1,0,1,-a[2,3], #Contraint 1 for a23 
    1,0,-1,a[2,3], #Contraint 2 for a23 
    0,1,1,1, #Contraint 3 
    0,1,0,0, #Constraint 4 
    0,0,1,0, #Constraint 4 
    0,0,0,1 #Constraint 4 

), nrow=10, byrow=TRUE) 

f.dir <- c(rep("<=",6), "=",rep(">",3)) 

f.rhs <- c(rep(1,6),1,rep(0,3)) 

g <- lp ("max", f.obj, f.con, f.dir, f.rhs) 
g$solution 

ここenter image description here

が再現例えばRのサンプルである:ここで

が問題です私は 7 X 7または n x n行列 aを持っていました。 12という制約をどのように指定するのですか?特に、私は[i、j]に関連する制約を定義するのに苦労していますか?

a = matrix( 
    c(1,4,9,6,6,5,5, 
    1/4,1,7,5,5,3,4, 
    1/9,1/7,1,1/5,1/5,1/7,1/5, 
    1/6,1/5,5,1,1,1/3,1/3, 
    1/6,1/5,5,1,1,1/3,1/3, 
    1/5,1/3,7,3,3,1,2, 
    1/5,1/4,5,3,3,1/2,1 
),nrow = 7,byrow =T) 

上記のマトリックスに対する解は、0.986 0.501 0.160 0.043 0.060 0.060 0.1 0.075です。何か助けがあれば幸いです。

+0

こんにちは、 は、私はあなたがf.conの定義の最後の行が制約4を表していないと思う: 0,1,1,1はW_1 + W_2 + w_3に対応しています。 代わりに0,1,0,0、[w_1> 0] \\ 0,0,1,0 [w_2> 0] \\ 0,0,0,1 [w_3> 0] – Cettt

+0

こんにちは@Cetttはい、私は条件4を間違っています、それを指摘していただきありがとうございます。 – forecaster

答えて

1

ここではforループを使用する可能性があります。

私が言いましたように、条件(4)が間違っていると思います。ここに私の提案があります。 私は最初に制約(4)、次に制約(3) の行列を設定してから、制約(2)と(1)をループに追加します。最初は、\ muに対応する列は考慮しないことに注意してください。私は最後にこの列を追加します。

n<- nrow(a) 
f.cons<- diag(n) 
f.cons<- rbind(f.cons, rep(1,n)) 

これは、制約(4)(最初のn行)と制約(3)に対応する行列を設定します。ここでは、ループとコマンドrbindを使用して、この行列に行を追加します。

for(i in 1:(n-1)){ 
    for(j in (i+1): n){ 
    x<- rep(0, n) 
    x[i]<- 1 #x corresponds to (1) 
    x[j]<- -a[i,j] 
    y<- -x #y corresponds to (2) 
    f.cons<- rbind(f.cons, rbind(x, y)) 
} 

}はこれまでのところ、私はムーを\に対応する第1の列を無視しています。私の行列内の最初のn + 1行制約(3)及び(4)に対応f.condこと

f.cons<- cbind(rep(1, nrow(f.cons)), f.cons) 
f.cons[1:(n+1), 1]=0 

注 私は、これらの2本の単純な線でそれを追加します!

+0

私はあなたのコードの最初の過去を実行すると、私は 'Rep(1、n)でエラーが発生しました:無効な '時間'引数'ここで何が間違っているのか分かりません。 – forecaster

+0

申し訳ありませんが、最初の行は次のとおりです。n < - nrow(a)n < - dim(a)、ばかげた間違い – Cettt

+0

ありがとうございます。それは今働く。 +1 – forecaster

3

改訂された制約4を組み込むように更新され、マイナーコードが改善されました。

問題の制約行列が正しいと仮定すると、これはcombnを使用して、適切な要素を設定するすべての要素に対して反復処理を行います。 x[1]iの値であり、x[2]jの値がfであることに注意してください。 make_consは、問題に示されているのと同じ順序で制約行列を返しますが、のrbind行をrbind(cons1, cons2, cons3, cons4)に簡略化することができます。

make_cons <- function(a) { 
    n <- nrow(a) 
    f <- function(x) replace(numeric(n), x, c(1, -a[x[1], x[2]])) 
    cons1 <- cbind(1, t(combn(1:n, 2, f))) 
    cons2 <- cbind(1, -cons1[, -1]) 
    cons3 <- c(0, rep(1, n)) 
    cons4 <- cbind(0, diag(n)) 
    rbind(t(matrix(rbind(t(cons1), t(cons2)), ncol(cons1))), cons3, cons4) 
} 

# test 

# a and f.con from question 

a <- matrix(c(1, 0.5, 0.2, 2, 1, 0.333333333333333, 5, 3, 1), 3) 
f.con <- matrix(c(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 0, 
    1, 1, 0, 0, -2, 2, 0, 0, 1, -1, 1, 0, 1, 0, 0, 0, -5, 5, -3, 
    3, 1, 0, 0, 1), 10) 

all.equal(f.con, make_cons(a), check.attributes = FALSE) 
## [1] TRUE 
+0

+1非常に効率的なコード。私は制約4でエラーを作りました。これは私の質問/例で今変更されました。 cons4は 'cons4 < - cbind(0、diag(n))'です。再度ありがとう – forecaster

+0

応答のおかげで、私は非常によく似た質問がありますhttp://stackoverflow.com/questions/41027092/linear-goal-programming-in-r-unable-to-find-solutions。私はあなたの反応に感謝します。 – forecaster

関連する問題