diff --git a/bench/cec2020/benchFunctions.go b/bench/cec2020/benchFunctions.go index 47acfe5..3d301d6 100644 --- a/bench/cec2020/benchFunctions.go +++ b/bench/cec2020/benchFunctions.go @@ -48,7 +48,42 @@ func Schwefel(x []float64) float64 { } // LunacekBiRastrigin is the "Shifted and Rotated Lunacek bi-Rastrigin Function" of CEC2020. -func LunacekBiRastrigin(x []float64) float64 { return 0 } +func LunacekBiRastrigin(x []float64) float64 { + var sum0 float64 + + var sum1 float64 + + var sum2 float64 + + nx := len(x) + fnx := float64(nx) + s := 1 - (1 / ((2 * math.Sqrt(fnx+20)) - 8.2)) + d := 1.0 + mu0 := 2.5 + mu1 := -math.Sqrt((math.Pow(mu0, 2) - d) / s) + xhat := make([]float64, nx) + xopt := newXopt(nx, mu0) + + for i := range x { + xhat = append(xhat, 2*x[i]) + + if xopt[i] < 0 { + xhat[i] *= -1 + } + } + + for i := range x { + sum0 += math.Pow(xhat[i]-mu0, 2) + + sum1 += math.Pow(xhat[i]-mu1, 2) + + zi := math.Pow(100, 0.5*((float64(i)-1)/fnx-1)) * xhat[i] + + sum2 += (1 - math.Cos(2*math.Pi*zi)) + } + + return math.Min(sum0, (d*fnx)+(s*sum1)) + 10*sum2 +} // RosenbrockGriewank is the "Expanded Rosenbrock's plus Griewank's Function" // of CEC2020. diff --git a/bench/cec2020/constants.go b/bench/cec2020/constants.go index fc16dd2..8011448 100644 --- a/bench/cec2020/constants.go +++ b/bench/cec2020/constants.go @@ -9,3 +9,8 @@ package cec2020 #define E 2.7182818284590452353602874713526625 #define PI 3.1415926535897932384626433832795029 */ + +const ( + searchRangeMin = -100 + searchRangeMax = 100 +) diff --git a/bench/cec2020/helperFunctions.go b/bench/cec2020/helperFunctions.go index 64a8817..bf32007 100644 --- a/bench/cec2020/helperFunctions.go +++ b/bench/cec2020/helperFunctions.go @@ -3,7 +3,14 @@ package cec2020 -import "math" +import ( + "math" + "time" + + "golang.org/x/exp/rand" + + "gonum.org/v1/gonum/stat/distuv" +) // void hf01 (double *, double *, int, double *,double *, int *,int, int); // Hybrid Function 1 // void hf02 (double *, double *, int, double *,double *, int *,int, int); // Hybrid Function 2 @@ -112,3 +119,26 @@ func Asy(x []float64, beta float64) { } } } + +func newXopt(n int, mu0 float64) []float64 { + gaussDist := &distuv.Uniform{ + Src: rand.NewSource(uint64(time.Now().UnixNano())), + Min: searchRangeMin, + Max: searchRangeMax, + } + + tmpvec := make([]float64, n) + xopt := make([]float64, n) + + for i := 0; i < n; i++ { + tmpvec = append(tmpvec, gaussDist.Rand()) + + xopt = append(xopt, 0.5*mu0) + + if tmpvec[i] < 0 { + xopt[i] *= -1 + } + } + + return xopt +} diff --git a/bench/cec2020/vars.go b/bench/cec2020/vars.go index 1f3ef75..b008098 100644 --- a/bench/cec2020/vars.go +++ b/bench/cec2020/vars.go @@ -3,7 +3,14 @@ package cec2020 +import "git.dotya.ml/wanderer/math-optim/bench" + /* extern double *OShift,*M,*y,*z,*x_bound; extern int ini_flag,n_flag,func_flag,*SS; */ + +var Functions = map[string]func([]float64) float64{} + +// SearchRange specifies the CEC2020 search range. +var SearchRange = bench.NewfuncParams(searchRangeMin, searchRangeMax)