2016-07-13 41 views
0

Ich versuche, eine Simulation eines linearen Programmierproblems zu tun. Das Modell verfügt über eine obj-Funktion und einige Einschränkungen. In diesem Fall führe ich 2 Werte ein, die zufällig aus der Normalverteilung gezogen werden.Schleife durch eine Reihe von Elementen in R

Ich simuliere dann das Optimierungsmodell 10.000 Mal mit einer For-Schleife. Ich weiß, dass es schlecht ist, For-Schleifen zu verwenden, aber in diesem Fall geht es mir nicht um Geschwindigkeit.

#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) 

Wie oben zu sehen ist, wird meine Schleife nur Trog eine Variable (Performance) gehen, wo ich den Anforderungswert für Zeile (i) in der Nachfrage Vektor will, zugleich setzte in das Modell werden, wie Leistungswert für die Zeile (i) im Leistungsvektor. Das Gesamtziel ist es, 10.000 Simulationen des LP - Modells zu haben, wobei sowohl die Leistungswerte, als auch die Bedarfswerte nur einmal vorkommen (als eine andere Schleife außerhalb der bereits vorhandenen), wird das kartesische Produkt der zwei Listen).

Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Beachten Sie, dass Ihre Vektoren Performance und Demand genau die gleiche Anzahl an Elementen enthalten. Folglich können Sie einfach einfach die Vektorindizes durchlaufen und die entsprechenden Indexwerte verwenden, um die relevanten Elemente zu extrahieren.

Ich kann Ihren Beispielcode nicht ausführen, da ich nicht sicher bin, welches Optimierungspaket Sie für Ihre OP-Funktion verwenden. Als Beispiel werde ich eine einfache dummyFunction definieren, die eine Leistungs- und Bedarfswert als Eingabe wie folgt:

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

In Ihrem speziellen Anwendungsfall wäre die dummyFunction die Optimierungslogik enthalten. Als nächstes können Sie die gewünschte Lösung wie folgt durch Iterieren über die Vektorindizes erhalten:

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

Alternativ können Sie nur durch Platzieren Sie Ihre Optimierungslogik innerhalb der for Schleife die Funktionsdefinition vermeiden. Für eine „R wie Lösung“ betrachten die Verwendung von sapply/lapply Typ Funktionen:

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

Beachten Sie, dass Sie in diesem Beispiel auch die folgenden nur tun konnte:

Optimas <- dummyFunction(Performance, Demand) 

Wenn schließlich Leistung wird zu einem Problem. Verwenden Sie die Pakete foreach und doparallel, um die Optimierungen für mehrere Kerne gleichzeitig auszuführen:

+0

Danke für die Antwort :-) verwendet ROI-Paket für die Optimierung – MikeR

0

Betrachten Sie eine mapply() Ansatz, die Funktion anwenden, die auf mehrere Listen/Vektoren iteriert entsprechende Elemente. Umbrechen Sie zuerst alle Operationen in einer Funktion und rufen Sie sie dann in mapply() auf, indem Sie zwei Argumente für die Vektoren übergeben. Am Ende verwenden Sie eine lapply(), um zu einer langen Liste von Datenrahmen zu transponieren, die mit do.call(rbind...) verknüpft sind.

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)