jogo hat geschrieben: ↑Mo Jan 28, 2019 3:24 pm
Eine Optimierung im Sinne von geringst mögliche Anzahl von Kisten pro Gruppe ist ein recht ordentliches Problem der Zahlentheorie.
packeKisten2 <- function(Vol) {
if (any(Vol>volumen_kiste)) { message("ein Teil ist zu groß"); stop() }
n <- length(Vol)
Kiste <- integer(n)
ksum <- 0; k <- 1
for (i in 1:n) {
Kiste[i] <- k; ksum <- ksum+Vol[i]
if (i==n) break
if ((ksum + Vol[i+1]) > volumen_kiste) { k <- k+1; ksum <- 0} ## neue Kiste
}
Kiste
}
Übrigens: ifelse() gehört zu den langsamen Funktionen (besonders, wenn man gar nicht mit Vektoren arbeitet).
Gruß, Jörg
etwas schneller als deine andere Funktion, aber noch deutlich langsamer als die for-Schleife.
zwecks ifelse: ich arbeite mit Vektoren, das habe ich nur der Einfachheit halber weggelassen. Meine ifelse Funktion überprüft die Werte aus einem separaten Vektor und schreibt auch die Ergebnisse in separate Vektoren.
jogo hat geschrieben: ↑Mo Jan 28, 2019 3:57 pm
Hallo Alex,
kannst Du bitte mal schreiben, wieviele Zeilen Dein Dataframe hat. Wieviele Zeilen sind durchschnittlich in einer Gruppe?
Bei meiner ersten Variante ist cumsum() der Bremser, wenn der Vektor sehr lang ist und die Anzahl der Teile pro Kiste klein.
Gruß, Jörg
AlexWue hat geschrieben: ↑Mo Jan 28, 2019 3:52 pm
das funktioniert, ist aber leider langsamer als mein aktueller Code. Dennoch danke!
Mit den "apply" Packages habt ihr nicht zufällig Erfahrung?
Hallo Jörg,
es sind ca. 4 Millionen Zeilen, meine for-Schleife mit Vektorisierung braucht etwa 16 Sekunden (ohne Vektorisierung mehrere Tage).
Gruppen sind es ca. 200.000, also durchschnittlich 20 Zeilen pro Gruppe.