2016-07-13 6 views
0

선형 프로그래밍 문제를 시뮬레이션하려고합니다. 모델에는 obj 함수와 일부 제약 조건이 있습니다. 이 경우 정규 분포에서 무작위로 그린 2 개의 값을 도입하려고합니다.Loop Trough R 항목의 집합

그런 다음 for 루프를 사용하여 최적화 모델 10.000 번을 시뮬레이션합니다. 나는 for-loops를 사용하는 것이 좋지 않다는 것을 알고 있지만,이 경우에는 속도가 내 관심사가 아닙니다.

#List of 10000 random, normally distributed observations: 
Demand = rnorm(10000, mean=5, sd=2.5) 
Demand 

Performance = rnorm(10000, mean=100, sd=6) 
Performance 

Optimas = NULL 

#combined_list = c(Demand, Performance) 

for (i in Performance){ 
    op <- OP(objective = c(2.5, 4, i),    #Performance value[i]: works fine 
      L_constraint(L = matrix(c(1, 0, 0,  #LHS 
             0, 1, 0,  
             0, 0, 1),  
             ncol=3, nrow = 3, 
             byrow = TRUE), 
          dir = c("<=", "<=", "<="), 
          rhs = c(50, 70, Demand)), #Demand value[i]: should go here 
       maximum = TRUE, 
       types = c("B", "I", "I")) 

    Optima <- ROI_solve(op, solver = "glpk") #solve 
    print(Optima) 
    print(i) 
    Optimas = rbind(Optimas, Optima) 
} 


Optimas <- as.data.frame(Optimas) 
Optimas$objval <- as.numeric(Optimas$objval) 
hist(Optimas$objval) 

위에서 볼 수 있듯이, 내 루프는 같은 시간과 같은에서, 내가 모델에 투입되는 수요 벡터 행 (I)에 대한 수요 값을 원하는 저점 하나 개의 변수 (성능), 이동 않습니다 성능 벡터의 row (i)에 대한 성능 값.

전반적인 목표는 LP 모델의 10.000 시뮬레이션을하는 것입니다. 성능 값뿐만 아니라 수요 값도 한 번만 발생합니다. (이미 가지고있는 다른 루프가 아닌 다른 루프가 두 가지 목록).

도움을 주시면 감사하겠습니다.

답변

1

PerformanceDemand 벡터에는 정확히 동일한 수의 요소가 포함되어 있습니다. 결과적으로 벡터 인덱스를 반복하고 관련 인덱스 값을 사용하여 관련 요소를 추출 할 수 있습니다.

OP 함수에 어떤 최적화 패키지를 사용하고 있는지 잘 모르기 때문에 예제 코드를 실행할 수 없습니다. 다음과 같은 예를 들어, 내가 입력으로 성능과 요구 값을 사용하는 간단한 dummyFunction을 정의합니다 :

dummyFunction <- function(perf, dem){ return (perf+dem)} 

을 특정 사용의 경우, dummyFunction은 최적화 로직을 포함한다. 다음과 같이 다음, 당신은 벡터 인덱스 반복하여 필요한 솔루션을 얻을 수 있습니다

Optimas = vector(mode="numeric", length=length(Performance)) 
for(idx in 1:length(Performance)){ 
    Optimas[idx] <- dummyFunction(Performance[idx], Demand[idx]) 
} 

또는, 당신은 단지 for 루프 내에서 최적화 로직을 배치하여 함수 정의를 방지 할 수 있습니다. 경우,

Optimas <- dummyFunction(Performance, Demand) 

마지막 :이 특정 예에서 당신은 또한 단지 다음을 수행 할 수 있음을

Optimas <- sapply(1:length(Performance), function(idx) dummyFunction(Performance[idx], Demand[idx])) 

참고 :보다 "솔루션 등의 R"를 ​​ 는 sapply/lapply 형 기능의 사용을 고려 성능이 문제가되는 경우 및 doparallel 패키지를 사용하여 동시에 여러 코어의 최적화를 실행하는 것이 좋습니다.

+0

답변 주셔서 감사합니다 .-) 최적화를 위해 ROI 패키지 사용 – MikeR

0

mapply() 접근 방식을 고려하면 해당 요소를 전달하는 여러 목록/벡터를 반복하는 apply 함수입니다. 먼저 함수에서 모든 연산을 래핑 한 다음 벡터에 대해 두 개의 인수를 전달하는 mapply()에서 호출합니다. 마지막으로 lapply()을 사용하여 do.call(rbind...)으로 행 바인드 된 긴 데이터 프레임 목록으로 조 변경하십시오.

Performance = rnorm(10000, mean=100, sd=6) 
Demand = rnorm(10000, mean=5, sd=2.5) 

optimizefct <- function(p, d){ 
    op <- OP(objective = c(2.5, 4, p),    # Performance 
      L_constraint(L = matrix(c(1, 0, 0,  # LHS 
            0, 1, 0,  
            0, 0, 1),  
            ncol=3, nrow = 3, 
            byrow = TRUE), 
         dir = c("<=", "<=", "<="), 
         rhs = c(50, 70, d)),  # Demand 
      maximum = TRUE, 
      types = c("B", "I", "I")) 

    Optima <- ROI_solve(op, solver = "glpk") #solve 
    print(Optima) 
    print(i) 

    return(Optima) 
} 

# WIDE FORMAT 
dfList <- mapply(optimizefct, Performance, Demand) 

# LONG FORMAT 
dfList <- lapply(1:10000, function(i) data.frame(dfList[,i])) 

# BIND TO FINAL DF 
Optimas <- do.call(rbind, dfList) 
Optimas$objval <- as.numeric(Optimas$objval)