// TSP.java
//
// Author:
// Antonio J. Nebro <antonio@lcc.uma.es>
// 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.singleObjective;
import jmetal.core.Problem;
import jmetal.core.Solution;
import jmetal.encodings.solutionType.PermutationSolutionType;
import jmetal.encodings.variable.Permutation;
import jmetal.util.JMException;
import java.io.*;
/**
* Class representing a TSP (Traveling Salesman Problem) problem.
*/
public class TSP extends Problem {
public int numberOfCities_ ;
public double [][] distanceMatrix_ ;
public TSP(String solutionType){
this(solutionType, "eil101.tsp") ;
}
/**
* Creates a new TSP problem instance. It accepts data files from TSPLIB
* @param filename The file containing the definition of the problem
*/
public TSP(String solutionType, String filename) {
numberOfVariables_ = 1;
numberOfObjectives_ = 1;
numberOfConstraints_= 0;
problemName_ = "TSP";
solutionType_ = new PermutationSolutionType(this) ;
length_ = new int[numberOfVariables_];
try {
if (solutionType.compareTo("Permutation") == 0)
solutionType_ = new PermutationSolutionType(this) ;
else {
throw new JMException("Solution type invalid") ;
}
} catch (JMException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
try {
readProblem(filename) ;
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
System.out.println(numberOfCities_) ;
length_ [0] = numberOfCities_ ;
} // TSP
/**
* Evaluates a solution
* @param solution The solution to evaluate
*/
public void evaluate(Solution solution) {
double fitness ;
fitness = 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 ;
fitness += distanceMatrix_[x][y] ;
} // for
int firstCity ;
int lastCity ;
firstCity = ((Permutation)solution.getDecisionVariables()[0]).vector_[0] ;
lastCity = ((Permutation)solution.getDecisionVariables()[0]).vector_[numberOfCities_ - 1] ;
fitness += distanceMatrix_[firstCity][lastCity] ;
solution.setObjective(0, fitness);
} // evaluate
public void readProblem(String fileName) throws
IOException {
Reader inputFile = new BufferedReader(
new InputStreamReader(
new FileInputStream(fileName)));
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 ;
distanceMatrix_ = 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++) {
distanceMatrix_[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);
distanceMatrix_[k][j] = dist;
distanceMatrix_[j][k] = dist;
} // for
} // for
} // try
catch (Exception e) {
System.err.println ("TSP.readProblem(): error when reading data file "+e);
System.exit(1);
} // catch
} // readProblem
} // TSP