// mQAP.java // // Author: // Juan J. Durillo <juan@dps.uibk.ac.at> // // Copyright (c) 2011 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.problems.mqap; import jmetal.core.Problem; import jmetal.core.Solution; import jmetal.encodings.solutionType.PermutationSolutionType; import jmetal.encodings.variable.Permutation; import jmetal.util.JMException; /** * @author Juan J. Durillo * @version 1.0 * This class implements the mQAP problem. * Please notice that this class is also valid for the case m = 1 (mono-objective * version of the problem) */ public class mQAP extends Problem { int [][] a_matrix; int [][][] b_matrixs; public mQAP(String solutionType) { this(solutionType, "KC10-2fl-2rl.dat") ; } /** * Creates a new instance of problem mQAP. * @param fileName: name of the file containing the instance */ public mQAP(String solutionType, String fileName) { ReadInstance ri = new ReadInstance(fileName); ri.loadInstance(); // necessary step (because I say it :-)) numberOfVariables_ = 1; // the permutation numberOfObjectives_ = ri.getNumberOfObjectives(); numberOfConstraints_= 0; problemName_ = "mQAP"; a_matrix = ri.get_a_Matrix(); b_matrixs = ri.get_b_Matrixs(); upperLimit_ = new double[numberOfVariables_]; lowerLimit_ = new double[numberOfVariables_]; // Establishes upper and lower limits for the variables for (int var = 0; var < numberOfVariables_; var++) { lowerLimit_[var] = 0.0; upperLimit_[var] = ri.getNumberOfFacilities()-1; } // for // Establishes the length of every encodings.variable length_ = new int[numberOfVariables_]; for (int var = 0; var < numberOfVariables_; var++) { length_[var] = ri.getNumberOfFacilities(); } // for if (solutionType.compareTo("Permutation") == 0) solutionType_ = new PermutationSolutionType(this); else try { throw new JMException("SolutionType must be Permutation") ; } catch (JMException e) { e.printStackTrace(); } } // mQAP // evaluation of the problem public void evaluate(Solution solution) throws JMException { int [] permutation = ((Permutation)solution.getDecisionVariables()[0]).vector_; for (int k = 0; k < numberOfObjectives_; k++) { double aux = 0.0; for (int i = 0; i < a_matrix.length; i++) { for (int j = 0; j < a_matrix[i].length; j++) { aux += a_matrix[i][j] * b_matrixs[k][permutation[i]][permutation[j]]; } } solution.setObjective(k, aux); } } // evaluate } // mQAP