Skip to content
Snippets Groups Projects
Commit 12f44c1b authored by tobiglaser's avatar tobiglaser
Browse files

enhanced TSP example

parent ff5d8191
No related merge requests found
......@@ -19,8 +19,11 @@ void setup()
setProblemSize(15);
setPlotTheme(3);
setPlotVisible(1, false);
setPlotVisible(2, false);
setPlotVisible(2, true);
setPlotTitle(0, "Travelling Salesman Problem");
setAxisVisible(0, false, false);
setPlotTitle(2, "Runtime");
setAxisTitles(2, "Problem Size n", "Runtime / µs");
}
float length(const Point& a, const Point& b)
......@@ -44,6 +47,22 @@ float circ_pythagoras(const vector<pair<int, Point>>& vec)
return sum;
}
float circ_pythagoras(const vector<Point>& vec)
{
float sum = 0;
for (size_t i = 0; i < (vec.size() - 1); ++i)
{
float distance = length(vec[i], vec[i + 1]);
sum += distance;
}
if (vec.back().x != vec.front().x || vec.back().y != vec.front().y)
{
float distance = length(vec.back(), vec.front()); //close circle
sum += distance;
}
return sum;
}
namespace global
{
vector<Point> result;
......@@ -65,9 +84,19 @@ void plotMyVectorLines(vector<pair<int, Point>>& vec, int plot, bool loop)
void bruteForce()
{
resetPlot(0);
vector<Point> data = getProblemData2D();
plotPoints(data);
plotLines(data);
vector<Point> data = getProblemData2D();
PlotProperties start;
start.shape = rectangle;
start.color = Colors::darkMagenta;
start.legend = true;
start.name = "Start";
start.onTop = true;
if (verbosity() >= Verbosity::result)
{
plotPoints(data);
plotPoint(data.front(), 0, start, "");
plotLines(data);
}
long long n_fac = 1;
for (size_t i = 1; i <= data.size() - 1; n_fac *= i++)
......@@ -89,13 +118,17 @@ void bruteForce()
timerStart();
do
{
int circ = circ_pythagoras(vec);
float circ = circ_pythagoras(vec);
if (circ < bestCirc)
{
bestCirc = circ;
bestVec = vec;
undo(0);
plotMyVectorLines(vec, 0, true);
if (verbosity() >= partialResult)
{
undo(0);
delay(5);
plotMyVectorLines(vec, 0, true);
}
}
if (++i % 1000 == 0)
{
......@@ -107,10 +140,27 @@ void bruteForce()
return a.first > b.first;
}));
timerStop();
if (verbosity() >= Verbosity::result)
{
undo(0);
undo(0);
plotMyVectorLines(bestVec, 0, true);
}
logMessage(std::to_string(timerResult().count() / 1000.) + "ms");
setStatusMessage(to_string(i) + " of " + to_string(n_fac));
setProgress(100 * i / n_fac);
logMessage("DONE grrr");
if (ok())
{
std::string s;
s = "BruteForce: ";
s += to_string(data.size()) + " Points in ";
s += to_string(timerResult().count()) + "us with Distance: ";
s += to_string(bestCirc);
logMessage(s);
PlotProperties p;
p.color = Colors::red;
plotPoint({(float)data.size(), (float)timerResult().count()}, 2, p, "BruteForce @X, @Yus)");
}
}
......@@ -125,7 +175,10 @@ void nearestNeighbour()
PlotProperties Pp;
Pp.color = Colors::darkRed;
Pp.onTop = true;
plotPoints(points, 0, Pp);
if (verbosity() >= Verbosity::result)
{
plotPoints(points, 0, Pp);
}
PlotProperties Lp;
Lp.color = Colors::green;
......@@ -140,7 +193,8 @@ void nearestNeighbour()
setProgress(100 * i / points.size());
setStatusMessage(to_string(i) + " of " + to_string(input.size()));
while (input.size() > 0)
timerStart();
while (input.size() > 0 && ok())
{
++i;
int bestDist = INT_MAX;
......@@ -158,34 +212,87 @@ void nearestNeighbour()
currentPoint = *bestIter;
result.push_back(*bestIter);
input.erase(bestIter);
plotLines(result, 0, false, Lp);
delay(300);
undo(0);
setStatusMessage(to_string(i) + " of " + to_string(points.size()));
setProgress(100 * i / points.size());
if (verbosity() >= verbose)
{
plotLines(result, 0, false, Lp);
delay(300);
undo(0);
setStatusMessage(to_string(i) + " of " + to_string(points.size()));
setProgress(100 * i / points.size());
}
}
timerStop();
if (verbosity() >= Verbosity::result)
{
Lp.color = Colors::darkCyan;
Lp.name = "NN";
plotLines(result, 0, true, Lp);
}
Lp.color = Colors::cyan;
Lp.name = "NN";
plotLines(result, 0, true, Lp);
setStatusMessage("DONE! :D");
std::string s;
if (ok())
{
s = "NearestNeighbour: ";
s += to_string(points.size()) + " Points in ";
s += to_string(timerResult().count()) + "us with Distance: ";
s += to_string(circ_pythagoras(result));
logMessage(s);
PlotProperties p;
p.color = Colors::blue;
plotPoint({(float)points.size(), (float)timerResult().count()}, 2, p, "NearestNeighbour @X, @Yus)");
}
}
void twoOpt()
{
nearestNeighbour();
delay(1000);
using global::result;
if (verbosity() >= Verbosity::result)
{
delay(verbosity() >= Verbosity::partialResult ? 1000 : 300);
undo(0);
}
PlotProperties pp;
pp.color = Colors::darkCyan;
pp.size = 12;
pp.line = LineStyle::dash;
pp.name = "NN";
pp.legend = true;
if (verbosity() >= Verbosity::result)
{
plotLines(result, 0, true, pp);
}
result.emplace_back(result.front());
bool didSwap = true;
int swaps = 0;
setStatusMessage(to_string(swaps) + " swaps");
setProgress(0);
PlotProperties pp;
pp.color = Colors::darkCyan;
pp.size = 12;
while (didSwap)
pp.color = Colors::cyan;
pp.line = LineStyle::solid;
pp.legend = false;
PlotProperties markLine;
markLine.color = Colors::red;
markLine.legend = false;
markLine.line = solid;
markLine.size = 20;
PlotProperties start;
start.color = Colors::darkMagenta;
start.onTop = true;
start.size = 3 * start.size / 2;
start.shape = rectangle;
start.name = "start";
if (verbosity() >= Verbosity::partialResult)
{
plotPoint(result.front(), 0, start, "");
plotLines(result, 0, false, pp);
}
timerResume();
while (didSwap && ok())
{
didSwap = false;
Verbosity verbosity = cute::verbosity();
didSwap = false;
for (size_t i = 0; (i < (result.size() - 3)); ++i)
{
for (size_t j = i + 2; (j < (result.size() - 1)) & !didSwap; ++j)
......@@ -199,25 +306,74 @@ void twoOpt()
auto ac = length(a, c);
auto bd = length(b, d);
if (verbosity >= all)
{
markLine.color = Colors::red;
plotLine(a, b, 0, markLine);
plotLine(c, d, 0, markLine);
}
if (ac + bd < ab + cd)
{
reverse(result.begin() + i + 1,
result.begin() + j + 1); //needs j+1 otherwise doesnt include last element
didSwap = true;
++swaps;
plotLines(result, 0, false, pp);
delay(500);
undo(0);
setStatusMessage(to_string(swaps) + " swaps");
if (verbosity >= all)
{
markLine.color = Colors::green;
plotLine(a, c, 0, markLine);
plotLine(b, d, 0, markLine);
delay(800);
undo(0);
undo(0);
undo(0);
undo(0);
}
if (verbosity >= partialResult)
{
undo(0);
plotLines(result, 0, false, pp);
delay(100);
setStatusMessage(to_string(swaps) + " swaps");
}
}
else
{
if (verbosity >= all)
{
delay(200);
undo(0);
undo(0);
}
}
}
}
}
pp.color = Colors::magenta;
pp.color.transparency = 3 * 255 / 4;
timerStop();
if (swaps > 0)
undo(0);
undo(0);
pp.color.transparency = 2 * 255 / 4;
pp.size = pp.size * 2;
pp.name = "2-Opt";
plotLines(result, 0, false, pp);
pp.legend = true;
if (verbosity() >= Verbosity::result)
{
plotLines(result, 0, false, pp);
}
setStatusMessage("DONE! :DD");
setProgress(100);
if (ok())
{
std::string s;
s = "2-Opt: ";
s += to_string(result.size() - 1) + " Points in ";
s += to_string(timerResult().count()) + "us with Distance: ";
s += to_string(circ_pythagoras(result));
logMessage(s);
PlotProperties p;
p.color = Colors::green;
plotPoint({(float)result.size() - 1, (float)timerResult().count()}, 2, p, "2-Opt @X, @Yus)");
}
}
......@@ -262,8 +262,11 @@ bool cute::ok()
{
timerPauseInternal();
static int i = 0;
if (verbosity() == cute::silent && ++i % 5000 != 0)
if (verbosity() == cute::silent && ++i % 500 != 0)
{
timerResumeInternal();
return true;
}
else
{
bool ok = !CuteControl::get().endRequested();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment