Seite 1 von 1

Argumente mit Parametern in package cmaes

Verfasst: Mi Dez 04, 2019 6:25 pm
von smnsstah
Hallo R-Cummunity,

heute wollte ich das CRAN-Package cmaes, ganauer gesagt die Funktion, cma_es, zur Anwendung des CMAES-Optimierungsverfahrens benutzen, kenne mich aber nicht allzu sehr mit R aus und hatte dabei einige Schwierigkeiten.

Die zu verwendende Funktion sieht so aus, wobei control hier irrelevant ist:

cma_es(par, fn, ..., lower, upper, control=list())

Die entsprechende Dukumentation steht in https://cran.r-project.org/web/packages/cmaes/cmaes.pdf

Mit dieser Funktion würde ich gerne die zweidimensionale Funktion f(x,y) = x^2-cos(5*y^3)+y^2 als fn, mit den Startparametern (0, 0) als par und den Grenzen {-10,10} als lower und upper auswerten, habe es aber nicht geschafft, die Parameter und Funktion richtig zu implementieren, wobei es für eindimensionale Funktionen noch geklappt hat.

Zuletzt habe ich es mit
cma_es(par = 0, fn = f1(c(par, par)), lower = -10, upper = 10, control = list(maxit = 100, mu = 2, lambda =2))
versucht, dies hat aber offensichtlich nicht geklappt, ich habe jetzt stundenlang verschiedene Varianten probiert und die Dokumentation untersucht, aber keine Lösung gefunden, deshalb hoffe ich dass ihr mir helfen könnt in der Hoffnung, dass ich etwas simples übersehen habe, auch wenn es um ein etwas exotischeres Package geht.

Mit freundlichen Grüßen,
Niklas

Re: Argumente mit Parametern in package cmaes

Verfasst: Mi Dez 04, 2019 7:37 pm
von Athomas
Ohne das Ergebnis geprüft zu haben, das läuft und wirft etwas aus:

Code: Alles auswählen

library(cmaes)
f <- function(vektor)  vektor[1]^2-cos(5*vektor[2]^3)+vektor[2]^2
cma_es(par = c(0,0), f, lower = c(-10,-10), upper = c(10,10), control = list(maxit = 10000, mu = 2, lambda =2))
Wenn ich nicht selbst mal mit einer Optimierungsfunktion in R gehadert hätte, würde ich jetzt furchtbar ablästern - von wegen erst mal Beschreibung lesen und so :lol: ...

Re: Argumente mit Parametern in package cmaes

Verfasst: Mi Dez 04, 2019 9:31 pm
von smnsstah
Danke, dein Lösung funktioniert.
Habe auch mit etwas ähnlichem angefangen, so dumm bin ich auch nicht, aber da wohl einen dummen Fehler gemacht und in die falsche Richtung iteriert, wie peinlich