// ExtractParetoFront.java // // Author: // Juan J. Durillo <durillo@lcc.uma.es> // // Copyright (c) 2012 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/>. package jmetal.util; import java.io.*; import java.util.*; /** * This class extract the Pareto front among a set of dominated and * non-dominated solutions */ public class ExtractParetoFront { String fileName_; int dimensions_; List<Point> points_ = new LinkedList<Point>(); private class Point { double [] vector_; public Point (double [] vector) { vector_ = vector; } public Point (int size) { vector_ = new double[size]; for (int i = 0; i < size; i++) vector_[i] = 0.0f; } } /** * @author Juan J. Durillo * Creates a new instance * @param name: the name of the file */ public ExtractParetoFront(String name, int dimensions) { fileName_ = name; dimensions_ = dimensions; loadInstance(); } // ReadInstance /** * Read the points instance from file */ public void loadInstance() { try { File archivo = new File(fileName_); FileReader fr = null; BufferedReader br = null; fr = new FileReader (archivo); br = new BufferedReader(fr); // File reading String line; int lineCnt = 0; line = br.readLine(); // reading the first line (special case) while (line!=null) { StringTokenizer st = new StringTokenizer(line); try { Point auxPoint = new Point(dimensions_); for (int i = 0; i < dimensions_; i++) { auxPoint.vector_[i] = new Double(st.nextToken()); } add(auxPoint); line = br.readLine(); lineCnt++; } catch (NumberFormatException e) { System.err.println("Number in a wrong format in line "+lineCnt); System.err.println(line); line = br.readLine(); lineCnt++; } catch (NoSuchElementException e2) { System.err.println("Line "+lineCnt+" does not have the right number of objectives"); System.err.println(line); line = br.readLine(); lineCnt++; } } br.close(); } catch (FileNotFoundException e3) { System.err.println("The file " + fileName_+ " has not been found in your file system"); } catch (IOException e3) { System.err.println("The file " + fileName_+ " has not been found in your file system"); } } // loadInstance public void add(Point point) { Iterator<Point> iterator = points_.iterator(); while (iterator.hasNext()){ Point auxPoint = iterator.next(); int flag = compare(point,auxPoint); if (flag == -1) { // A solution in the list is dominated by the new one iterator.remove(); } else if (flag == 1) { // The solution is dominated return; } } // while points_.add(point); } // add public int compare(Point one, Point two) { int flag1 = 0, flag2 = 0; for (int i = 0; i < dimensions_; i++) { if (one.vector_[i] < two.vector_[i]) flag1 = 1; if (one.vector_[i] > two.vector_[i]) flag2 = 1; } if (flag1 > flag2) // one dominates return -1; if (flag2 > flag1) // two dominates return 1; return 0; // both are non dominated } public void writeParetoFront() { try { /* Open the file */ FileOutputStream fos = new FileOutputStream(fileName_+".pf") ; OutputStreamWriter osw = new OutputStreamWriter(fos) ; BufferedWriter bw = new BufferedWriter(osw) ; for (Point auxPoint : points_) { String aux = ""; for (int i = 0; i < auxPoint.vector_.length; i++) { aux += auxPoint.vector_[i] + " "; } bw.write(aux); bw.newLine(); } /* Close the file */ bw.close(); }catch (IOException e) { e.printStackTrace(); } } public static void main(String [] args) { if (args.length != 2) { System.out.println("Wrong number of arguments: "); System.out.println("Sintaxt: java ExtractParetoFront <file> <dimensions>"); System.out.println("\t<file> is a file containing points"); System.out.println("\t<dimensions> represents the number of dimensions of the problem"); System.exit(-1) ; } ExtractParetoFront epf = new ExtractParetoFront(args[0], new Integer(args[1])); epf.writeParetoFront(); } }