2016-12-07 10 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의 정의에서 마지막 줄이 제약 사를 대표하지 생각 : 0,1,1,1가 + w_2 + w_3 W_1에 해당합니다. 대신 0,1,0,0이어야합니다. [w_1> 0] \\ 0,0,1,0 [w_2> 0] \\ 0,0,0,1 [w_3> 0] – Cettt

+0

안녕하세요 @Cettt 네, 제 조건이 잘못되었습니다, 그것을 지적 해 주셔서 감사합니다. – forecaster

답변

1

여기에 루프를 사용하는 하나의 가능성이 있습니다.

내가 언급 한 바와 같이, 조건 (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)) 
} 

은} 지금까지 내가 무 \에 해당하는 첫 번째 열을 무시했다. 나는이 두 가지 간단한 라인을 추가 :

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

주를 처음 n f.cond 내 매트릭스 + 1 개 라인이 제약에 대응 (3)과 (4)!

+0

코드의 첫 번째 과거를 실행할 때'Rep (1, n)에 오류가 발생했습니다 : 잘못된 '시간'인수 '가 잘못되었습니다. – forecaster

+0

죄송합니다, 첫번째 줄은 다음과 같아야합니다 : n <- nrow (a) n <- dim (a), 어리석은 실수 – Cettt

+0

감사합니다. 이제 작동합니다. +1 – forecaster

3

개정 된 제약 조건 4를 포함하도록 업데이트되었으며 사소한 코드가 개선되었습니다.

질문의 제약 조건 행렬이 맞다고 가정하면이 요소는 combn을 사용하여 해당 요소를 설정하는 모든 i< j에 대해 반복합니다. x[1]i의 값이고 x[2]j의 값이 f입니다. make_cons은 질문에 표시된 순서대로 제약 조건 행렬을 반환하지만 rbind 행의 make_consrbind(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