// MOTSP.java
//
// Author:
// Juan J. Durillo <durillo@lcc.uma.es>
//
// Copyright (c) 2011 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/>.
package jmetal.problems;
import jmetal.core.Problem;
import jmetal.core.Solution;
import jmetal.encodings.solutionType.PermutationSolutionType;
import jmetal.encodings.variable.Permutation;
import java.io.*;
/**
* Class representing a multi-objective TSP (Traveling Salesman Problem) problem.
* This class is tested with two objectives and the KROA150 and KROB150
* instances of TSPLIB
*/
public class mTSP extends Problem {
public int numberOfCities_ ;
public double [][] distanceMatrix_ ;
public double [][] costMatrix_;
/**
* Creates a new mTSP problem instance. It accepts data files from TSPLIB
*/
public mTSP(String solutionType,
String file_distances,
String file_cost) throws IOException {
numberOfVariables_ = 1;
numberOfObjectives_ = 2;
numberOfConstraints_= 0;
problemName_ = "mTSP";
//variableType_ = new Class[numberOfVariables_] ;
length_ = new int[numberOfVariables_];
//variableType_[0] = Class.forName("jmetal.base.encodings.variable.Permutation") ;
distanceMatrix_ = readProblem(file_distances) ;
costMatrix_ = readProblem(file_cost);
System.out.println(numberOfCities_) ;
length_ [0] = numberOfCities_ ;
if (solutionType.compareTo("Permutation") == 0)
solutionType_ = new PermutationSolutionType(this) ;
else {
System.out.println("Error: solution type " + solutionType + " invalid") ;
System.exit(-1) ;
}
} // mTSP
/**
* Evaluates a solution
* @param solution The solution to evaluate
*/
public void evaluate(Solution solution) {
double fitness1 ;
double fitness2 ;
fitness1 = 0.0 ;
fitness2 = 0.0 ;
for (int i = 0; i < (numberOfCities_ - 1); i++) {
int x ;
int y ;
x = ((Permutation)solution.getDecisionVariables()[0]).vector_[i] ;
y = ((Permutation)solution.getDecisionVariables()[0]).vector_[i+1] ;
// cout << "I : " << i << ", x = " << x << ", y = " << y << endl ;
fitness1 += distanceMatrix_[x][y] ;
fitness2 += costMatrix_[x][y];
} // for
int firstCity ;
int lastCity ;
firstCity = ((Permutation)solution.getDecisionVariables()[0]).vector_[0] ;
lastCity = ((Permutation)solution.getDecisionVariables()[0]).vector_[numberOfCities_ - 1] ;
fitness1 += distanceMatrix_[firstCity][lastCity] ;
fitness2 += costMatrix_[firstCity][lastCity];
solution.setObjective(0, fitness1);
solution.setObjective(1, fitness2);
} // evaluate
public double [][] readProblem(String file) throws
IOException {
double [][] matrix = null;
Reader inputFile = new BufferedReader(
new InputStreamReader(
new FileInputStream(file)));
StreamTokenizer token = new StreamTokenizer(inputFile);
try {
boolean found ;
found = false ;
token.nextToken();
while(!found) {
if ((token.sval != null) && ((token.sval.compareTo("DIMENSION") == 0)))
found = true ;
else
token.nextToken() ;
} // while
token.nextToken() ;
token.nextToken() ;
numberOfCities_ = (int)token.nval ;
matrix = new double[numberOfCities_][numberOfCities_] ;
// Find the string SECTION
found = false ;
token.nextToken();
while(!found) {
if ((token.sval != null) &&
((token.sval.compareTo("SECTION") == 0)))
found = true ;
else
token.nextToken() ;
} // while
// Read the data
double [] c = new double[2*numberOfCities_] ;
for (int i = 0; i < numberOfCities_; i++) {
token.nextToken() ;
int j = (int)token.nval ;
token.nextToken() ;
c[2*(j-1)] = token.nval ;
token.nextToken() ;
c[2*(j-1)+1] = token.nval ;
} // for
double dist ;
for (int k = 0; k < numberOfCities_; k++) {
matrix[k][k] = 0;
for (int j = k + 1; j < numberOfCities_; j++) {
dist = Math.sqrt(Math.pow((c[k*2]-c[j*2]),2.0) +
Math.pow((c[k*2+1]-c[j*2+1]), 2));
dist = (int)(dist + .5);
matrix[k][j] = dist;
matrix[j][k] = dist;
} // for
} // for
} // try
catch (Exception e) {
System.err.println ("TSP.readProblem(): error when reading data file "+e);
System.exit(1);
} // catch
return matrix;
} // readProblem
} // mTSP