/* Copyright 2009-2015 David Hadka * * This file is part of the MOEA Framework. * * The MOEA Framework is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at your * option) any later version. * * The MOEA Framework is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the MOEA Framework. If not, see <http://www.gnu.org/licenses/>. */ package org.moeaframework.problem.WFG; import java.util.Arrays; /* This code is based on the Walking Fish Group implementation. * * Copyright 2005 The Walking Fish Group (WFG). * * This material is provided "as is", with no warranty expressed or implied. * Any use is at your own risk. Permission to use or copy this software for * any purpose is hereby granted without fee, provided this notice is * retained on all copies. Permission to modify the code and to distribute * modified code is granted, provided a notice that the code was modified is * included with the above copyright notice. * * http://www.wfg.csse.uwa.edu.au/ */ class Transitions { /** * Private constructor to prevent instantiation. */ private Transitions() { super(); } /** * Construct a vector with the elements v[head], ..., v[tail-1]. */ private static double[] subvector(double[] v, int head, int tail) { assert (head >= 0) && (head < tail); assert tail <= v.length; double[] result = new double[tail - head]; for (int i = head; i < tail; i++) { result[i - head] = v[i]; } return result; } public static double[] WFG1_t1(double[] y, int k) { int n = y.length; assert Misc.vector_in_01(y); assert (k >= 1) && (k < n); double[] t = new double[n]; for (int i = 0; i < k; i++) { t[i] = y[i]; } for (int i = k; i < n; i++) { t[i] = TransFunctions.s_linear(y[i], 0.35); } return t; } public static double[] WFG1_t2(double[] y, int k) { int n = y.length; assert Misc.vector_in_01(y); assert (k >= 1) && (k < n); double[] t = new double[n]; for (int i = 0; i < k; i++) { t[i] = y[i]; } for (int i = k; i < n; i++) { t[i] = TransFunctions.b_flat(y[i], 0.8, 0.75, 0.85); } return t; } public static double[] WFG1_t3(double[] y) { int n = y.length; assert Misc.vector_in_01(y); double[] t = new double[n]; for (int i = 0; i < n; i++) { t[i] = TransFunctions.b_poly(y[i], 0.02); } return t; } public static double[] WFG1_t4(double[] y, int k, int M) { int n = y.length; assert Misc.vector_in_01(y); assert (k >= 1) && (k < n); assert M >= 2; assert k % (M - 1) == 0; double[] w = new double[n]; for (int i = 1; i <= n; i++) { w[i - 1] = 2.0 * i; } double[] t = new double[M]; for (int i = 1; i <= M - 1; i++) { int head = (i - 1) * k / (M - 1); int tail = i * k / (M - 1); double[] y_sub = subvector(y, head, tail); double[] w_sub = subvector(w, head, tail); t[i - 1] = TransFunctions.r_sum(y_sub, w_sub); } double[] y_sub = subvector(y, k, n); double[] w_sub = subvector(w, k, n); t[M - 1] = TransFunctions.r_sum(y_sub, w_sub); return t; } public static double[] WFG2_t2(double[] y, int k) { int n = y.length; int l = n - k; assert Misc.vector_in_01(y); assert (k >= 1) && (k < n); assert l % 2 == 0; double[] t = new double[k + l / 2]; for (int i = 0; i < k; i++) { t[i] = y[i]; } for (int i = k + 1; i <= k + l / 2; i++) { int head = k + 2 * (i - k) - 2; int tail = k + 2 * (i - k); t[i - 1] = TransFunctions.r_nonsep(subvector(y, head, tail), 2); } return t; } public static double[] WFG2_t3(double[] y, int k, int M) { int n = y.length; assert Misc.vector_in_01(y); assert (k >= 1) && (k < n); assert M >= 2; assert k % (M - 1) == 0; double[] w = new double[n]; Arrays.fill(w, 1.0); double[] t = new double[M]; for (int i = 1; i <= M - 1; i++) { int head = (i - 1) * k / (M - 1); int tail = i * k / (M - 1); double[] y_sub = subvector(y, head, tail); double[] w_sub = subvector(w, head, tail); t[i - 1] = TransFunctions.r_sum(y_sub, w_sub); } double[] y_sub = subvector(y, k, n); double[] w_sub = subvector(w, k, n); t[M - 1] = TransFunctions.r_sum(y_sub, w_sub); return t; } public static double[] WFG4_t1(double[] y) { int n = y.length; assert Misc.vector_in_01(y); double[] t = new double[n]; for (int i = 0; i < n; i++) { t[i] = TransFunctions.s_multi(y[i], 30, 10, 0.35); } return t; } public static double[] WFG5_t1(double[] y) { int n = y.length; assert Misc.vector_in_01(y); double[] t = new double[n]; for (int i = 0; i < n; i++) { t[i] = TransFunctions.s_decept(y[i], 0.35, 0.001, 0.05); } return t; } public static double[] WFG6_t2(double[] y, int k, int M) { int n = y.length; assert Misc.vector_in_01(y); assert (k >= 1) && (k < n); assert M >= 2; assert k % (M - 1) == 0; double[] t = new double[M]; for (int i = 1; i <= M - 1; i++) { int head = (i - 1) * k / (M - 1); int tail = i * k / (M - 1); double[] y_sub = subvector(y, head, tail); t[i - 1] = TransFunctions.r_nonsep(y_sub, k / (M - 1)); } double[] y_sub = subvector(y, k, n); t[M - 1] = TransFunctions.r_nonsep(y_sub, n - k); return t; } public static double[] WFG7_t1(double[] y, int k) { int n = y.length; assert Misc.vector_in_01(y); assert (k >= 1) && (k < n); double[] w = new double[n]; Arrays.fill(w, 1.0); double[] t = new double[n]; for (int i = 0; i < k; i++) { double[] y_sub = subvector(y, i + 1, n); double[] w_sub = subvector(w, i + 1, n); double u = TransFunctions.r_sum(y_sub, w_sub); t[i] = TransFunctions.b_param(y[i], u, 0.98 / 49.98, 0.02, 50); } for (int i = k; i < n; i++) { t[i] = y[i]; } return t; } public static double[] WFG8_t1(double[] y, int k) { int n = y.length; assert Misc.vector_in_01(y); assert (k >= 1) && (k < n); double[] w = new double[n]; Arrays.fill(w, 1.0); double[] t = new double[n]; for (int i = 0; i < k; i++) { t[i] = y[i]; } for (int i = k; i < n; i++) { double[] y_sub = subvector(y, 0, i); double[] w_sub = subvector(w, 0, i); double u = TransFunctions.r_sum(y_sub, w_sub); t[i] = TransFunctions.b_param(y[i], u, 0.98 / 49.98, 0.02, 50); } return t; } public static double[] WFG9_t1(double[] y) { int n = y.length; assert Misc.vector_in_01(y); double[] w = new double[n]; Arrays.fill(w, 1.0); double[] t = new double[n]; for (int i = 0; i < n - 1; i++) { double[] y_sub = subvector(y, i + 1, n); double[] w_sub = subvector(w, i + 1, n); double u = TransFunctions.r_sum(y_sub, w_sub); t[i] = TransFunctions.b_param(y[i], u, 0.98 / 49.98, 0.02, 50); } t[n - 1] = y[n - 1]; return t; } public static double[] WFG9_t2(double[] y, int k) { int n = y.length; assert Misc.vector_in_01(y); assert (k >= 1) && (k < n); double[] t = new double[n]; for (int i = 0; i < k; i++) { t[i] = TransFunctions.s_decept(y[i], 0.35, 0.001, 0.05); } for (int i = k; i < n; i++) { t[i] = TransFunctions.s_multi(y[i], 30, 95, 0.35); } return t; } public static double[] I1_t2(double[] y, int k) { return WFG1_t1(y, k); } public static double[] I1_t3(double[] y, int k, int M) { return WFG2_t3(y, k, M); } public static double[] I2_t1(double[] y) { return WFG9_t1(y); } public static double[] I3_t1(double[] y) { int n = y.length; assert Misc.vector_in_01(y); double[] w = new double[n]; Arrays.fill(w, 1.0); double[] t = new double[n]; t[0] = y[0]; for (int i = 1; i < n; i++) { double[] y_sub = subvector(y, 0, i); double[] w_sub = subvector(w, 0, i); double u = TransFunctions.r_sum(y_sub, w_sub); t[i] = TransFunctions.b_param(y[i], u, 0.98 / 49.98, 0.02, 50); } return t; } public static double[] I4_t3(double[] y, int k, int M) { return WFG6_t2(y, k, M); } }