2017-06-20 6 views
2

R(LPsolve)でLPを実行しようとしていますが、私の組み合わせのうちの1つが決して実行されるべきではありません。例えば、私は男性と女性を仲間にしようとしているのですが(人間ではありません:-))、関数の値を最大にするために(行列は以下「ランク」と呼ばれます)。しかし、男性の一人は女性の一人に完全な兄弟ですので、私はその仲間がこれまでに発生することは望んでいません(下記のマトリックスの男性1 &女性1)。私はすべての女性が交配された状態(つまり、制約条件)を欲し、すべての男性が2と2の交配(もう1つの制約)を持つようにしたい。私は[1,1]交配を本当に否定的にすることを試みましたが、それは助けになるかもしれませんが、私はそれが愚かな証拠であることを望みます。 NA、NULLなどを試しましたが、利用できません。事前に おかげで、私はあなたがデフォルト輸送問題の製剤を使用してその制約を定義することができるとは思わないR: "値のない" LPsolve(線形プログラミング)

rank <- matrix (0,3, 6) # matrix of males (rows) x females (columns) with the value to maximize for each combination 

for (i in 1:3) { 
for (j in 1:6) 
    { 
    rank[i,j] <-i*j 
    } 
} 


m <- NROW(rank) #number of males 
f <- NCOL(rank) # number of females 

row.signs <- c(rep("=", m)) 
row.rhs <- c(rep(2,m)) 
col.signs <- rep ("=", f) 
col.rhs <- c(rep(1,f)) 

lp.transport (rank, "max", row.signs, row.rhs, col.signs, col.rhs)$solution 

答えて

1

... は、私はあなたが手で輸送問題を定義してから除外制約を追加することをお勧め:

library(lpSolve) 
m <- 3 # n of males 
f <- 6 # n of females 
# rank matrix 
rank <- matrix(1:(m*f),nrow=m) 
# sibling exclusions (where the matrix is 1, we don't allow mating for that combination) 
# here we block male 1 with female 1 
exclusions <- matrix(0,nrow=m,ncol=f) 
exclusions[1,1] <- 1 
# transportation problem definition 
obj <- as.numeric(rank) 
nMalePerFemaleRhs <- rep(1,f) 
nMalePerFemaleSign <- rep("=",f) 
nMalePerFemaleConstr <- matrix(0,nrow=f,ncol=m*f) 
for(i in 1:f){ 
    nMalePerFemaleConstr[i,(i-1)*m+(1:m)] <- 1 
} 
nFemalePerMaleRhs <- rep(2,m) 
nFemalePerMaleSign <- rep("=",m) 
nFemalePerMaleConstr <- matrix(0,nrow=m,ncol=m*f) 
for(i in 1:m){ 
    nFemalePerMaleConstr[i,seq(from=i,length.out=f,by=m)] <- 1 
} 
# sibling exclusions constraint 
siblingConstr <- t(as.numeric(exclusions)) 
siblingRhs <- 0 
siblingSign <- '=' 

res <- lp(direction='max', 
      objective.in=obj, 
      const.mat = rbind(nMalePerFemaleConstr,nFemalePerMaleConstr,siblingConstr), 
      const.dir = c(nMalePerFemaleSign,nFemalePerMaleSign,siblingSign), 
      const.rhs = c(nMalePerFemaleRhs,nFemalePerMaleRhs,siblingRhs), 
      all.int = TRUE 
     ) 
solutionMx <- matrix(res$solution,nrow=m) 

結果:

> solutionMx 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 0 0 0 0 1 1 
[2,] 0 0 1 1 0 0 
[3,] 1 1 0 0 0 0 
+1

御馳走を働きました!非常に高く評価!!! –

関連する問題