11 state->getRegistry()->registerEntry(
"tsp.infile", (voidP) (
new std::string), ECF::STRING);
17 if(!state->getRegistry()->isModified(
"tsp.infile")) {
18 state->getLogger()->log(1,
"Error: no input file defined for TSP! (parameter 'tsp.infile'");
22 voidP sptr = state->getRegistry()->getEntry(
"tsp.infile");
23 std::string filePath = *((std::string*) sptr.get());
25 std::ifstream iFile(filePath.c_str());
27 if(!iFile.is_open()) {
28 state->getLogger()->log(1,
"Error: can't open input file " + filePath);
35 }
while(line.find(
"DIMENSION",0) == std::string::npos);
36 std::stringstream ss(line.substr(line.find(
":") + 1));
40 state->getRegistry()->modifyEntry(
"Permutation.size", (voidP)
new uint(dimension));
43 state->getPopulation()->initialize(state);
48 }
while(line.find(
"EDGE_WEIGHT_TYPE",0) == std::string::npos);
49 std::stringstream ss_type(line.substr(line.find(
":") + 1));
53 if(dataType ==
"EUC_2D") {
58 }
while(line.find(
"NODE_COORD_SECTION",0) == std::string::npos);
60 coordinates.resize(dimension);
61 for(
int i = 0; i < dimension; i++) {
62 coordinates[i].resize(2);
65 iFile >> coordinates[i][0];
66 iFile >> coordinates[i][1];
69 weights.resize(dimension);
70 for(
int i = 0; i < dimension; i++) {
71 weights[i].resize(dimension);
72 for(
int j = 0; j < dimension; j++) {
73 double diffX = coordinates[i][0] - coordinates[j][0];
74 double diffY = coordinates[i][1] - coordinates[j][1];
75 weights[i][j] = (int) (0.5 + sqrt(1. * diffX * diffX + diffY * diffY));
80 }
else if (dataType ==
"EXPLICIT") {
83 }
while(line.find(
"EDGE_WEIGHT_FORMAT",0) == std::string::npos);
84 std::stringstream ss_format(line.substr(line.find(
":") + 1));
86 ss_format >> dataFormat;
87 if(dataFormat ==
"FULL_MATRIX") {
91 }
while(line.find(
"EDGE_WEIGHT_SECTION",0) == std::string::npos);
93 weights.resize(dimension);
94 for(
int i = 0; i < dimension; i++) {
95 weights[i].resize(dimension);
96 for(
int j = 0; j < dimension; j++) {
97 iFile >> weights[i][j];
107 state->getLogger()->log(1,
"TSP initializer: can't recognize TSP data in " + filePath
108 +
"\n(supported TSP instances: \n\t- type \"EDGE_WEIGHT_TYPE: EUC_2D\" \n\t- type \"EDGE_WEIGHT_TYPE: EXPLICIT\" with "
109 +
"\"EDGE_WEIGHT_FORMAT: FULL_MATRIX\")");
126 uint size = (uint) perm->variables.size();
127 for(uint i = 0; i < size - 1; i++){
129 fitnessV += weights[perm->variables[i]][perm->variables[i + 1]];
131 fitnessV += weights[perm->variables[0]][perm->variables[dimension - 1]];
133 fitness->setValue(fitnessV);
Fitness for minimization problems.
Permutation class - implements genotype as a vector of indices 0..(n-1) (permutation of indices)
bool initialize(StateP)
Initialize the evaluator. Called before first evaluation occurs.
void registerParameters(StateP)
Register evaluator parameters. Called before EvaluateOp::initialize method.
FitnessP evaluate(IndividualP individual)
Evaluate a single individual. Method must create and return a Fitness object.