Skip to content

Commit

Permalink
fix: cleanup main file TSPInfo struct and city print order
Browse files Browse the repository at this point in the history
  • Loading branch information
Akhil-CM committed Apr 23, 2024
1 parent 11a40d9 commit dffccf5
Show file tree
Hide file tree
Showing 6 changed files with 124 additions and 100 deletions.
34 changes: 17 additions & 17 deletions DiscreteENN_TSP_table.csv
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
name,distance,points,error,time(ms)
pr1002,0.000000,0.000000,0.000000,0.000000
pcb442,0.000000,0.000000,0.000000,0.000000
a280,0.000000,0.000000,0.000000,0.000000
eil76,0.000000,0.000000,0.000000,0.000000
pr76,0.000000,0.000000,0.000000,0.000000
kroA100,0.000000,0.000000,0.000000,0.000000
pr2392,0.000000,0.000000,0.000000,0.000000
st70,0.000000,0.000000,0.000000,0.000000
kroC100,0.000000,0.000000,0.000000,0.000000
kroD100,0.000000,0.000000,0.000000,0.000000
berlin52,0.000000,0.000000,0.000000,0.000000
eil101,0.000000,0.000000,0.000000,0.000000
rd100,0.000000,0.000000,0.000000,0.000000
lin105,0.000000,0.000000,0.000000,0.000000
ch130,0.000000,0.000000,0.000000,0.000000
ch150,7041.896484,150.000000,0.078722,6.000000
tsp225,0.000000,0.000000,0.000000,0.000000
berlin52 7829.626953 52 0.038137 0.000000
st70 726.924805 70 0.076926 0.000000
eil76 558.307068 76 0.037745 0.000000
pr76 113754.250000 76 0.051732 0.000000
kroA100 22252.736328 100 0.045613 3.000000
kroC100 21703.613281 100 0.046008 1.000000
kroD100 22901.234375 100 0.075478 2.000000
rd100 8139.900879 100 0.029065 2.000000
eil101 680.373535 101 0.081675 1.000000
lin105 15248.319336 105 0.060458 1.000000
ch130 6411.528320 130 0.049350 3.000000
ch150 6940.267090 150 0.063154 7.000000
tsp225 2732.529053 126 0.302214 2.000000
a280 1764.130981 181 0.315963 7.000000
pcb442 54524.789062 442 0.073788 2546.000000
pr1002 278834.812500 1002 0.076395 1964.000000
pr2392 417196.437500 2392 0.103601 2071604.000000
34 changes: 17 additions & 17 deletions DiscreteENN_TSP_table.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
name distance points error time(ms)
pr1002 0.000000 0.000000 0.000000 0.000000
pcb442 0.000000 0.000000 0.000000 0.000000
a280 0.000000 0.000000 0.000000 0.000000
eil76 0.000000 0.000000 0.000000 0.000000
pr76 0.000000 0.000000 0.000000 0.000000
kroA100 0.000000 0.000000 0.000000 0.000000
pr2392 0.000000 0.000000 0.000000 0.000000
st70 0.000000 0.000000 0.000000 0.000000
kroC100 0.000000 0.000000 0.000000 0.000000
kroD100 0.000000 0.000000 0.000000 0.000000
berlin52 0.000000 0.000000 0.000000 0.000000
eil101 0.000000 0.000000 0.000000 0.000000
rd100 0.000000 0.000000 0.000000 0.000000
lin105 0.000000 0.000000 0.000000 0.000000
ch130 0.000000 0.000000 0.000000 0.000000
ch150 7041.896484 150.000000 0.078722 6.000000
tsp225 0.000000 0.000000 0.000000 0.000000
berlin52 7829.626953 52 0.038137 0.000000
st70 726.924805 70 0.076926 0.000000
eil76 558.307068 76 0.037745 0.000000
pr76 113754.250000 76 0.051732 0.000000
kroA100 22252.736328 100 0.045613 3.000000
kroC100 21703.613281 100 0.046008 1.000000
kroD100 22901.234375 100 0.075478 2.000000
rd100 8139.900879 100 0.029065 2.000000
eil101 680.373535 101 0.081675 1.000000
lin105 15248.319336 105 0.060458 1.000000
ch130 6411.528320 130 0.049350 3.000000
ch150 6940.267090 150 0.063154 7.000000
tsp225 2732.529053 126 0.302214 2.000000
a280 1764.130981 181 0.315963 7.000000
pcb442 54524.789062 442 0.073788 2546.000000
pr1002 278834.812500 1002 0.076395 1964.000000
pr2392 417196.437500 2392 0.103601 2071604.000000
Binary file modified a.out
Binary file not shown.
107 changes: 57 additions & 50 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,10 @@ const std::string& Data_Filename_berlin{ "berlin52.tsp" };

int runPipelineSingle(const stdfs::path& data_path,
std::default_random_engine& rng, bool draw,
bool show_coords, DistanceMap_t::mapped_type& distance);
bool show_coords, TSPInfo& info);
int runPipelineDir(const stdfs::path& data_path,
std::default_random_engine& rng, bool draw, bool show_coords,
DistanceMap_t& distance_map,
const DistanceMap_t& opt_distance_map);
TSPInfoVect_t& infos, const TSPInfoVect_t& opt_infos);

int main(int argc, char** argv)
{
Expand All @@ -48,8 +47,8 @@ int main(int argc, char** argv)
// -------------------------------------------
// Read optimal distances
// -------------------------------------------
DistanceMap_t optimal_distance_map;
if (not readDistances(Data_Optimal_Path.string(), optimal_distance_map)) {
TSPInfoVect_t optimal_infos;
if (not readDistances(Data_Optimal_Path.string(), optimal_infos)) {
utils::printErr("Couldn't read optimal distances from " +
Data_Optimal_Path.string(),
"main");
Expand Down Expand Up @@ -82,34 +81,35 @@ int main(int argc, char** argv)
}

int runs_failed;
DistanceMap_t distance_map;
TSPInfoVect_t infos;
infos.reserve(optimal_infos.size());
if (single_input) {
stdfs::path Data_FilePath = Data_Path / stdfs::path(Data_Filename);
DistanceMap_t::mapped_type info{};
TSPInfo info{};
runs_failed =
runPipelineSingle(Data_FilePath, rng, draw_path, draw_coords, info);
if (runs_failed == 0) {
const std::string& filename{ Data_FilePath.stem().string() };
distance_map[filename] = info;
infos.push_back(info);
} else {
utils::printErr("Single input pipeline failed for Data_FilePath: " +
Data_FilePath.string(),
"main");
}
} else {
runs_failed = runPipelineDir(Data_Path, rng, draw_path, draw_coords,
distance_map, optimal_distance_map);
infos, optimal_infos);
}
if (runs_failed != 0) {
utils::printErr("Runs failed: " + std::to_string(runs_failed) +
" Data_Path: " + Data_Path.string(),
"main");
return EXIT_FAILURE;
}
for (auto it{ distance_map.begin() }; it != distance_map.end(); ++it) {
const auto [name, info] = *it;
if (optimal_distance_map.count(name) == 0) {
utils::printErr("data name : " + name +
for (auto it{ infos.begin() }; it != infos.end(); ++it) {
TSPInfo& info{ *it };
int opt_info_pos{ utils::vectFind(info, optimal_infos) };
if (opt_info_pos == -1) {
utils::printErr("data name : " + info.m_name +
" not found in optimal_distance_map",
"main");
continue;
Expand All @@ -118,42 +118,46 @@ int main(int argc, char** argv)
// utils::printInfo("skipping file pr2392 because of long run time.", "runPipelineDir");
// continue;;
// }
auto& optimal_info{ optimal_distance_map[name] };
const auto error =
std::abs(info[0] - optimal_info[0]) / optimal_info[0];
distance_map[name][2] = error;
TSPInfo& optimal_info{
optimal_infos[static_cast<std::size_t>(opt_info_pos)]
};
const auto error = std::abs(info.m_distance - optimal_info.m_distance) /
optimal_info.m_distance;
info.m_error = error*100;
}
utils::printInfo("name\tdistance\tpoints\terror\ttime(ms)");
for (auto it{ optimal_distance_map.begin() };
it != optimal_distance_map.end(); ++it) {
const auto [name, discard] = *it;
const auto info{ distance_map[name] };
utils::printInfo(name + "\t" + std::to_string(info[0]) + "\t" +
std::to_string(info[1]) + "\t" +
std::to_string(info[2]) + "\t" +
std::to_string(info[3]));
for (auto it{ optimal_infos.begin() }; it != optimal_infos.end(); ++it) {
TSPInfo& opt_info{ *it };
int info_pos{ utils::vectFind(opt_info, infos) };
TSPInfo& info{ infos[static_cast<std::size_t>(info_pos)] };
utils::printInfo(info.m_name + "\t" + std::to_string(info.m_distance) +
"\t" + std::to_string(info.m_points) + "\t" +
std::to_string(info.m_error) + "\t" +
std::to_string(info.m_time));
}
std::ofstream table_file{ "DiscreteENN_TSP_table.txt" };
table_file << "name\tdistance\tpoints\terror\ttime(ms)\n";
for (auto it{ optimal_distance_map.begin() };
it != optimal_distance_map.end(); ++it) {
const auto [name, discard] = *it;
const auto info{ distance_map[name] };
table_file << (name + "\t" + std::to_string(info[0]) + "\t" +
std::to_string(info[1]) + "\t" +
std::to_string(info[2]) + "\t" + std::to_string(info[3]))
for (auto it{ optimal_infos.begin() }; it != optimal_infos.end(); ++it) {
TSPInfo& opt_info{ *it };
int info_pos{ utils::vectFind(opt_info, infos) };
TSPInfo& info{ infos[static_cast<std::size_t>(info_pos)] };
table_file << (info.m_name + "\t" + std::to_string(info.m_distance) +
"\t" + std::to_string(info.m_points) + "\t" +
std::to_string(info.m_error) + "\t" +
std::to_string(info.m_time))
<< std::endl;
}
table_file.close();
std::ofstream csv_file{ "DiscreteENN_TSP_table.csv" };
csv_file << "name,distance,points,error,time(ms)\n";
for (auto it{ optimal_distance_map.begin() };
it != optimal_distance_map.end(); ++it) {
const auto [name, discard] = *it;
const auto info{ distance_map[name] };
csv_file << (name + "," + std::to_string(info[0]) + "," +
std::to_string(info[1]) + "," + std::to_string(info[2]) +
"," + std::to_string(info[3]))
for (auto it{ optimal_infos.begin() }; it != optimal_infos.end(); ++it) {
TSPInfo& opt_info{ *it };
int info_pos{ utils::vectFind(opt_info, infos) };
TSPInfo& info{ infos[static_cast<std::size_t>(info_pos)] };
csv_file << (info.m_name + "\t" + std::to_string(info.m_distance) +
"\t" + std::to_string(info.m_points) + "\t" +
std::to_string(info.m_error) + "\t" +
std::to_string(info.m_time))
<< std::endl;
}
csv_file.close();
Expand All @@ -163,16 +167,15 @@ int main(int argc, char** argv)

int runPipelineDir(const stdfs::path& data_path,
std::default_random_engine& rng, bool draw, bool show_coords,
DistanceMap_t& distance_map,
const DistanceMap_t& opt_distance_map)
TSPInfoVect_t& infos, const TSPInfoVect_t& opt_infos)
{
if (not stdfs::is_directory(data_path)) {
utils::printErr("provided path " + data_path.string() +
" doesn't exit.",
"runPipelineDir");
return 1;
}
distance_map.clear();
infos.clear();
int runs_failed{ 0 };
for (const auto& entry : stdfs::directory_iterator(data_path)) {
const auto filepath = entry.path();
Expand All @@ -181,8 +184,11 @@ int runPipelineDir(const stdfs::path& data_path,
"runPipelineDir");
continue;
}
TSPInfo info;
const std::string& filename{ filepath.stem().string() };
if (opt_distance_map.count(filename) == 0) {
info.m_name = filename;
int opt_info_pos{ utils::vectFind(info, opt_infos) };
if (opt_info_pos == -1) {
utils::printInfo("skipping file " + filepath.string() +
" without optimal distance for TSP.",
"runPipelineDir");
Expand All @@ -192,22 +198,21 @@ int runPipelineDir(const stdfs::path& data_path,
// utils::printInfo("skipping file pr2392 because of long run time.", "runPipelineDir");
// continue;;
// }
DistanceMap_t::mapped_type info{};
if (runPipelineSingle(filepath, rng, draw, show_coords, info) != 0) {
utils::printErr("pipeline failed for the path " + filepath.string(),
"runPipelineDir");
++runs_failed;
continue;
}
distance_map[filename] = info;
infos.push_back(info);
}

return runs_failed;
}

int runPipelineSingle(const stdfs::path& data_path,
std::default_random_engine& rng, bool draw,
bool show_coords, DistanceMap_t::mapped_type& info)
bool show_coords, TSPInfo& info)
{
utils::printInfo("Running algorithm for " + data_path.string(),
"runPipelineSingle");
Expand Down Expand Up @@ -335,9 +340,11 @@ int runPipelineSingle(const stdfs::path& data_path,
enn_tsp.properIndex(idx + 1)) };
dist += getDistance(*path[idx], *path[idx_next]);
}
info[0] = dist;
info[1] = num_cities;
info[3] = duration;
const std::string& filename{ data_path.stem().string() };
info.m_name = filename;
info.m_distance = dist;
info.m_points = num_cities;
info.m_time = duration;
std::cout << "\n" + utils::Line_Str + "\n";
std::cout << "[Info]: Total distance is : " << dist << '\n';
std::cout << utils::Line_Str + "\n";
Expand Down
39 changes: 23 additions & 16 deletions tsp_discrete_enn.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
#include <fstream>
#include <sstream>
#include <random>
#include <algorithm>
#include <numeric>
#include <map>
#include <unordered_map>
Expand Down Expand Up @@ -321,7 +320,7 @@ inline Value_t getDistance(const City& a, const City& b)
}

inline Value_t insertionCost(const City& new_city, const City& cityA,
const City& cityB)
const City& cityB)
{
return getDistance(new_city, cityA) + getDistance(new_city, cityB) -
getDistance(cityA, cityB);
Expand Down Expand Up @@ -402,11 +401,7 @@ class DiscreteENN_TSP

int findNode(Node_t node)
{
const Path_t::const_iterator& it_begin{ m_path.begin() };
const Path_t::const_iterator& it_end{ m_path.end() };
const Path_t::const_iterator& it =
std::find_if(it_begin, it_end, utils::MatchItem<Node_t>{ node });
return (it == it_end) ? -1 : std::distance(it_begin, it);
return utils::vectFind(node, m_path);
}

void removeNode(int index)
Expand Down Expand Up @@ -1197,45 +1192,57 @@ void drawPath(const Path_t& path, const Cities_t& stack, bool show_coords)
}
}

typedef std::unordered_map<std::string, std::array<Value_t, 4>> DistanceMap_t;
bool readDistances(const std::string& filename, DistanceMap_t& distance_map)
struct TSPInfo
{
int m_points{ -1 };
Value_t m_distance{ VALUE_ONE_NEG };
Value_t m_error{ VALUE_ONE_NEG };
Value_t m_time{ VALUE_ONE_NEG };
Value_t m_timePerCity{ VALUE_ONE_NEG };
std::string m_name{ "" };
};
template <> inline bool utils::MatchItem<TSPInfo>::operator()(const TSPInfo& info)
{
return (info.m_name == m_item.m_name);
}
typedef std::vector<TSPInfo> TSPInfoVect_t;

bool readDistances(const std::string& filename, TSPInfoVect_t& infos)
{
std::ifstream file{ filename };
if (not file) {
utils::printErr("couldn't read file : " + filename, "readDistances");
return false;
}
distance_map.clear();
infos.clear();
std::string line, word;
int line_count{ 0 }, line_num{ 0 };
std::string name;
TSPInfo info;
while (std::getline(file, line)) {
if (line.empty())
continue;
std::stringstream line_stream{ line };
if (not std::getline(line_stream, word, ',')) {
continue;
;
}
utils::Str2Num index{ word };
if (not std::getline(line_stream, word, ',')) {
continue;
;
}
name = word;
if (not std::getline(line_stream, word, ',')) {
continue;
;
}
utils::Str2Num distance{ word };
if (not index.has_value() or not distance.has_value()) {
continue;
;
}
++line_count;
line_num = index.value();
distance_map[name] =
DistanceMap_t::mapped_type{ static_cast<float>(distance.value()) };
info.m_name = name;
info.m_distance = static_cast<Value_t>(distance.value());
infos.push_back(info);
}
utils::printInfo(
"Distance parsed from " + filename +
Expand Down
Loading

0 comments on commit dffccf5

Please sign in to comment.