22 PUBLIC :: quadratic_exponential
24 PUBLIC :: steep_valley
25 PUBLIC :: steep_valley2
28 PUBLIC :: oscillatory_parabola
29 PUBLIC :: cosine_combo
33 PUBLIC :: fletcher_powell_helical_valley
36 PUBLIC :: powell_badly_scaled
37 PUBLIC :: box_3dimensional
38 PUBLIC :: variably_dimensioned
42 PUBLIC :: brown_badly_scaled
43 PUBLIC :: brown_dennis
45 PUBLIC :: trigonometric
46 PUBLIC :: ext_rosenbrock_parabolic_valley
47 PUBLIC :: ext_powell_singular_quartic
51 PUBLIC :: leon_cubic_valley
52 PUBLIC :: gregory_karney_tridia_matrix
61 PUBLIC :: goldstein_price_polynomial
63 PUBLIC :: shekel_sqrn5
64 PUBLIC :: shekel_sqrn7
65 PUBLIC :: shekel_sqrn10
66 PUBLIC :: six_hump_camel_back_polynomial
70 PUBLIC :: bohachevsky1
71 PUBLIC :: bohachevsky2
72 PUBLIC :: bohachevsky3
73 PUBLIC :: colville_polynomial
80 PUBLIC :: sphere_model
95 PUBLIC :: sphere_model_2d
96 PUBLIC :: axis_parallel_hyper_ellips_2d
97 PUBLIC :: rotated_hyper_ellipsoid_2d
98 PUBLIC :: rosenbrock_2d
99 PUBLIC :: rastrigin_2d
100 PUBLIC :: schwefel_2d
101 PUBLIC :: griewank_2d
102 PUBLIC :: power_sum_2d
104 PUBLIC :: michalewicz_2d
105 PUBLIC :: drop_wave_2d
106 PUBLIC :: deceptive_2d
126 public :: ackley_objective, griewank_objective,
eval_dummy
156 function quadratic( x )
160 real(dp),
dimension(:),
intent(in) :: x
161 real(dp) :: quadratic
163 if (
size(x,1) .gt. 1_i4) stop
'quadratic: Input has to be array of size 1'
164 quadratic = ( x(1) - 2.0_dp ) * ( x(1) - 2.0_dp ) + 1.0_dp
166 end function quadratic
200 function quadratic_exponential( x )
204 real(dp),
dimension(:),
intent(in) :: x
205 real(dp) :: quadratic_exponential
207 if (
size(x,1) .gt. 1_i4) stop
'quadratic_exponential: Input has to be array of size 1'
208 quadratic_exponential = x(1) * x(1) + exp( - x(1) )
210 end function quadratic_exponential
244 function quartic( x )
248 real(dp),
dimension(:),
intent(in) :: x
251 if (
size(x,1) .gt. 1_i4) stop
'quartic: Input has to be array of size 1'
252 quartic = ( ( x(1) * x(1) + 2.0_dp ) * x(1) + 1.0_dp ) * x(1) + 3.0_dp
300 function steep_valley( x )
304 real(dp),
dimension(:),
intent(in) :: x
305 real(dp) :: steep_valley
307 if (
size(x,1) .gt. 1_i4) stop
'steep_valley: Input has to be array of size 1'
308 steep_valley = exp( x(1) ) + 0.01_dp / x(1)
310 steep_valley = steep_valley + 0.0009877013_dp
312 end function steep_valley
349 function steep_valley2( x )
353 real(dp),
dimension(:),
intent(in) :: x
354 real(dp) :: steep_valley2
356 if (
size(x,1) .gt. 1_i4) stop
'steep_valley2: Input has to be array of size 1'
357 steep_valley2 = exp( x(1) ) - 2.0_dp * x(1) + 0.01_dp / x(1) - 0.000001_dp / x(1) / x(1)
359 end function steep_valley2
394 function dying_snake(x)
398 real(dp),
dimension(:),
intent(in) :: x
399 real(dp) :: dying_snake
401 if (
size(x,1) .gt. 1_i4) stop
'dying_snake: Input has to be array of size 1'
402 dying_snake = ( x(1) + sin( x(1) ) ) * exp( - x(1) * x(1) )
404 dying_snake = dying_snake + 0.8242393985_dp
406 end function dying_snake
449 function thin_pole(x)
456 real(dp),
dimension(:),
intent(in) :: x
457 real(dp) :: thin_pole
459 if (
size(x,1) .gt. 1_i4) stop
'thin_pole: Input has to be array of size 1'
461 thin_pole = - 10000.0_dp
463 thin_pole = 3.0_dp * x(1) * x(1) + 1.0_dp + ( log( ( x(1) -
pi_dp ) * ( x(1) -
pi_dp ) ) ) /
pi_dp**4
466 end function thin_pole
500 function oscillatory_parabola(x)
504 real(dp),
dimension(:),
intent(in) :: x
505 real(dp) :: oscillatory_parabola
507 if (
size(x,1) .gt. 1_i4) stop
'oscillatory_parabola: Input has to be array of size 1'
508 oscillatory_parabola = x(1) * x(1) - 10.0_dp * sin( x(1) * x(1) - 3.0_dp * x(1) + 2.0_dp )
510 oscillatory_parabola = oscillatory_parabola + 9.9779149346_dp
512 end function oscillatory_parabola
566 function cosine_combo(x)
570 real(dp),
dimension(:),
intent(in) :: x
571 real(dp) :: cosine_combo
573 if (
size(x,1) .gt. 1_i4) stop
'cosine_combo: Input has to be array of size 1'
574 cosine_combo = cos( x(1) ) &
575 + 5.0_dp * cos( 1.6_dp * x(1) ) &
576 - 2.0_dp * cos( 2.0_dp * x(1) ) &
577 + 5.0_dp * cos( 4.5_dp * x(1) ) &
578 + 7.0_dp * cos( 9.0_dp * x(1) )
580 cosine_combo = cosine_combo + 14.6771885214_dp
582 end function cosine_combo
614 real(dp),
dimension(:),
intent(in) :: x
617 if (
size(x,1) .gt. 1_i4) stop
'abs1: Input has to be array of size 1'
618 abs1 = 1.0_dp + abs( 3.0_dp * x(1) - 1.0_dp )
646 function r8_aint( x )
654 if ( x < 0.0_dp )
then
655 val = -int( abs( x ) )
657 val = int( abs( x ) )
695 subroutine normal_01_sample ( x )
702 integer(i4),
save :: iset = -1
706 real(dp),
save :: xsave = 0.0_dp
708 if ( iset == -1 )
then
713 if ( iset == 0 )
then
715 call random_number ( harvest = v1 )
717 if (
le(v1,0.0_dp) )
then
718 write ( *,
'(a)' )
' '
719 write ( *,
'(a)' )
'NORMAL_01_SAMPLE - Fatal error!'
720 write ( *,
'(a)' )
' V1 <= 0.'
721 write ( *,
'(a,g14.6)' )
' V1 = ', v1
725 call random_number ( harvest = v2 )
727 if (
le(v2,0.0_dp) )
then
728 write ( *,
'(a)' )
' '
729 write ( *,
'(a)' )
'NORMAL_01_SAMPLE - Fatal error!'
730 write ( *,
'(a)' )
' V2 <= 0.'
731 write ( *,
'(a,g14.6)' )
' V2 = ', v2
735 x = sqrt( - 2.0_dp * log( v1 ) ) * cos( 2.0_dp *
pi_dp * v2 )
737 xsave = sqrt( - 2.0_dp * log( v1 ) ) * sin( 2.0_dp *
pi_dp * v2 )
749 end subroutine normal_01_sample
782 function fletcher_powell_helical_valley(x)
790 real(dp) :: fletcher_powell_helical_valley
792 real(dp),
dimension(:),
intent(in) :: x
794 if ( 0.0_dp < x(1) )
then
795 th = 0.5_dp * atan( x(2) / x(1) ) /
pi_dp
796 else if ( x(1) < 0.0_dp )
then
797 th = 0.5_dp * atan( x(2) / x(1) ) /
pi_dp + 0.5_dp
798 else if ( 0.0_dp < x(2) )
then
800 else if ( x(2) < 0.0_dp )
then
807 fletcher_powell_helical_valley = 100.0_dp * ( x(3) - 10.0_dp * th )**2 &
808 + 100.0_dp * ( sqrt( x(1) * x(1) + x(2) * x(2) ) - 1.0_dp )**2 &
811 end function fletcher_powell_helical_valley
837 function biggs_exp6(x)
844 real(dp) :: biggs_exp6
847 real(dp),
dimension(:),
intent(in) :: x
853 c = - real( i, dp ) / 10.0_dp
855 fi = x(3) * exp( c * x(1) ) - x(4) * exp( c * x(2) ) &
856 + x(6) * exp( c * x(5) ) - exp( c ) &
857 + 5.0_dp * exp( 10.0_dp * c ) - 3.0_dp * exp( 4.0_dp * c )
859 biggs_exp6 = biggs_exp6 + fi * fi
863 end function biggs_exp6
898 real(dp),
dimension(:),
intent(in) :: x
905 y(1:15) = (/ 0.0009_dp, 0.0044_dp, 0.0175_dp, 0.0540_dp, 0.1295_dp, &
906 0.2420_dp, 0.3521_dp, 0.3989_dp, 0.3521_dp, 0.2420_dp, &
907 0.1295_dp, 0.0540_dp, 0.0175_dp, 0.0044_dp, 0.0009_dp /)
914 t = - 0.5_dp * x(2) * &
915 ( 3.5_dp - 0.5_dp * real( i - 1, dp ) - x(3) )**2
916 if ( t .lt. -709._dp )
then
919 t = x(1) * exp( t ) - y(i)
922 gaussian = gaussian + t * t
926 end function gaussian
959 function powell_badly_scaled(x)
965 real(dp) :: powell_badly_scaled
968 real(dp),
dimension(:),
intent(in) :: x
970 f1 = 10000.0_dp * x(1) * x(2) - 1.0_dp
971 f2 = exp( - x(1) ) + exp( - x(2) ) - 1.0001_dp
973 powell_badly_scaled = f1 * f1 + f2 * f2
975 end function powell_badly_scaled
1005 function box_3dimensional(x)
1012 real(dp) :: box_3dimensional
1015 real(dp),
dimension(:),
intent(in) :: x
1017 box_3dimensional = 0.0_dp
1021 c = - real( i, dp ) / 10.0_dp
1023 fi = exp( c * x(1) ) - exp( c * x(2) ) - x(3) * &
1024 ( exp( c ) - exp( 10.0_dp * c ) )
1026 box_3dimensional = box_3dimensional + fi * fi
1030 end function box_3dimensional
1063 function variably_dimensioned(x)
1069 real(dp) :: variably_dimensioned
1073 real(dp),
dimension(:),
intent(in) :: x
1078 f1 = f1 + real( i, dp ) * ( x(i) - 1.0_dp )
1083 f2 = f2 + ( x(i) - 1.0_dp )**2
1086 variably_dimensioned = f1 * f1 * ( 1.0_dp + f1 * f1 ) + f2
1088 end function variably_dimensioned
1143 real(dp),
dimension(:),
intent(in) :: x
1152 s1 = s1 + real( j - 1, dp ) * d * x(j)
1153 d = d * real( i, dp ) / 29.0_dp
1160 d = d * real( i, dp ) / 29.0_dp
1163 watson = watson + ( s1 - s2 * s2 - 1.0_dp )**2
1167 watson = watson + x(1) * x(1) + ( x(2) - x(1) * x(1) - 1.0_dp )**2
1218 function penalty1(x)
1222 real(dp),
dimension(:),
intent(in) :: x
1223 real(dp) :: penalty1
1226 real(dp),
parameter :: ap = 0.00001_dp
1231 t1 = - 0.25_dp + sum( x(1:n)**2 )
1233 t2 = sum( ( x(1:n) - 1.0_dp )**2 )
1235 penalty1 = ap * t2 + t1 * t1
1237 end function penalty1
1294 function penalty2(x)
1300 real(dp),
parameter :: ap = 0.00001_dp
1302 real(dp) :: penalty2
1310 real(dp),
dimension(:),
intent(in) :: x
1319 t1 = t1 + real( n - j + 1, dp ) * x(j)**2
1320 s1 = exp( x(j) / 10.0_dp )
1322 s3 = s1 + s2 - d2 * ( exp( 0.1_dp ) + 1.0_dp )
1324 t3 = t3 + ( s1 - 1.0_dp / exp( 0.1_dp ) )**2
1327 d2 = d2 * exp( 0.1_dp )
1330 penalty2 = ap * ( t2 + t3 ) + t1 * t1 + ( x(1) - 0.2_dp )**2
1332 end function penalty2
1357 function brown_badly_scaled(x)
1363 real(dp) :: brown_badly_scaled
1364 real(dp),
dimension(:),
intent(in) :: x
1366 brown_badly_scaled = ( x(1) - 1000000.0_dp )**2 &
1367 + ( x(2) - 0.000002_dp )**2 &
1368 + ( x(1) * x(2) - 2.0_dp )**2
1370 end function brown_badly_scaled
1397 function brown_dennis(x)
1404 real(dp) :: brown_dennis
1408 real(dp),
dimension(:),
intent(in) :: x
1410 brown_dennis = 0.0_dp
1414 c = real( i, dp ) / 5.0_dp
1415 f1 = x(1) + c * x(2) - exp( c )
1416 f2 = x(3) + sin( c ) * x(4) - cos( c )
1418 brown_dennis = brown_dennis + f1**4 + 2.0_dp * f1 * f1 * f2 * f2 + f2**4
1422 brown_dennis = brown_dennis - 85822.2016263563_dp
1424 end function brown_dennis
1460 real(dp),
dimension(:),
intent(in) :: x
1461 real(dp) :: sqrtHuge
1463 sqrthuge = huge(1.0_dp)**0.5_dp -1.0_dp
1468 arg = real( i, dp ) / 100.0_dp
1469 r = abs( ( - 50.0_dp * log( arg ) )**( 2.0_dp / 3.0_dp ) &
1479 if ( x(3)*log(r) .gt. -708.-dp )
then
1480 print*,
'-exp(x(3)*Log(r)) = ',-exp(x(3)*log(r))
1481 print*,
'x(1) = ',x(1)
1482 if ( -exp(x(3)*log(r)) / x(1) .lt. -708._dp)
then
1485 if ( -r**x(3) / x(1) .gt. 708._dp)
then
1486 t = 1000000._dp - arg
1488 t = exp( - r**x(3) / x(1) ) - arg
1495 if ( abs(t) .gt. sqrthuge )
then
1500 if ( huge(1.0_dp) -gulf_rd .gt. t*t )
then
1502 gulf_rd = gulf_rd + t * t
1505 gulf_rd = huge(1.0_dp)
1510 end function gulf_rd
1535 function trigonometric(x)
1541 real(dp) :: trigonometric
1545 real(dp),
dimension(:),
intent(in) :: x
1548 s1 = sum( cos( x(1:n) ) )
1550 trigonometric = 0.0_dp
1552 t = real( n + j, dp ) - sin( x(j) ) &
1553 - s1 - real( j, dp ) * cos( x(j) )
1554 trigonometric = trigonometric + t * t
1557 end function trigonometric
1590 function ext_rosenbrock_parabolic_valley(x)
1596 real(dp) :: ext_rosenbrock_parabolic_valley
1598 real(dp),
dimension(:),
intent(in) :: x
1601 ext_rosenbrock_parabolic_valley = 0.0_dp
1603 if ( mod( j, 2 ) == 1 )
then
1604 ext_rosenbrock_parabolic_valley = ext_rosenbrock_parabolic_valley + ( 1.0_dp - x(j) )**2
1606 ext_rosenbrock_parabolic_valley = ext_rosenbrock_parabolic_valley + 100.0_dp * ( x(j) - x(j-1) * x(j-1) )**2
1610 end function ext_rosenbrock_parabolic_valley
1651 function ext_powell_singular_quartic(x)
1657 real(dp) :: ext_powell_singular_quartic
1663 real(dp),
dimension(:),
intent(in) :: x
1669 ext_powell_singular_quartic = 0.0_dp
1673 if ( j + 1 <= n )
then
1679 if ( j + 2 <= n )
then
1685 if ( j + 3 <= n )
then
1691 f1 = x(j) + 10.0_dp * xjp1
1693 if ( j + 1 <= n )
then
1699 if ( j + 2 <= n )
then
1700 f3 = xjp1 - 2.0_dp * xjp2
1705 if ( j + 3 <= n )
then
1711 ext_powell_singular_quartic = ext_powell_singular_quartic + f1 * f1 &
1712 + 5.0_dp * f2 * f2 &
1713 + f3 * f3 * f3 * f3 &
1714 + 10.0_dp * f4 * f4 * f4 * f4
1718 end function ext_powell_singular_quartic
1781 real(dp),
dimension(:),
intent(in) :: x
1783 f1 = 1.5_dp - x(1) * ( 1.0_dp - x(2) )
1784 f2 = 2.25_dp - x(1) * ( 1.0_dp - x(2) * x(2) )
1785 f3 = 2.625_dp - x(1) * ( 1.0_dp - x(2) * x(2) * x(2) )
1787 beale = f1 * f1 + f2 * f2 + f3 * f3
1835 real(dp),
dimension(:),
intent(in) :: x
1837 f1 = x(2) - x(1) * x(1)
1839 f3 = x(4) - x(3) * x(3)
1841 f5 = x(2) + x(4) - 2.0_dp
1844 wood = 100.0_dp * f1 * f1 &
1846 + 90.0_dp * f3 * f3 &
1848 + 10.0_dp * f5 * f5 &
1890 function chebyquad(x)
1896 real(dp) :: chebyquad
1897 real(dp),
dimension(:),
intent(in) :: x
1899 real(dp),
dimension(size(x)) :: fvec
1914 t2 = 2.0_dp * x(j) - 1.0_dp
1917 fvec(i) = fvec(i) + t2
1925 fvec(i) = fvec(i) / real( n, dp )
1926 if ( mod( i, 2 ) == 0 )
then
1927 fvec(i) = fvec(i) + 1.0_dp / ( real( i, dp )**2 - 1.0_dp )
1934 chebyquad = sum( fvec(1:n)**2 )
1936 end function chebyquad
1980 function leon_cubic_valley(x)
1986 real(dp) :: leon_cubic_valley
1989 real(dp),
dimension(:),
intent(in) :: x
1991 f1 = x(2) - x(1) * x(1) * x(1)
1994 leon_cubic_valley = 100.0_dp * f1 * f1 &
1997 end function leon_cubic_valley
2037 function gregory_karney_tridia_matrix(x)
2043 real(dp) :: gregory_karney_tridia_matrix
2045 real(dp),
dimension(:),
intent(in) :: x
2048 gregory_karney_tridia_matrix = x(1) * x(1) + 2.0_dp * sum( x(2:n)**2 )
2051 gregory_karney_tridia_matrix = gregory_karney_tridia_matrix - 2.0_dp * x(i) * x(i+1)
2054 gregory_karney_tridia_matrix = gregory_karney_tridia_matrix - 2.0_dp * x(1)
2056 gregory_karney_tridia_matrix = gregory_karney_tridia_matrix + real(n,dp)
2058 end function gregory_karney_tridia_matrix
2108 real(dp),
dimension(:),
intent(in) :: x
2115 hilbert = hilbert + x(i) * x(j) / real( i + j - 1, dp )
2119 end function hilbert
2153 function de_jong_f1(x)
2159 real(dp) :: de_jong_f1
2160 real(dp),
dimension(:),
intent(in) :: x
2163 de_jong_f1 = sum( x(1:n)**2 )
2165 end function de_jong_f1
2199 function de_jong_f2(x)
2205 real(dp) :: de_jong_f2
2206 real(dp),
dimension(:),
intent(in) :: x
2208 de_jong_f2 = 100.0_dp * ( x(1) * x(1) - x(2) )**2 + ( 1.0_dp - x(1) )**2
2210 end function de_jong_f2
2246 function de_jong_f3(x)
2252 real(dp) :: de_jong_f3
2253 real(dp),
dimension(:),
intent(in) :: x
2259 de_jong_f3 = sum( aint( x(1:n) ) )
2261 end function de_jong_f3
2313 function de_jong_f4(x)
2319 real(dp) :: de_jong_f4
2323 real(dp),
dimension(:),
intent(in) :: x
2325 real(dp),
save :: p_save = 1.0_dp
2331 call normal_01_sample ( gauss )
2333 de_jong_f4 = p * gauss
2335 de_jong_f4 = de_jong_f4 + real( i, dp ) * x(i)**4
2338 end function de_jong_f4
2372 function de_jong_f5(x)
2380 real(dp) :: de_jong_f5
2386 integer(i4),
parameter :: jroot = 5
2387 integer(i4),
parameter :: k = 500
2388 real(dp),
dimension(:),
intent(in) :: x
2392 do j=1, jroot * jroot
2394 j1 = mod(j-1_i4, jroot) + 1_i4
2395 a1 = -32_i4 + j1 * 16_i4
2397 j2 = (j-1_i4) / jroot
2398 a2 = -32_i4 + j2 * 16_i4
2400 fj = real(j,dp) + (x(1) - real(a1,dp))**6 + (x(2) - real(a2,dp))**6
2402 fi = fi + 1.0_dp / fj
2406 de_jong_f5 = 1.0_dp / fi
2408 de_jong_f5 = de_jong_f5 - 0.0019996667_dp
2410 end function de_jong_f5
2448 function schaffer_f6(x)
2456 real(dp) :: schaffer_f6
2458 real(dp),
dimension(:),
intent(in) :: x
2460 r = sqrt( x(1)**2 + x(2)**2 )
2462 a = ( 1.0_dp + 0.001_dp * r**2 )**( -2 )
2464 b = ( sin( r ) )**2 - 0.5_dp
2466 schaffer_f6 = 0.5_dp + a * b
2468 end function schaffer_f6
2506 function schaffer_f7(x)
2512 real(dp) :: schaffer_f7
2514 real(dp),
dimension(:),
intent(in) :: x
2516 r = sqrt( x(1)**2 + x(2)**2 )
2518 schaffer_f7 = sqrt( r ) * ( 1.0_dp + ( sin( 50.0_dp * r**0.2_dp ) )**2 )
2520 end function schaffer_f7
2561 function goldstein_price_polynomial(x)
2571 real(dp) :: goldstein_price_polynomial
2572 real(dp),
dimension(:),
intent(in) :: x
2574 a = x(1) + x(2) + 1.0_dp
2576 b = 19.0_dp - 14.0_dp * x(1) + 3.0_dp * x(1) * x(1) - 14.0_dp * x(2) &
2577 + 6.0_dp * x(1) * x(2) + 3.0_dp * x(2) * x(2)
2579 c = 2.0_dp * x(1) - 3.0_dp * x(2)
2581 d = 18.0_dp - 32.0_dp * x(1) + 12.0_dp * x(1) * x(1) + 48.0_dp * x(2) &
2582 - 36.0_dp * x(1) * x(2) + 27.0_dp * x(2) * x(2)
2584 goldstein_price_polynomial = ( 1.0_dp + a * a * b ) * ( 30.0_dp + c * c * d )
2586 goldstein_price_polynomial = goldstein_price_polynomial - 3.0_dp
2588 end function goldstein_price_polynomial
2624 function branin_rcos(x)
2632 real(dp),
parameter :: a = 1.0_dp
2635 real(dp),
parameter :: d = 6.0_dp
2636 real(dp),
parameter :: e = 10.0_dp
2637 real(dp) :: branin_rcos
2639 real(dp),
dimension(:),
intent(in) :: x
2641 b = 5.1_dp / ( 4.0_dp *
pi_dp**2 )
2643 ff = 1.0_dp / ( 8.0_dp *
pi_dp )
2645 branin_rcos = a * ( x(2) - b * x(1)**2 + c * x(1) - d )**2 &
2646 + e * ( 1.0_dp - ff ) * cos( x(1) ) + e
2648 branin_rcos = branin_rcos - 0.3978873577_dp
2650 end function branin_rcos
2688 function shekel_sqrn5(x)
2692 integer(i4),
parameter :: m = 5
2695 real(dp),
parameter,
dimension ( 4, m ) :: a = reshape ( &
2696 (/ 4.0_dp, 4.0_dp, 4.0_dp, 4.0_dp, &
2697 1.0_dp, 1.0_dp, 1.0_dp, 1.0_dp, &
2698 8.0_dp, 8.0_dp, 8.0_dp, 8.0_dp, &
2699 6.0_dp, 6.0_dp, 6.0_dp, 6.0_dp, &
2700 3.0_dp, 7.0_dp, 3.0_dp, 7.0_dp /), (/ 4, m /) )
2701 real(dp),
save,
dimension ( m ) :: c = &
2702 (/ 0.1_dp, 0.2_dp, 0.2_dp, 0.4_dp, 0.6_dp /)
2703 real(dp) :: shekel_sqrn5
2705 real(dp),
dimension(:),
intent(in) :: x
2708 shekel_sqrn5 = 0.0_dp
2710 shekel_sqrn5 = shekel_sqrn5 - 1.0_dp / ( c(j) + sum( ( x(1:n) - a(1:n,j) )**2 ) )
2713 shekel_sqrn5 = shekel_sqrn5 + 10.1527236935_dp
2715 end function shekel_sqrn5
2749 function shekel_sqrn7(x)
2753 integer(i4),
parameter :: m = 7
2756 real(dp),
parameter,
dimension ( 4, m ) :: a = reshape ( &
2757 (/ 4.0_dp, 4.0_dp, 4.0_dp, 4.0_dp, &
2758 1.0_dp, 1.0_dp, 1.0_dp, 1.0_dp, &
2759 8.0_dp, 8.0_dp, 8.0_dp, 8.0_dp, &
2760 6.0_dp, 6.0_dp, 6.0_dp, 6.0_dp, &
2761 3.0_dp, 7.0_dp, 3.0_dp, 7.0_dp, &
2762 2.0_dp, 9.0_dp, 2.0_dp, 9.0_dp, &
2763 5.0_dp, 5.0_dp, 3.0_dp, 3.0_dp /), (/ 4, m /) )
2764 real(dp),
save,
dimension ( m ) :: c = &
2765 (/ 0.1_dp, 0.2_dp, 0.2_dp, 0.4_dp, 0.6_dp, 0.6_dp, 0.3_dp /)
2766 real(dp) :: shekel_sqrn7
2768 real(dp),
dimension(:),
intent(in) :: x
2771 shekel_sqrn7 = 0.0_dp
2773 shekel_sqrn7 = shekel_sqrn7 - 1.0_dp / ( c(j) + sum( ( x(1:n) - a(1:n,j) )**2 ) )
2776 shekel_sqrn7 = shekel_sqrn7 + 10.4024645722_dp
2778 end function shekel_sqrn7
2812 function shekel_sqrn10(x)
2816 integer(i4),
parameter :: m = 10
2819 real(dp),
parameter,
dimension ( 4, m ) :: a = reshape ( &
2820 (/ 4.0, 4.0, 4.0, 4.0, &
2821 1.0, 1.0, 1.0, 1.0, &
2822 8.0, 8.0, 8.0, 8.0, &
2823 6.0, 6.0, 6.0, 6.0, &
2824 3.0, 7.0, 3.0, 7.0, &
2825 2.0, 9.0, 2.0, 9.0, &
2826 5.0, 5.0, 3.0, 3.0, &
2827 8.0, 1.0, 8.0, 1.0, &
2828 6.0, 2.0, 6.0, 2.0, &
2829 7.0, 3.6, 7.0, 3.6 /), (/ 4, m /) )
2831 real(dp),
save,
dimension ( m ) :: c = &
2832 (/ 0.1_dp, 0.2_dp, 0.2_dp, 0.4_dp, 0.6_dp, &
2833 0.6_dp, 0.3_dp, 0.7_dp, 0.5_dp, 0.5_dp /)
2834 real(dp) :: shekel_sqrn10
2836 real(dp),
dimension(:),
intent(in) :: x
2839 shekel_sqrn10 = 0.0_dp
2841 shekel_sqrn10 = shekel_sqrn10 - 1.0_dp / ( c(j) + sum( ( x(1:n) - a(1:n,j) )**2 ) )
2844 shekel_sqrn10 = shekel_sqrn10 + 10.5359339075_dp
2846 end function shekel_sqrn10
2881 function six_hump_camel_back_polynomial(x)
2887 real(dp) :: six_hump_camel_back_polynomial
2888 real(dp),
dimension(:),
intent(in) :: x
2890 six_hump_camel_back_polynomial = ( 4.0_dp - 2.1_dp * x(1)**2 + x(1)**4 / 3.0_dp ) * x(1)**2 &
2891 + x(1) * x(2) + 4.0_dp * ( x(2)**2 - 1.0_dp ) * x(2)**2
2893 six_hump_camel_back_polynomial = six_hump_camel_back_polynomial + 1.0316284229_dp
2895 end function six_hump_camel_back_polynomial
2950 real(dp),
dimension(:),
intent(in) :: x
2958 k_r8 = real( k, dp )
2959 factor = factor + k_r8 * cos( ( k_r8 + 1.0_dp ) * x(i) + k_r8 )
2961 shubert = shubert * factor
2964 shubert = shubert + 186.7309088310_dp
2966 end function shubert
3000 function stuckman(x)
3011 real(dp) :: stuckman
3018 real(dp),
dimension(:),
intent(in) :: x
3020 real(dp),
save :: b_save = 0.0_dp
3021 real(dp),
save :: m1_save = 0.0_dp
3022 real(dp),
save :: m2_save = 0.0_dp
3023 real(dp),
save :: r11_save = 0.0_dp
3024 real(dp),
save :: r12_save = 0.0_dp
3025 real(dp),
save :: r21_save = 0.0_dp
3026 real(dp),
save :: r22_save = 0.0_dp
3037 a1 = r8_aint( abs( x(1) - r11 ) ) + r8_aint( abs( x(2) - r21 ) )
3038 a2 = r8_aint( abs( x(1) - r12 ) ) + r8_aint( abs( x(2) - r22 ) )
3040 if (
le(x(1),b) )
then
3041 if (
eq(a1,0.0_dp) )
then
3042 stuckman = r8_aint( m1 )
3044 stuckman = r8_aint( m1 * sin( a1 ) / a1 )
3047 if (
eq(a2,0.0_dp) )
then
3048 stuckman = r8_aint( m2 )
3050 stuckman = r8_aint( m2 * sin( a2 ) / a2 )
3054 end function stuckman
3098 real(dp),
dimension(:),
intent(in) :: x
3100 arg = - ( x(1) -
pi_dp )**2 - ( x(2) -
pi_dp )**2
3101 easom = - cos( x(1) ) * cos( x(2) ) * exp( arg )
3102 easom = easom + 1.0_dp
3138 function bohachevsky1(x)
3146 real(dp) :: bohachevsky1
3147 real(dp),
dimension(:),
intent(in) :: x
3149 bohachevsky1 = x(1) * x(1) - 0.3_dp * cos( 3.0_dp *
pi_dp * x(1) ) &
3150 + 2.0_dp * x(2) * x(2) - 0.4_dp * cos( 4.0_dp *
pi_dp * x(2) ) &
3153 end function bohachevsky1
3187 function bohachevsky2(x)
3195 real(dp) :: bohachevsky2
3196 real(dp),
dimension(:),
intent(in) :: x
3198 bohachevsky2 = x(1) * x(1) + 2.0_dp * x(2) * x(2) &
3199 - 0.3_dp * cos( 3.0_dp *
pi_dp * x(1) ) &
3200 * cos( 4.0_dp *
pi_dp * x(2) ) + 0.3_dp
3202 end function bohachevsky2
3246 function bohachevsky3(x)
3254 real(dp) :: bohachevsky3
3255 real(dp),
dimension(:),
intent(in) :: x
3257 bohachevsky3 = x(1)**2 + 2.0_dp * x(2)**2 &
3258 - 0.3_dp * cos( 3.0_dp *
pi_dp * x(1) &
3259 + 4.0_dp *
pi_dp * x(2) ) + 0.3_dp
3261 end function bohachevsky3
3295 function colville_polynomial(x)
3301 real(dp) :: colville_polynomial
3302 real(dp),
dimension(:),
intent(in) :: x
3304 colville_polynomial = 100.0_dp * ( x(2) - x(1)**2 )**2 &
3305 + ( 1.0_dp - x(1) )**2 &
3306 + 90.0_dp * ( x(4) - x(3)**2 )**2 &
3307 + ( 1.0_dp - x(3) )**2 &
3308 + 10.1_dp * ( ( x(2) - 1.0_dp )**2 + ( x(4) - 1.0_dp )**2 ) &
3309 + 19.8_dp * ( x(2) - 1.0_dp ) * ( x(4) - 1.0_dp )
3311 end function colville_polynomial
3344 function powell3d(x)
3354 real(dp) :: powell3d
3356 real(dp),
dimension(:),
intent(in) :: x
3358 if (
eq(x(2),0.0_dp) )
then
3363 arg = ( x(1) + x(3) ) / x(2) - 2.0_dp
3366 if ( term .lt. 708._dp )
then
3367 term = exp( - term )
3375 - 1.0_dp / ( 1.0_dp + ( x(1) - x(2) )**2 ) &
3376 - sin( 0.5_dp *
pi_dp * x(2) * x(3) ) &
3379 end function powell3d
3421 function himmelblau(x)
3427 real(dp) :: himmelblau
3428 real(dp),
dimension(:),
intent(in) :: x
3430 himmelblau = ( x(1)**2 + x(2) - 11.0_dp )**2 &
3431 + ( x(1) + x(2)**2 - 7.0_dp )**2
3433 end function himmelblau
3451 function griewank(x_values)
3457 real(dp),
dimension(:),
intent(in) :: x_values
3458 real(dp) :: griewank
3462 real(dp) :: d, u1, u2
3464 nopt =
size(x_values)
3465 if (nopt .eq. 2)
then
3470 u1 = sum(x_values**2) / d
3473 u2 = u2 * cos(x_values(j)/sqrt(real(j,dp)))
3475 griewank = u1 - u2 + 1.0_dp
3477 end function griewank
3510 function rosenbrock(x)
3514 real(dp),
dimension(:),
intent(in) :: x
3515 real(dp) :: rosenbrock
3521 fx1 = x(2) - x(1) * x(1)
3524 fx = 100.0_dp * fx1 * fx1 + fx2 * fx2
3528 end function rosenbrock
3545 function sphere_model(x)
3549 real(dp),
dimension(:),
intent(in) :: x
3550 real(dp) :: sphere_model
3556 sphere_model = 0.0_dp
3558 sphere_model = sphere_model + x(j)**2
3561 end function sphere_model
3579 function rastrigin(x)
3585 real(dp),
dimension(:),
intent(in) :: x
3586 real(dp) :: rastrigin
3594 rastrigin = rastrigin+ (x(j)**2 - 10.0_dp*cos(2.0_dp*
pi_dp*x(j)))
3596 rastrigin = rastrigin + 10.0_dp * real(n,dp)
3607 end function rastrigin
3627 function schwefel(x)
3631 real(dp),
dimension(:),
intent(in) :: x
3632 real(dp) :: schwefel
3637 schwefel = sum(-x*sin(sqrt(abs(x)))) + 418.982887272433799807913601398_dp*real(n,dp)
3639 end function schwefel
3662 real(dp),
dimension(:),
intent(in) :: x
3666 real(dp),
parameter :: a = 20.0_dp
3667 real(dp),
parameter :: b = 0.2_dp
3668 real(dp),
parameter :: c = 2.0_dp*
pi_dp
3674 ackley = -a * exp(-b*sqrt(1.0_dp/real(n,dp)*s1)) - exp(1.0_dp/real(n,dp)*s2) + a + exp(1.0_dp)
3722 function michalewicz(x)
3728 real(dp),
dimension(:),
intent(in) :: x
3729 real(dp) :: michalewicz
3734 integer(i4),
parameter :: p = 20
3737 michalewicz = 0.0_dp
3740 tmp = x(j)*x(j) * (real(j,dp)/
pi_dp)
3742 if (abs(tmp) .lt. 1e-15)
then
3747 tmp = sin(x(j)) * tmp
3748 michalewicz = michalewicz + tmp
3750 michalewicz = -michalewicz
3754 michalewicz = michalewicz + 1.8013033793_dp
3756 michalewicz = michalewicz + 4.6876581791_dp
3759 end function michalewicz
3780 real(dp),
dimension(:),
intent(in) :: x
3783 booth = (x(1)+2.0_dp*x(2)-7.0_dp)**2 + (2.0_dp*x(1)+x(2)-5.0_dp)**2
3817 real(dp),
dimension(:),
intent(in) :: x
3820 hump = 1.0316285_dp + 4.0_dp*x(1)**2 - 2.1_dp*x(1)**4 + x(1)**6 / 3.0_dp + x(1)*x(2) - 4.0_dp*x(2)**2 + 4.0_dp*x(2)**4
3845 real(dp),
dimension(:),
intent(in) :: x
3850 real(dp),
dimension(size(x)) :: z
3853 z = 1.0_dp+(x-1.0_dp)/4.0_dp
3854 levy = sin(
pi_dp*z(1))**2
3856 levy = levy + (z(i)-1.0_dp)**2 * (1.0_dp+10.0_dp*(sin(
pi_dp*z(i)+1.0_dp))**2)
3858 levy = levy + (z(n)-1.0_dp)**2 * (1.0_dp+(sin(2.0_dp*
pi_dp*z(n)))**2)
3881 real(dp),
dimension(:),
intent(in) :: x
3884 matyas = 0.26_dp * (x(1)**2 + x(2)**2) -0.48_dp*x(1)*x(2)
3907 real(dp),
dimension(:),
intent(in) :: x
3919 s_in = s_in + (real(j,dp)**k + 0.5_dp) * ((x(j)/real(j,dp))**k - 1.0_dp)
3921 perm = perm + s_in**2
3944 function power_sum(x)
3948 real(dp),
dimension(:),
intent(in) :: x
3949 real(dp) :: power_sum
3953 real(dp),
dimension(4) :: b
3956 b = (/ 8.0_dp, 18.0_dp, 44.0_dp, 114.0_dp /)
3959 power_sum = power_sum + (sum(x**k) - b(k))**2
3962 end function power_sum
3983 real(dp),
dimension(:),
intent(in) :: x
3992 sphere = sphere + x(j)**2
4036 function sphere_model_2d(x)
4040 real(dp),
dimension(:,:),
intent(in) :: x
4041 real(dp),
dimension(size(x,2)) :: sphere_model_2d
4050 sphere_model_2d(j) = sum( ( x(1:m,j) - 1.0_dp ) ** 2 )
4053 end function sphere_model_2d
4091 function axis_parallel_hyper_ellips_2d(x)
4095 real(dp),
dimension(:,:),
intent(in) :: x
4096 real(dp),
dimension(size(x,2)) :: axis_parallel_hyper_ellips_2d
4101 real(dp) :: y(size(x,1))
4106 forall(j=1:m) y(j) = real(j,dp)
4109 axis_parallel_hyper_ellips_2d(j) = sum( y(1:m) * x(1:m,j) ** 2 )
4112 end function axis_parallel_hyper_ellips_2d
4153 function rotated_hyper_ellipsoid_2d(x)
4157 real(dp),
dimension(:,:),
intent(in) :: x
4158 real(dp),
dimension(size(x,2)) :: rotated_hyper_ellipsoid_2d
4170 rotated_hyper_ellipsoid_2d(j) = 0.0_dp
4174 x_sum = x_sum + x(i,j)
4175 rotated_hyper_ellipsoid_2d(j) = rotated_hyper_ellipsoid_2d(j) + x_sum**2
4180 end function rotated_hyper_ellipsoid_2d
4214 function rosenbrock_2d(x)
4218 real(dp),
dimension(:,:),
intent(in) :: x
4219 real(dp),
dimension(size(x,2)) :: rosenbrock_2d
4228 rosenbrock_2d(j) = sum( ( 1.0_dp - x(1:m,j) )**2 ) &
4229 + sum( ( x(2:m,j) - x(1:m-1,j) )**2 )
4232 end function rosenbrock_2d
4264 function rastrigin_2d(x)
4270 real(dp),
dimension(:,:),
intent(in) :: x
4271 real(dp),
dimension(size(x,2)) :: rastrigin_2d
4282 rastrigin_2d(j) = real( 10 * m, dp )
4285 rastrigin_2d(j) = rastrigin_2d(j) + x(i,j) ** 2 - 10.0_dp * cos( 2.0_dp *
pi_dp * x(i,j) )
4290 end function rastrigin_2d
4325 function schwefel_2d(x)
4329 real(dp),
dimension(:,:),
intent(in) :: x
4330 real(dp),
dimension(size(x,2)) :: schwefel_2d
4339 schwefel_2d(j) = -sum( x(1:m,j) * sin( sqrt( abs( x(1:m,j) ) ) ) )
4342 end function schwefel_2d
4374 function griewank_2d(x)
4378 real(dp),
dimension(:,:),
intent(in) :: x
4379 real(dp),
dimension(size(x,2)) :: griewank_2d
4384 real(dp) :: y(size(x,1))
4388 forall(j=1:m) y(j) = real(j,dp)
4389 y(1:m) = sqrt( y(1:m) )
4392 griewank_2d(j) = sum( x(1:m,j) ** 2 ) / 4000.0_dp &
4393 - product( cos( x(1:m,j) / y(1:m) ) ) + 1.0_dp
4396 end function griewank_2d
4428 function power_sum_2d(x)
4432 real(dp),
dimension(:,:),
intent(in) :: x
4433 real(dp),
dimension(size(x,2)) :: power_sum_2d
4438 real(dp) :: y(size(x,1))
4442 forall(j=1:m) y(j) = real(j,dp)
4443 y(1:m) = y(1:m) + 1.0_dp
4446 power_sum_2d(j) = sum( abs( x(1:m,j) ) ** y(1:m) )
4449 end function power_sum_2d
4481 function ackley_2d(x)
4487 real(dp),
dimension(:,:),
intent(in) :: x
4488 real(dp),
dimension(size(x,2)) :: ackley_2d
4493 real(dp),
parameter :: a = 20.0_dp
4494 real(dp),
parameter :: b = 0.2_dp
4495 real(dp),
parameter :: c = 0.2_dp
4500 ackley_2d(j) = -a * exp( -b * sqrt( sum( x(1:m,j)**2 ) &
4501 / real( m, dp ) ) ) &
4502 - exp( sum( cos( c *
pi_dp * x(1:m,j) ) ) / real( m, dp ) ) &
4506 end function ackley_2d
4538 function michalewicz_2d(x)
4544 real(dp),
dimension(:,:),
intent(in) :: x
4545 real(dp),
dimension(size(x,2)) :: michalewicz_2d
4550 integer(i4),
parameter :: p = 10
4551 real(dp) :: y(size(x,1))
4555 forall(j=1:m) y(j) = real(j,dp)
4558 michalewicz_2d(j) = -sum( &
4559 sin( x(1:m,j) ) * ( sin( x(1:m,j)**2 * y(1:m) /
pi_dp ) ) ** ( 2 * p ) &
4563 end function michalewicz_2d
4595 function drop_wave_2d(x)
4599 real(dp),
dimension(:,:),
intent(in) :: x
4600 real(dp),
dimension(size(x,2)) :: drop_wave_2d
4611 rsq = sum( x(1:m,j)**2 )
4613 drop_wave_2d(j) = -( 1.0_dp + cos( 12.0_dp * sqrt( rsq ) ) ) &
4614 / ( 0.5_dp * rsq + 2.0_dp )
4618 end function drop_wave_2d
4655 function deceptive_2d(x)
4661 real(dp),
dimension(:,:),
intent(in) :: x
4662 real(dp),
dimension(size(x,2)) :: deceptive_2d
4669 real(dp) :: alpha(size(x,1))
4670 real(dp),
parameter :: beta = 2.0_dp
4677 alpha(i) = real( i, dp ) / real( m + 1, dp )
4682 deceptive_2d(j) = 0.0_dp
4686 if (
le(x(i,j),0.0_dp) )
then
4688 else if (
le(x(i,j),0.8_dp * alpha(i)) )
then
4689 g = 0.8_dp - x(i,j) / alpha(i)
4690 else if (
le(x(i,j),alpha(i)) )
then
4691 g = 5.0_dp * x(i,j) / alpha(i) - 4.0_dp
4692 else if (
le(x(i,j),( 1.0_dp + 4.0_dp * alpha(i) ) / 5.0_dp) )
then
4693 g = 1.0_dp + 5.0_dp * ( x(i,j) - alpha(i) ) / ( alpha(i) - 1.0_dp )
4694 else if (
le(x(i,j),1.0_dp) )
then
4695 g = 0.8_dp + ( x(i,j) - 1.0_dp ) / ( 1.0_dp - alpha(i) )
4700 deceptive_2d(j) = deceptive_2d(j) + g
4704 deceptive_2d(j) = deceptive_2d(j) / real( m, dp )
4705 deceptive_2d(j) = -( deceptive_2d(j) ** beta )
4709 end function deceptive_2d
4718 subroutine dtlz2_3d(paraset,obj)
4759 real(dp),
dimension(:),
intent(in) :: paraset
4760 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
4763 integer(i4) :: ii, npara, nobj
4765 real(dp),
dimension(size(paraset,1)) :: xx
4767 real(dp),
parameter :: pi_dp = 3.141592653589793238462643383279502884197_dp
4769 npara =
size(paraset)
4777 do ii = nobj+1, npara
4778 gm = gm + (paraset(ii) - 0.5_dp)**2
4781 xx = paraset * pi_dp / 2.0_dp
4785 obj(nobj) = tt * sin(xx(1))
4790 tt = tt * cos( xx(nobj-ii) )
4791 obj(ii) = tt * sin( xx(nobj-ii+1) )
4795 obj(1) = tt * cos( xx(nobj-1) )
4797 where (abs(obj) < epsilon(1.0_dp))
4801 end subroutine dtlz2_3d
4803 subroutine dtlz2_5d(paraset,obj)
4845 real(dp),
dimension(:),
intent(in) :: paraset
4846 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
4849 integer(i4) :: ii, npara, nobj
4851 real(dp),
dimension(size(paraset,1)) :: xx
4853 real(dp),
parameter :: pi_dp = 3.141592653589793238462643383279502884197_dp
4855 npara =
size(paraset)
4863 do ii = nobj+1, npara
4864 gm = gm + (paraset(ii) - 0.5)**2
4867 xx = paraset * pi_dp / 2.0_dp
4871 obj(nobj) = tt * sin(xx(1))
4875 tt = tt * cos( xx(nobj-ii) )
4876 obj(ii) = tt * sin( xx(nobj-ii+1) )
4880 obj(1) = tt * cos( xx(nobj-1) )
4882 where (abs(obj) < epsilon(1.0_dp))
4886 end subroutine dtlz2_5d
4888 subroutine dtlz2_10d(paraset,obj)
4930 real(dp),
dimension(:),
intent(in) :: paraset
4931 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
4934 integer(i4) :: ii, npara, nobj
4936 real(dp),
dimension(size(paraset,1)) :: xx
4938 real(dp),
parameter :: pi_dp = 3.141592653589793238462643383279502884197_dp
4940 npara =
size(paraset)
4948 do ii = nobj+1, npara
4949 gm = gm + (paraset(ii) - 0.5)**2
4952 xx = paraset * pi_dp / 2.0_dp
4956 obj(nobj) = tt * sin(xx(1))
4960 tt = tt * cos( xx(nobj-ii) )
4961 obj(ii) = tt * sin( xx(nobj-ii+1) )
4965 obj(1) = tt * cos( xx(nobj-1) )
4967 where (abs(obj) < epsilon(1.0_dp))
4971 end subroutine dtlz2_10d
4973 subroutine fon_2d(paraset,obj)
5010 real(dp),
dimension(:),
intent(in) :: paraset
5011 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
5014 integer(i4) :: ii, npara, nobj
5017 npara =
size(paraset)
5018 if (npara .ne. 3) stop(
'mo_objective: fon_2d: This function requires 3-dimensional parameter sets')
5026 gg = gg + (paraset(ii) - 1.0/sqrt(3.0_dp))**2
5028 obj(1) = 1.0_dp - exp(-gg)
5033 gg = gg + (paraset(ii) + 1.0/sqrt(3.0_dp))**2
5035 obj(2) = 1.0_dp - exp(-gg)
5037 end subroutine fon_2d
5039 subroutine kur_2d(paraset,obj)
5090 real(dp),
dimension(:),
intent(in) :: paraset
5091 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
5094 integer(i4) :: ii, npara, nobj
5096 npara =
size(paraset)
5104 obj(1) = obj(1) - 10.0_dp * exp(-0.2_dp*sqrt(paraset(ii)**2 + paraset(ii+1)**2) );
5110 obj(2) = obj(2) + abs(paraset(ii))**0.8_dp + 5.0_dp * sin(paraset(ii)**3);
5113 end subroutine kur_2d
5115 subroutine pol_2d(paraset,obj)
5159 real(dp),
dimension(:),
intent(in) :: paraset
5160 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
5163 integer(i4) :: npara, nobj
5164 real(dp) :: a1, a2, b1, b2
5166 npara =
size(paraset)
5167 if (npara .ne. 2) stop(
'mo_objective: pol_2d: This function requires 2-dimensional parameter sets')
5172 a1 = 0.5_dp * sin(1.0_dp) - 2.0_dp * cos(1.0_dp) + 1.0_dp * sin(2.0_dp) - 1.5_dp * cos(2.0_dp)
5173 a2 = 1.5_dp * sin(1.0_dp) - 1.0_dp * cos(1.0_dp) + 2.0_dp * sin(2.0_dp) - 0.5_dp * cos(2.0_dp)
5174 b1 = 0.5_dp * sin(paraset(1)) - 2.0_dp * cos(paraset(1)) + 1.0_dp * sin(paraset(2)) - 1.5_dp * cos(paraset(2))
5175 b2 = 1.5_dp * sin(paraset(1)) - 1.0_dp * cos(paraset(1)) + 2.0_dp * sin(paraset(2)) - 0.5_dp * cos(paraset(2))
5178 obj(1) = 1.0_dp + (a1-b1)**2 + (a2-b2)**2
5181 obj(2) = (paraset(1) + 3.0_dp)**2 + (paraset(2) + 1.0_dp)**2
5183 end subroutine pol_2d
5185 subroutine sch_2d(paraset,obj)
5222 real(dp),
dimension(:),
intent(in) :: paraset
5223 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
5226 integer(i4) :: npara, nobj
5228 npara =
size(paraset)
5229 if (npara .ne. 1) stop(
'mo_objective: sch_2d: This function requires 1-dimensional parameter sets')
5235 obj(1) = paraset(1)**2
5238 obj(2) = (paraset(1) - 2.0_dp)**2
5240 end subroutine sch_2d
5242 subroutine zdt1_2d(paraset, obj)
5307 real(dp),
dimension(:),
intent(in) :: paraset
5308 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
5311 integer(i4) :: ii, npara, nobj
5314 npara =
size(paraset,1)
5325 gg = gg + paraset(ii)
5327 gg = 1.0_dp + 9.0_dp * gg / real(npara-1,dp)
5328 obj(2) = gg * (1.0_dp - sqrt(paraset(1) / gg))
5330 end subroutine zdt1_2d
5332 subroutine zdt2_2d(paraset,obj)
5377 real(dp),
dimension(:),
intent(in) :: paraset
5378 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
5381 integer(i4) :: npara, nobj
5384 npara =
size(paraset)
5393 gg = 1.0_dp + 9.0_dp * sum(paraset(2:npara))/real(npara-1,dp)
5394 obj(2) = gg * ( 1.0_dp - (paraset(1)/gg)**2 )
5396 end subroutine zdt2_2d
5398 subroutine zdt3_2d(paraset,obj)
5447 real(dp),
dimension(:),
intent(in) :: paraset
5448 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
5451 integer(i4) :: npara, nobj
5453 real(dp),
parameter :: pi_dp = 3.141592653589793238462643383279502884197_dp
5455 npara =
size(paraset)
5464 gg = 1.0_dp + 9.0_dp * sum(paraset(2:npara))/real(npara-1,dp)
5465 obj(2) = gg * ( 1.0_dp - sqrt(paraset(1)/gg) - paraset(1)/gg * sin(10.0_dp*pi_dp*paraset(1)) )
5467 end subroutine zdt3_2d
5469 subroutine zdt4_2d(paraset,obj)
5515 real(dp),
dimension(:),
intent(in) :: paraset
5516 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
5519 integer(i4) :: ii, npara, nobj
5521 real(dp),
parameter :: pi_dp = 3.141592653589793238462643383279502884197_dp
5523 npara =
size(paraset)
5532 gg = 1.0 + 10.0_dp*real(npara-1,dp)
5534 gg = gg + paraset(ii)**2 - 10.0_dp * cos(4.0_dp*pi_dp*paraset(ii))
5536 obj(2) = gg * ( 1.0_dp - sqrt(paraset(1)/gg ) )
5538 end subroutine zdt4_2d
5540 subroutine zdt6_2d(paraset,obj)
5586 real(dp),
dimension(:),
intent(in) :: paraset
5587 real(dp),
dimension(:),
allocatable,
intent(out) :: obj
5590 integer(i4) :: npara, nobj
5592 real(dp),
parameter :: pi_dp = 3.141592653589793238462643383279502884197_dp
5594 npara =
size(paraset)
5600 obj(1) = 1.0_dp - exp(-4.0_dp*paraset(1)) * sin(6.0_dp*pi_dp*paraset(1))**6
5603 gg = 1.0_dp + 9.0_dp * (sum(paraset(2:npara))/real(npara-1,dp))**0.25_dp
5604 obj(2) = gg * ( 1.0_dp - (obj(1) /gg)**2 )
5606 end subroutine zdt6_2d
5623 function ackley_objective(parameterset, eval, arg1, arg2, arg3)
5630 real(dp),
intent(in),
dimension(:) :: parameterset
5631 procedure(eval_interface),
INTENT(IN),
pointer :: eval
5632 real(dp),
optional,
intent(in) :: arg1
5633 real(dp),
optional,
intent(out) :: arg2
5634 real(dp),
optional,
intent(out) :: arg3
5635 real(dp) :: ackley_objective
5638 real(dp),
parameter :: a = 20.0_dp
5639 real(dp),
parameter :: b = 0.2_dp
5640 real(dp),
parameter :: c = 2.0_dp*
pi_dp
5642 type(optidata_sim),
dimension(:),
allocatable :: et_opti
5644 call eval(parameterset, etoptisim=et_opti)
5646 n =
size(parameterset)
5647 s1 = sum(parameterset**2)
5648 s2 = sum(cos(c*parameterset))
5649 ackley_objective = -a * exp(-b*sqrt(1.0_dp/real(n,dp)*s1)) - exp(1.0_dp/real(n,dp)*s2) + a + exp(1.0_dp)
5651 end function ackley_objective
5653 function griewank_objective(parameterset, eval, arg1, arg2, arg3)
5660 real(dp),
intent(in),
dimension(:) :: parameterset
5661 procedure(eval_interface),
INTENT(IN),
pointer :: eval
5662 real(dp),
optional,
intent(in) :: arg1
5663 real(dp),
optional,
intent(out) :: arg2
5664 real(dp),
optional,
intent(out) :: arg3
5665 real(dp) :: griewank_objective
5669 real(dp) :: d, u1, u2
5670 type(optidata_sim),
dimension(:),
allocatable :: et_opti
5672 call eval(parameterset, etoptisim=et_opti)
5674 nopt =
size(parameterset)
5675 if (nopt .eq. 2)
then
5680 u1 = sum(parameterset**2) / d
5683 u2 = u2 * cos(parameterset(j)/sqrt(real(j,dp)))
5685 griewank_objective = u1 - u2 + 1.0_dp
5687 end function griewank_objective
5690 subroutine eval_dummy(parameterset, opti_domain_indices, runoff, smOptiSim, neutronsOptiSim, etOptiSim, twsOptiSim, &
5691 lake_level, lake_volume, lake_area, lake_spill, lake_outflow, BFI)
5697 real(
dp),
dimension(:),
intent(in) :: parameterset
5698 integer(i4),
dimension(:),
optional,
intent(in) :: opti_domain_indices
5699 real(
dp),
dimension(:, :),
allocatable,
optional,
intent(out) :: runoff
5700 type(
optidata_sim),
dimension(:),
optional,
intent(inout) :: smoptisim
5701 type(
optidata_sim),
dimension(:),
optional,
intent(inout) :: neutronsoptisim
5702 type(
optidata_sim),
dimension(:),
optional,
intent(inout) :: etoptisim
5703 type(
optidata_sim),
dimension(:),
optional,
intent(inout) :: twsoptisim
5704 real(
dp),
dimension(:, :),
allocatable,
optional,
intent(out) :: lake_level
5705 real(
dp),
dimension(:, :),
allocatable,
optional,
intent(out) :: lake_volume
5706 real(
dp),
dimension(:, :),
allocatable,
optional,
intent(out) :: lake_area
5707 real(
dp),
dimension(:, :),
allocatable,
optional,
intent(out) :: lake_spill
5708 real(
dp),
dimension(:, :),
allocatable,
optional,
intent(out) :: lake_outflow
5709 real(
dp),
dimension(:),
allocatable,
optional,
intent(out) :: bfi
5714 allocate(dummydata%dataObs(1, 1))
5715 dummydata%dataObs = 0.0_dp
5717 if (
present(etoptisim))
then
5718 do i=1,
size(etoptisim)
5719 call etoptisim(i)%init(dummydata)
5723 if (
present(neutronsoptisim))
then
5724 do i=1,
size(neutronsoptisim)
5725 call neutronsoptisim(1)%init(dummydata)
5729 if (
present(twsoptisim))
then
5730 do i=1,
size(twsoptisim)
5731 call twsoptisim(1)%init(dummydata)
5735 if (
present(smoptisim))
then
5736 do i=1,
size(smoptisim)
5737 call smoptisim(1)%init(dummydata)
5741 if (
present(runoff))
then
5742 allocate(runoff(1, 1))
5743 runoff(:, :) = 0.0_dp
5746 if (
present(bfi))
then
5751 if (
present(lake_level))
then
5752 allocate(lake_level(1, 1))
5753 lake_level(:, :) = 0.0_dp
5756 if (
present(lake_volume))
then
5757 allocate(lake_volume(1, 1))
5758 lake_volume(:, :) = 0.0_dp
5761 if (
present(lake_area))
then
5762 allocate(lake_area(1, 1))
5763 lake_area(:, :) = 0.0_dp
5766 if (
present(lake_spill))
then
5767 allocate(lake_spill(1, 1))
5768 lake_spill(:, :) = 0.0_dp
5771 if (
present(lake_outflow))
then
5772 allocate(lake_outflow(1, 1))
5773 lake_outflow(:, :) = 0.0_dp
Interface for evaluation routine.
Comparison of real values.
Comparison of real values: a <= b.
Provides computational, mathematical, physical, and file constants.
real(dp), parameter pi_dp
Pi in double precision.
Define number representations.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
Added for testing purposes of test_mo_sce, test_mo_dds, test_mo_mcmc.
subroutine, public eval_dummy(parameterset, opti_domain_indices, runoff, smoptisim, neutronsoptisim, etoptisim, twsoptisim, lake_level, lake_volume, lake_area, lake_spill, lake_outflow, bfi)
Type definitions for optimization routines.
Utility functions, such as interface definitions, for optimization routines.
General utilities for the CHS library.
type for simulated optional data
optional data, such as sm, neutrons, et, tws