docs: @Override
    public void evaluate(DoubleSolution solution) {
  
      int numberOfVariables = solution.getNumberOfVariables();
      int numberOfObjectives = solution.getNumberOfObjectives();
  
      double[] x = new double[numberOfVariables];
      double[] f = new double[numberOfObjectives];
  
      for (int i = 0; i < numberOfVariables; i++) {
        x[i] = solution.getVariableValue(i);
      }
  
      // change x
      for (int i = numberOfObjectives - 1; i < numberOfVariables; i++) {
        x[i] = (1 + Math.cos((i + 1) / (double) numberOfVariables * Math.PI / 2)) * x[i] - 10 * x[0];
      }
      // evaluate eta,g
      double[] g = new double[numberOfObjectives];
      double sub1;
      for (int i = 0; i < numberOfObjectives; i = i + 2) {
        double[] tx = new double[sublen15[i]];
        sub1 = 0;
        for (int j = 0; j < nk15; j++) {
          System
              .arraycopy(x, len15[i] + numberOfObjectives - 1 + j * sublen15[i], tx, 0, sublen15[i]);
          sub1 += Griewank(tx);
        }
        g[i] = sub1 / (nk15 * sublen15[i]);
      }
  
      for (int i = 1; i < numberOfObjectives; i = i + 2) {
        double[] tx = new double[sublen15[i]];
        sub1 = 0;
        for (int j = 0; j < nk15; j++) {
          System
              .arraycopy(x, len15[i] + numberOfObjectives - 1 + j * sublen15[i], tx, 0, sublen15[i]);
          sub1 += Sphere(tx);
        }
        g[i] = sub1 / (nk15 * sublen15[i]);
      }
  
      // evaluate fm,fm-1,...,2,f1
      double subf1 = 1;
      f[numberOfObjectives - 1] =
          (1 - Math.sin(Math.PI * x[0] / 2)) * (1 + g[numberOfObjectives - 1]);
      for (int i = numberOfObjectives - 2; i > 0; i--) {
        subf1 *= Math.cos(Math.PI * x[numberOfObjectives - i - 2] / 2);
        f[i] = (1 - subf1 * Math.sin(Math.PI * x[numberOfObjectives - i - 1] / 2)) * (1 + g[i] + g[i
            + 1]);
      }
      f[0] = (1 - subf1 * Math.cos(Math.PI * x[numberOfObjectives - 2] / 2)) * (1 + g[0] + g[1]);
  
      for (int i = 0; i < numberOfObjectives; i++) {
        solution.setObjective(i, f[i]);
      }
  
    }