/** * Evaluates a solution. * * @param solution The solution to evaluate. * @throws JMException */ public void evaluate(Solution solution) throws JMException { Variable[] decisionVariables = solution.getDecisionVariables(); double[] x = new double[numberOfVariables_]; for (int i = 0; i < numberOfVariables_; i++) x[i] = decisionVariables[i].getValue(); int count1, count2, count3; double sum1, sum2, sum3, yj, hj; sum1 = sum2 = sum3 = 0.0; count1 = count2 = count3 = 0; for (int j = 3; j <= numberOfVariables_; j++) { yj = x[j - 1] - 2.0 * x[1] * Math.sin(2.0 * Math.PI * x[0] + j * Math.PI / numberOfVariables_); hj = 4.0 * yj * yj - Math.cos(8.0 * Math.PI * yj) + 1.0; if (j % 3 == 1) { sum1 += hj; count1++; } else if (j % 3 == 2) { sum2 += hj; count2++; } else { sum3 += hj; count3++; } } solution.setObjective( 0, Math.cos(0.5 * Math.PI * x[0]) * Math.cos(0.5 * Math.PI * x[1]) + 2.0 * sum1 / (double) count1); solution.setObjective( 1, Math.cos(0.5 * Math.PI * x[0]) * Math.sin(0.5 * Math.PI * x[1]) + 2.0 * sum2 / (double) count2); solution.setObjective(2, Math.sin(0.5 * Math.PI * x[0]) + 2.0 * sum3 / (double) count3); } // evaluate