| 68 | } |
| 69 | |
| 70 | virtual double optcost( const double* const p ) |
| 71 | { |
| 72 | double s1 = 0.0; |
| 73 | double s2 = 0.0; |
| 74 | double s3 = 0.0; |
| 75 | int i; |
| 76 | |
| 77 | for( i = 0; i < 4; i++ ) |
| 78 | { |
| 79 | s1 += p[ i ]; |
| 80 | s2 += sqr( p[ i ]); |
| 81 | } |
| 82 | |
| 83 | for( i = 4; i < 13; i++ ) |
| 84 | { |
| 85 | s3 += p[ i ]; |
| 86 | } |
| 87 | |
| 88 | double cost = 5.0*s1-5.0*s2-s3; |
| 89 | |
| 90 | const int n_con = 9; |
| 91 | double pn[ n_con ]; |
| 92 | con_notmet = 0; |
| 93 | |
| 94 | pn[ 0 ] = penalty( 2.0*p[0]+2.0*p[1]+p[9]+p[10]-10.0 ); |
| 95 | pn[ 1 ] = penalty( 2.0*p[0]+2.0*p[2]+p[9]+p[11]-10.0 ); |
| 96 | pn[ 2 ] = penalty( 2.0*p[1]+2.0*p[2]+p[10]+p[11]-10.0 ); |
| 97 | pn[ 3 ] = penalty( -8.0*p[0]+p[9] ); |
| 98 | pn[ 4 ] = penalty( -8.0*p[1]+p[10] ); |
| 99 | pn[ 5 ] = penalty( -8.0*p[2]+p[11] ); |
| 100 | pn[ 6 ] = penalty( -2.0*p[3]-p[4]+p[9] ); |
| 101 | pn[ 7 ] = penalty( -2.0*p[5]-p[6]+p[10] ); |
| 102 | pn[ 8 ] = penalty( -2.0*p[7]-p[8]+p[11] ); |
| 103 | |
| 104 | real_value = cost; |
| 105 | |
| 106 | if( con_notmet > 0 ) |
| 107 | { |
| 108 | const double ps = 1.0 + 1.0 / n_con; |
| 109 | double pns = 0.0; |
| 110 | |
| 111 | for( i = 0; i < n_con; i++ ) |
| 112 | { |
| 113 | const double v = pn[ i ]; |
| 114 | pns = ( 1.0 + pns ) * ps + ( v + v * v + v * v * v ) * 0.33333; |
| 115 | } |
| 116 | |
| 117 | cost += 1e10 * pns; |
| 118 | } |
| 119 | |
| 120 | return( cost ); |
| 121 | } |
| 122 | }; |
| 123 | |
| 124 | int main() |