#ifndef GRAPH_H #define GRAPH_H #include #include class Graph { public: Graph(); virtual ~Graph(); virtual bool addEdge(unsigned v, unsigned w, unsigned weight) = 0; virtual bool removeEdge(unsigned v, unsigned w) = 0; virtual unsigned getWeight(unsigned v, unsigned w) = 0; unsigned getVertexNumber(); virtual void displayGraph() = 0; static void randomGenerateFullGraph(Graph &graph, unsigned maxWeight); static std::vector travellingSalesmanBruteForce(Graph &graph); static std::vector travellingSalesmanBranchAndBound(Graph &graph); static std::vector travellingSalesmanGreedy(Graph &graph, unsigned startVertex); static std::vector travellingSalesmanHybrid(Graph &graph); static std::vector travellingSalesmanRandom(Graph &graph); static std::vector travellingSalesmanTabuSearch(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, unsigned threadsNumber); protected: unsigned vertexNumber; private: static void travellingSalesmanTabuSearchEngine(Graph &graph, unsigned tabuSteps, bool diversification, int iterationsToRestart, unsigned minStopTime, std::vector startRoute, std::vector &globalOptimum, unsigned &globalOptimumLength, std::mutex &globalOptimumMutex); class RouteComparison { public: bool operator() (const std::vector& lhs, const std::vector& rhs) const { return (lhs.at(0) > rhs.at(0)); } }; }; #endif // GRAPH_H