// Front.java // // Authors: // Antonio J. Nebro <antonio@lcc.uma.es> // Juan J. Durillo <durillo@lcc.uma.es> // // Copyright (c) 2013 Antonio J. Nebro, Juan J. Durillo // // This program 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. // // This program 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 this program. If not, see <http://www.gnu.org/licenses/>. // // CREDIT // This class is based on the code of the WFG group (http://www.wfg.csse.uwa.edu.au/hypervolume/) // Copyright (C) 2010 Lyndon While, Lucas Bradstreet. package jmetal.qualityIndicator.fastHypervolume.wfg; import jmetal.core.SolutionSet; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; /** * Created with IntelliJ IDEA. * User: antelverde * Date: 25/07/13 * Time: 16:26 * To change this template use File | Settings | File Templates. */ public class Front { private int numberOfPoints_ ; private int dimension_ ; public Point[] points_ ; private boolean maximizing_ ; public int nPoints_ ; private Comparator pointComparator ; public Front() { maximizing_ = true ; pointComparator = new PointComparator(maximizing_) ; } public Front (int numberOfPoints, int dimension, SolutionSet solutionSet) { maximizing_ = true ; pointComparator = new PointComparator(maximizing_) ; numberOfPoints_ = numberOfPoints ; dimension_ = dimension ; nPoints_ = numberOfPoints_ ; points_ = new Point[numberOfPoints_] ; for (int i = 0 ; i < numberOfPoints_; i++) { double [] p = new double[dimension] ; for (int j = 0 ; j < dimension; j++) { p[j] = solutionSet.get(i).getObjective(j) ; } points_[i] = new Point(p) ; } } public Front (int numberOfPoints, int dimension) { maximizing_ = true ; pointComparator = new PointComparator(maximizing_) ; numberOfPoints_ = numberOfPoints ; dimension_ = dimension ; nPoints_ = numberOfPoints_ ; points_ = new Point[numberOfPoints_] ; for (int i = 0 ; i < numberOfPoints_; i++) { double [] p = new double[dimension] ; for (int j = 0 ; j < dimension; j++) { p[j] = 0.0 ; } points_[i] = new Point(p) ; } } public Front(int numberOfPoints, int dimension, List<double[]> listOfPoints) { maximizing_ = true ; pointComparator = new PointComparator(maximizing_) ; numberOfPoints_ = numberOfPoints ; dimension_ = dimension ; points_ = new Point[numberOfPoints_] ; for (int i = 0 ; i < numberOfPoints_; i++) { points_[i] = new Point(listOfPoints.get(i)) ; } } public void readFront(String fileName) throws IOException { FileInputStream fis = new FileInputStream(fileName) ; InputStreamReader isr = new InputStreamReader(fis) ; BufferedReader br = new BufferedReader(isr) ; List<double []> list = new ArrayList<double []>(); int numberOfObjectives = 0; String aux = br.readLine(); while (aux!= null) { StringTokenizer st = new StringTokenizer(aux); int i = 0; numberOfObjectives = st.countTokens(); ////System.out.println("objectives: " + getNumberOfObjectives); double [] vector = new double[st.countTokens()]; while (st.hasMoreTokens()) { double value = new Double(st.nextToken()); vector[i] = value; i++; } list.add(vector); aux = br.readLine(); } numberOfPoints_ = list.size() ; dimension_ = numberOfObjectives ; points_ = new Point[numberOfPoints_] ; nPoints_ = numberOfPoints_ ; for (int i = 0 ; i < numberOfPoints_; i++) { points_[i] = new Point(list.get(i)) ; } } public void loadFront(SolutionSet solutionSet, int notLoadingIndex) { if (notLoadingIndex >= 0 && notLoadingIndex < solutionSet.size()) { numberOfPoints_ = solutionSet.size()-1; } else { numberOfPoints_ = solutionSet.size(); } nPoints_ = numberOfPoints_; dimension_ = solutionSet.get(0).getNumberOfObjectives(); points_ = new Point[numberOfPoints_]; int index = 0; for (int i = 0; i < solutionSet.size(); i++) { if (i != notLoadingIndex) { double [] vector = new double[dimension_]; for (int j = 0; j < dimension_; j++) { vector[j] = solutionSet.get(i).getObjective(j); } points_[index++] = new Point(vector); } } } public void printFront() { System.out.println("Objectives: " + dimension_) ; System.out.println("Number of points: " + numberOfPoints_) ; for (Point point : points_) { System.out.println(point) ; } } public int getNumberOfObjectives() { return dimension_ ; } public int getNumberOfPoints() { return numberOfPoints_; } public Point getPoint(int index) { return points_[index] ; } public Point[] getPoints() { return points_ ; } public void setToMazimize() { maximizing_ = true ; pointComparator = new PointComparator(maximizing_) ; } public void setToMinimize() { maximizing_ = false ; pointComparator = new PointComparator(maximizing_) ; } public void sort() { Arrays.sort(points_, pointComparator); } public Point getReferencePoint() { Point referencePoint = new Point(dimension_) ; double [] maxObjectives = new double[numberOfPoints_] ; for (int i = 0; i < numberOfPoints_; i++) maxObjectives[i] = 0 ; for (int i = 0; i < points_.length; i++) for (int j = 0 ; j < dimension_; j++) if (maxObjectives[j] < points_[i].objectives_[j]) maxObjectives[j] = points_[i].objectives_[j] ; //for (int i = 0; i < solution.getNumberOfObjectives(); i++) { // if (maxObjectives[i] < referencePoint_.objectives_[i]) // referencePoint_.objectives_[i] = maxObjectives[i] ; // // } for (int i = 0; i < dimension_; i++) referencePoint.objectives_[i] = maxObjectives[i] ; return referencePoint ; } }