Bonjour,
Pour un prjet je dois réaliser un petit programme en c++ qui me renvoie un cycle hamiltonien à partir d'un graphe complet.
Le seul problème est qu'en cours on étudie le python et je n'ai donc aucune base en c++...
Je suis partie d'un programme réalisé par une amie, et j'ai rajouté le calcul de la matrice des distances des différents sommets du graphe.
Mais à partir de ça je n'arrive pas à construire un tour hamiltonien.
Si quelqu'un peut m'aider celà serait très sympa.
Code C/C++ :
/*
Algorithme glouton de résolution du TSP
-----------------------------------------------------------------------------------------------------
INPUT: un graphe complet G=(V, E)avec arêtes-valuées;
(les valeursd positives satisfont les inégalités triangulaires)
OUTPUT: cycle hamiltonien
-----------------------------------------------------------------------------------------------------
*/
#include <iostream>
#include <lemon/maps.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <lemon/dimacs.h>
#include <lemon/list_graph.h>
#include <math.h>
#include <lemon/concepts/graph.h>
#include <lemon/euler.h>
#include <lemon/min_cost_arborescence.h>
#include <lemon/matching.h>
using namespace std;
using namespace lemon;
int main() {
//===================================================================================================
/* declaration et definition des variables et outils-LEMON de traitement des graphes*/
typedef ListGraph::Node Node;
typedef ListGraph::Edge Edge;
typedef ListGraph::NodeIt NodeIt;
typedef ListGraph::EdgeIt EdgeIt;
typedef ListGraph::EdgeMap<int> ECostMap;
ListGraph g, g_prime, g_second;
Node s[300],;
Edge e[4000];
int k=0;
int l=0;
double x;
double coordx[4000], coordy[4000];
//Definition de la "carte" du graphe G;
ECostMap edge_cost_map(g);
// le constructeur de ifstream permet d'ouvrir un fichier en lecture
std::ifstream is("berlin52.tsp");
//===================================================================================================
/* 1. construire le graphe d'après les donnees contenues dans le fichier */
if(is)
{
std::string ligne;
while ( std::getline( is, ligne, ' ' ) )
{
k++;
is >>coordx[k] >> coordy[k];
//std::cout<<ligne<<' '<<coordx[k]<<' '<<coordy[k]<<std::endl;
//s[k]=g.addNode();
}
}
//definir les sommets du graphe
for(int i=1; i<k; i++)
s[i]=g.addNode();
//definir les aretes et leur capacités
for(int i=1; i<k; i++)
for(int j=i+1; j<k; j++)
{
l++;
e[l] = g.addEdge(s[i], s[j]);
//std::cout<<i<<' '<<j<<std::endl;
edge_cost_map.set(e[l],sqrt(pow((coordx[i]-coordx[j]),2)+ pow((coordy[i]-coordy[j]),2)));
}
is.close();
std::cout << "Le graphe G a :"
<< countNodes(g) << " noeuds et "
<< countEdges(g) << " arcs." << std::endl;
//================================================================================================
/* 2. construire la matrice des distances */
const int dimension = k;
int matrice [k][k];
for( int i=1; i<k; i++)
for( int j=1; j<k; j++)
{
matrice[i][j] = sqrt((coordx[i]-coordx[j])^2 + (coordy[i]-coordy[j])^2);
}
Merci d'avance pour vos réponses