math-optim/bench/cec2020/benchFunctions.go

269 lines
6.8 KiB
Go
Raw Normal View History

2023-02-01 23:26:37 +01:00
// Copyright 2023 wanderer <a_mirre at utb dot cz>
// SPDX-License-Identifier: GPL-3.0-or-later
package cec2020
2023-02-06 21:48:55 +01:00
import "math"
2023-02-01 23:26:37 +01:00
// void sphere_func (double *, double *, int , double *,double *, int, int); // Sphere
// void ellips_func(double *, double *, int , double *,double *, int, int); // Ellipsoidal
// void bent_cigar_func(double *, double *, int , double *,double *, int, int); // Discus
// void discus_func(double *, double *, int , double *,double *, int, int); // Bent_Cigar
// void dif_powers_func(double *, double *, int , double *,double *, int, int); // Different Powers
// void rosenbrock_func (double *, double *, int , double *,double *, int, int); // Rosenbrock's
// void schaffer_F7_func (double *, double *, int , double *,double *, int, int); // Schwefel's F7
// void ackley_func (double *, double *, int , double *,double *, int, int); // Ackley's
// void rastrigin_func (double *, double *, int , double *,double *, int, int); // Rastrigin's
// void weierstrass_func (double *, double *, int , double *,double *, int, int); // Weierstrass's
// void griewank_func (double *, double *, int , double *,double *, int, int); // Griewank's
// void schwefel_func (double *, double *, int , double *,double *, int, int); // Schwefel's
// void katsuura_func (double *, double *, int , double *,double *, int, int); // Katsuura
// void bi_rastrigin_func (double *, double *, int , double *,double *, int, int); // Lunacek Bi_rastrigin
// void grie_rosen_func (double *, double *, int , double *,double *, int, int); // Griewank-Rosenbrock
// void escaffer6_func (double *, double *, int , double *,double *, int, int); // Expanded Schaffer's F6
// void step_rastrigin_func (double *, double *, int , double *,double *, int, int); // Noncontinuous Rastrigin's
// void happycat_func (double *, double *, int , double *,double *, int, int); // HappyCat
// void hgbat_func (double *, double *, int , double *,double *, int, int); // HGBat
//
// // New functions Noor Changes
// void sum_diff_pow_func(double *, double *, int , double *,double *, int, int); // Sum of different power
// void zakharov_func(double *, double *, int , double *,double *, int, int); // ZAKHAROV
// void levy_func(double *, double *, int , double *,double *, int, int); // Levy
// void dixon_price_func(double *, double *, int , double *,double *, int, int); // Dixon and Price
// BentCigar is the "Bent Cigar Function" of CEC2020.
2023-02-06 21:48:55 +01:00
func BentCigar(x []float64) float64 {
var sum float64
for i := 1; i < len(x); i++ {
sum += math.Pow(x[i], 2)
}
return (1000000 * sum) + math.Pow(x[0], 2)
}
// Schwefel is the "Shifted and Rotated Schwefel's Function" of CEC2020.
2023-02-06 23:26:19 +01:00
func Schwefel(x []float64) float64 {
return SchwefelModified(x)
}
// LunacekBiRastrigin is the "Shifted and Rotated Lunacek bi-Rastrigin Function" of CEC2020.
// ref: https://al-roomi.org/benchmarks/unconstrained/n-dimensions/229-lunacek-s-bi-rastrigin-function.
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.
func RosenbrockGriewank(x []float64) float64 {
var sum float64
nx := len(x)
for i := range x {
f := []float64{x[i], x[(i+1)%nx]}
sum += Griewank([]float64{Rosenbrock(f)})
}
return 0
}
// Hybrid1 is the "Hybrid Function 1" of CEC2020.
2023-02-07 23:33:00 +01:00
func Hybrid1(x []float64) float64 {
nx := len(x)
fnx := float64(nx)
funcs := []func([]float64) float64{
SchwefelModified,
Rastrigin,
HighConditionedElliptic,
2023-02-07 23:33:00 +01:00
}
// percentages used to control the amount of contribution of each func.
p := []float64{0.3, 0.3, 0.4}
gnx := getGnx(p, fnx)
2023-02-07 23:33:00 +01:00
z := newOpt(nx)
mz := getMz(x, z)
2023-02-07 23:33:00 +01:00
var sum float64
2023-02-07 23:33:00 +01:00
for i := range funcs {
sum += funcs[i](mz) * gnx[i]
}
2023-02-07 23:33:00 +01:00
return sum
2023-02-07 23:33:00 +01:00
}
// Hybrid2 is the "Hybrid Function 2" of CEC2020.
2023-02-08 01:13:30 +01:00
func Hybrid2(x []float64) float64 {
nx := len(x)
fnx := float64(nx)
funcs := []func([]float64) float64{
SchafferExpanded,
HGBat,
Rosenbrock,
SchwefelModified,
}
// percentages used to control the amount of contribution of each func.
p := []float64{0.2, 0.2, 0.3, 0.3}
gnx := getGnx(p, fnx)
z := newOpt(nx)
mz := getMz(x, z)
var sum float64
for i := range funcs {
sum += funcs[i](mz) * gnx[i]
}
return sum
}
// Hybrid3 is the "Hybrid Function 3" of CEC2020.
2023-02-08 01:14:33 +01:00
func Hybrid3(x []float64) float64 {
nx := len(x)
fnx := float64(nx)
funcs := []func([]float64) float64{
SchafferExpanded,
HGBat,
Rosenbrock,
SchwefelModified,
HighConditionedElliptic,
}
// percentages used to control the amount of contribution of each func.
p := []float64{0.1, 0.2, 0.2, 0.2, 0.3}
gnx := getGnx(p, fnx)
z := newOpt(nx)
mz := getMz(x, z)
var sum float64
for i := range funcs {
sum += funcs[i](mz) * gnx[i]
}
return sum
}
// Composition1 is the "Composition Function 1" of CEC2020.
2023-02-08 02:06:28 +01:00
func Composition1(x []float64) float64 {
nx := len(x)
fnx := float64(nx)
// optimum positions.
o := newOpt(nx)
sigma := []float64{10, 20, 30}
lambda := []float64{1, 10, 1}
bias := []float64{0, 100, 200}
omega := make([]float64, nx)
funcs := []func([]float64) float64{
Rastrigin,
Griewank,
SchwefelModified,
}
var sum float64
var weights []float64
for i := range funcs {
wi := getWeight(x, o, sigma[i], fnx)
weights = append(weights, wi)
var wsum float64
for j := range weights {
wsum += weights[j]
}
omega = append(omega, wi/wsum)
sum += (omega[i] * (lambda[i]*funcs[i](x) + bias[i])) + funcs[i](x)
}
return sum
}
// Composition2 is the "Composition Function 2" of CEC2020.
2023-02-08 02:09:07 +01:00
func Composition2(x []float64) float64 {
nx := len(x)
fnx := float64(nx)
// optimum positions.
o := newOpt(nx)
sigma := []float64{10, 20, 30, 40}
lambda := []float64{10, 1e-6, 10, 1}
bias := []float64{0, 100, 200, 300}
omega := make([]float64, nx)
funcs := []func([]float64) float64{
Ackley,
HighConditionedElliptic,
Griewank,
Rastrigin,
}
var sum float64
var weights []float64
for i := range funcs {
wi := getWeight(x, o, sigma[i], fnx)
weights = append(weights, wi)
var wsum float64
for j := range weights {
wsum += weights[j]
}
omega = append(omega, wi/wsum)
sum += (omega[i] * (lambda[i]*funcs[i](x) + bias[i])) + funcs[i](x)
}
return sum
}
// Composition3 is the "Composition Function 3" of CEC2020.
func Composition3(x []float64) float64 { return 0 }