IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

programmer un algorithme


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 39
    Par défaut programmer un algorithme
    Bonjour tout le monde
    je travaille sur un projet, qui utilise pas mal de programmation basique, je ne suis pas spécialiste en la matière, donc je tire une grosse sonnette d'alarme.
    Le problème de VRP (vehicle routing problem) consiste à déterminer en minimisant le coût, un ensemble de tournées, pour un nombre limité de véhicules, commençant et finissant à un dépôt
    L’étude de tout ça se fait sous plusieurs étapes. La première c’est qu’on doit prendre un des algortihmes proposé par un des mathématitiens, j’ai choisis un qui s’appelle “CLARK AND WRIGHT”. Donc il faut programmer l’algorithme et l’appliquer sur des données connues de villes et de demande. Ces données(instances) sont dans des fichers. Il faut donc écrire tout d’abord une fonction en C ou C++ qui lit ces données à partir d’un fichier. J’ai proposé la fonction suivante mais que j’ai du mal à achever parce qu’il me manque quelques fonctions que j’arrive pas à introduire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    /LECTURE D'UN FICHIER
    //DONNES UTILES pour la fonction:
    ville **tabVille;
     
    //il me faut une class ville définie dans un autre fichier, champs utiles: coordonnées, demande
     
    //une fonction qui calcule la distance euclidienne entre deux villes:
    d_ij = sqrt(pow(i->x()-j->x(),2)+pow(i->y()-j->y(),2))
    int nbVille;
    double CAPACITE;
    // inclure les librairies utiles
     
    //fonction qui lit le fichier nomFichier.vrp, où nomFichier est le paramètre
    void lireFichier(char *nomFichier) {
    char *nomFichierComplet = new char [200];
    sprintf(nomFichierComplet,"%s. vrp",nomFichier);
    FILE *f = fopen(nomFichierComplet,"r");
    if (f == NULL) {
    cout << "Impossible de lire le fichier " << nomFichierComplet << endl;
    exit(1);
    }
    CAPACITE = -1;
    .
    .
    .
    .
    Je sais pas si ce debut de programme est juste et aussi j’arrive à introduire tout ce qui est en gras !!
    Merci beauuuucoup for help

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Quels sont exactement tes problèmes (sont-ils de l'ordre de l'implémentation ou de la compréhension ?)

    Expliques-nous un peu plus tes problèmes.

    D'ailleurs au passage, j'ai vu que tu calculais la distance euclidienne, si c'est pour effectuer des comparaisons, tu peux t'abstenir de l'opération couteuse qu'est la racine carrée.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 39
    Par défaut
    salut
    mon probleme est surtout en implementaion, j'arrive pas à mettre les declarations en place, on m'a passé une indication d'un code mais il est bourré d'erreur et je suis incapable de corriger. Je suis PERDU; le code complet est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    //LECTURE D'UN FICHIER
    //DONNES UTILES pour la fonction:
    ville **tabVille;
      //class ville définie dans un autre fichier, champs utiles: coordonnées,
    demande
      //besoin d'une fonction qui calcule la distance euclidienne entre deux villes:
    d_ij =  sqrt(pow(i->x()-j->x(),2)+pow(i->y()-j->y(),2))
    int nbVille;
    double CAPACITE;
    //et penser à inclure les librairies utiles
     
    //fonction qui lit le fichier nomFichier.vrp, où nomFichier est le paramètre (pe
    A-n65-k9) 
    void lireFichier(char *nomFichier) {
      char *nomFichierComplet = new char [200];
      sprintf(nomFichierComplet,"%s.vrp",nomFichier);
      FILE *f = fopen(nomFichierComplet,"r");
      if (f == NULL) {
        cout << "Impossible de lire le fichier " << nomFichierComplet << endl;
        exit(1);
      }
      CAPACITE = -1;
      nbVille = -1;
      char *lineBuf = new char [500];
      while (fgets(lineBuf, 500, f)) {
        if (strncmp(lineBuf, "DIMENSION",strlen("DIMENSION")) == 0) {
          if (sscanf(lineBuf, "DIMENSION : %d", &nbVille) != 1) {
            cerr << "Erreur lors de la lecture de la DIMENSION" << endl;
            exit(1);
          }
        }
        if (strncmp(lineBuf, "CAPACITY", strlen("CAPACITY")) == 0) {
          if (sscanf(lineBuf, "CAPACITY : %lf", &CAPACITE) != 1) {
            cerr << "Erreur lors de la lecture de CAPACITY" << endl;
            exit(1);
          }
        }
        if (strncmp(lineBuf, "NODE_COORD_SECTION", 
                    strlen("NODE_COORD_SECTION")) == 0) {
          break;
        }
      }
      if (CAPACITE == -1 || nbVille == -1) {
        cout << "Erreur lors de la lecture : pas de dimension ou de capacité
    trouvée" << endl;
        exit(1);
      }
      tabVille = new (ville *) [nbVille];  //CREATION du tableau tabVille
    (ATTENTION, penser à le supprimer à la fin du programme)
      int i = 0;
      int n;
      double x,y;
      while (fgets(lineBuf, 500, f)) {
        if (strncmp(lineBuf, "DEMAND_SECTION",strlen("DEMAND_SECTION")) == 0) {
          break;
        }
        if (sscanf(lineBuf,"%d %lf %lf",&n,&x,&y)== 3) 
          if (n > nbVille || n < 1) {
            cerr << "Erreur de lecture des coordonnees : le numero de la ville ";
            cerr << "doit etre compris entre 1 et " << nbVille;
            cerr << " (ville numero " << n << ")";
            cerr << endl;
            exit(1);
          } else if (tabVille[n-1] != NULL) {
            cerr << "Erreur de lecture : la ville " << n;
            cerr << " est definie 2 fois..." << endl;
            exit(1);
          } else {
            tabVille[n-1] = new ville (n,x,y);  //CREATION ville num n de coord
    (x,y)
            i++;
          }
      }
      if (i != nbVille) {
        cerr << "Erreur de lecture : " << i << " villes lues et dimension=";
        cerr << nbVille << endl;
        cerr << "Il manque la definition des villes ";
        for (int j=0; j<nbVille; j++)
          if (tabVille[j] == NULL) cerr << j << " ";
        cerr << endl;
        exit(1);
      }
      double d;
      i=0;
      while (fgets(lineBuf, 500, f)) {
        if (strncmp(lineBuf, "DEPOT_SECTION",strlen("DEPOT_SECTION")) == 0) {
          break;
        }
        if (sscanf(lineBuf,"%d %lf",&n,&d)== 2) 
          if (n > nbVille || n < 1) {
            cerr << "Erreur de lecture de la demande : le numero de la ville ";
            cerr << "doit etre compris entre 1 et " << nbVille;
            cerr << " (ville numero " << n << ")";
            cerr << endl;
            exit(1);
          } else if (d < -0.0001) {
            cerr << "Erreur de lecture : la demande de la ville " << n;
            cerr << " doit etre positive ou nulle..." << endl;
            exit(1);
          } else if (tabVille[n-1]->demande() > -0.0001) {
            cerr << "Erreur de lecture : la demande de la ville " << n;
            cerr << " est definie 2 fois..." << endl;
            exit(1);
          } else {
            tabVille[n-1]->demande(d);  //INITIALISE la demande de la ville
            i++;
          }
      }
      if (i != nbVille) {
        cerr << "Erreur de lecture : " << i << " demandes lues et dimension=";
        cerr << nbVille << endl;
        cerr << "Il manque la definition de la demande des villes ";
        for (int j=0; j<nbVille; j++)
          if (tabVille[j]->demande() < -0.001) cerr << j << " ";
        cerr << endl;
        exit(1);
      }
      fclose(f);  
      delete [] lineBuf;
      delete [] nomFichierComplet;
    }
    //Pour écrire dans un fichier, la fonction fprintf;

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 39
    Par défaut
    Merci à tous pour vos conseils; je vais vous dire ce que j'ai fais petit à petit; au fait il s'agit d'écrire une fonction qui lit les renseignement dans un fichier(par exemple le fichier joint), donc il y a le nombre de ville (n), les coordonnées de chaque ville (x,y) et les demande de chaque ville (di) ; j'ai écrit la classe suivante, qu'en pensez vous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class ville {
    int nbVille,i;
    double x();
    double y();
    double d[i];
    double CAPACITE:
    }
    Bien sûr ce n'est QUE le début, on verra pour le reste
    ceci paraît-il juste ? si non quelle modification me proposeriez vous ? JE SUIS NUL en programmation et après pas mal d'effort je me suis retourné vers vous. C'est mon dernier joker (avis du public) !!
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Citation Envoyé par lesguignols
    Le problème de VRP (vehicle routing problem) consiste à déterminer en minimisant le coût, un ensemble de tournées, pour un nombre limité de véhicules, commençant et finissant à un dépôt
    Merci beauuuucoup for help
    ehhh tu vas peut-être être obligé de te taper arbres binaires de recherche et tutti quanti , Djikstra pour cela ...
    Justement Romuald a fait un bon tuto sur les arbres binaires

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 39
    Par défaut
    après plusieurs recherche; j'a appris l'existence d'un language spécifique à la programmation du VRP, le language peut s'implémenter en JAVA, avec le programme suivant comment puis-je l'executer sur java pour vérifier maintenant qu'il marche bien ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    '----------------------------------------------' ' 
    CLARK AND WRIGHT ALGORITHM                   '
    '----------------------------------------------' 
    CLEAR 
    AddVehicles CUSTOMERCOUNT, 160
    CUSTOMER depot = CUSTOMER(0) 
    NUMBER end, end0=0
    FOR i = 1 TO CUSTOMERCOUNT-1
    	ADDARC VEHICLE (i-1), depot, CUSTOMER (i)
    	ADDARC VEHICLE (i-1), CUSTOMER (i), depot
    ENDFOR
    DO
    	SELECT ARC arc1, ARC arc2 WHERE
    		EQUAL CUSTOMER (arc1.TO, depot)
    		EQUAL CUSTOMER (arc2.FROM, depot)
    	  	NOT EQUAL 
    		VEHICLE(arc1.VEHICLE, arc2.VEHICLE)
    	arc2.VEHICLE.CAPACITY -
    	arc2.VEHICLE.CAPACITYLEFT <
    	arc1.VEHICLE.CAPACITYLEFT
     		MAXIMISE arc1.LENGTH + arc2.LENGTH
    			DISTANCE(arc1.FROM, arc2.TO)
    	ENDSELECT
    	IF FOUND (arc1) 
    		MESSAGE "MAX saving -> " + arc1.FROM.INDEX +
    			" on " + arc2.TO.INDEX
    		end = 0
    		DO
    		SELECT ARC arc3 WHERE
    		NOT EQUAL ARC (arc3, arc2)
    		EQUAL VEHICLE (arc3.VEHICLE,
    				arc2.VEHICLE)
    		ENDSELECT
    		IF FOUND (arc3)
    		ADDARC arc1.vehicle, arc3.FROM, arc3.TO 
    		DELARC arc3
    			ELSE
    			end = -1
    			ADDARC arc1.VEHICLE, arc1.FROM, arc2.TO
    		DELARC arc1 DELARC arc2
    			ENDIF
    		LOOPIF end = 0
    	ELSE end0=-2 
    	ENDIF
    LOOPIF end0 = 0
    DeleteUnusedVehicles
     
    PROCEDURE AddVehicles(NUMBER number, NUMBER
    						capacity)
    	DeleteAllVehicles
    	FOR i=0 TO number-1
    ADDVEHICLE capacity
    	ENDFOR
    ENDPROCEDURE
     
    PROCEDURE DeleteUnusedVehicles
    	FOR i=VEHICLECOUNT-1 TO 0 STEP -1
    		IF VEHICLE(i).CAPACITY =
    			 VEHICLE(i).CAPACITYLEFT
    		DELVEHICLE VEHICLE(i)
    		ENDIF
    	ENDFOR
    ENDPROCEDURE
     
    PROCEDURE DeleteAllVehicles
    	FOR i=VEHICLECOUNT-1 TO 0 STEP -1
    		DELVEHICLE VEHICLE(i)
    	ENDFOR
    ENDPROCEDURE

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par lesguignols
    après plusieurs recherche; j'a appris l'existence d'un language spécifique à la programmation du VRP, le language peut s'implémenter en JAVA, avec le programme suivant comment puis-je l'executer sur java pour vérifier maintenant qu'il marche bien ?
    ?? Hum... a mon avis ce que tu appelles "langage spécifique" c'est juste le pseudocode de l'agorithme "Clark and Wright ' s saving".

    Si tu veux l'implémenter en Java, il va falloir adapter certaines fonctions.
    En particulier le SELECT...WHERE qui existe en SQL mais pas en Java.

    Pour info, un comparatif des differentes methodes pour la résolution du VRP, avec les sources en Java (dont le "Clark and Wright ' s saving", page 607)

    https://drum.umd.edu/dspace/bitstrea...i-umd-2818.pdf
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 39
    Par défaut
    salut
    Non mais vraiment c'est fort de trouver ce pdf, car j'ai cherché pendant un temps infini et je ne suis jamais tombé sur un truc du genre . Mais ça contient des fonctions pour le VRP pas spécialement Clark and wright algorithm. Donc il faut plutot récuperer des fonctions déja faite dans le pdf pour clarke and wright ? ou bien tu me conseille plutot de détailler les fonction SELECT, WHERE etc ? qu'est ce qui serait le plus simple à faire ?
    Merci beaucoup pour ton aide, c'est super gentil

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par lesguignols
    salut
    Non mais vraiment c'est fort de trouver ce pdf, car j'ai cherché pendant un temps infini et je ne suis jamais tombé sur un truc du genre .
    Pourtant c'est pas dur a trouver. Cette algo existe depuis 1964 et on a beaucoup écrit dessus.

    Citation Envoyé par lesguignols
    Donc il faut plutot récuperer des fonctions déja faite dans le pdf pour clarke and wright ? ou bien tu me conseille plutot de détailler les fonction SELECT, WHERE etc ? qu'est ce qui serait le plus simple à faire ?
    D'une maniere générale, je préfere comprendre un algo plutot que faire du copier/coller de code. Surtout que cet algo est assez simple. Si tu prends 4 ou 5 points, tu peux le faire sur papier et tu comprendras vite comment il fonctionne.

    Citation Envoyé par Clark_et_Wright
    L’algorithme des gains de Clark et Wright (1964) est sans aucun doute, une des méthodes les plus connues pour le VRP.

    L’algorithme fonctionne comme suit :
    "Pour étendre les routes par fusion, considérer tour à tour chaque route (0,i,...,j,0) pour déterminer le premier gain Ski ou Sjl qui peut être utilisé pour former une route réalisable, par la fusion de la route courante et d’une autre se terminant par (k,0) ou commençant par (0,l)."


    L’algorithme nécessite le calcul du gain possible entre (i,j) et de la fusion de route comme suit :

    - Créer les n routes (0,i,0) pour i=1,...,n reliant les sommets au dépot.

    - Calculer les gains Sij = ci0 + c0j - cij pour i,j=1,...,n et i different de j, cij étant le côut de l’arc (i,j).

    - Trier les gains en ordre décroissant.

    - Pour un gain Sij donné, trouver s’il existe deux routes, une partant de (0,j) et l’autre se terminant à (i,0) qui puissent être fusionnées pour former une route réalisable. Dans ce cas, combiner ces deux routes en effaçant (0,j) et (i,0) et introduisant (i,j).

    - Répéter cette dernière étape jusqu'a ce qu'il n'y ait plus d'amélioration possible
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 54
    Par défaut
    Ce document n'est plus disponible. Pouvez vous me donner le nom des auteurs de cette thèse afin que je puisse la retrouver.

  11. #11
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par vincentweb Voir le message
    Ce document n'est plus disponible. Pouvez vous me donner le nom des auteurs de cette thèse afin que je puisse la retrouver.
    Je pense que c'est ca: http://www.lib.umd.edu/drum/handle/1903/2824
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. programme pour algorithme
    Par anisplg dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 21/05/2013, 22h47
  2. Programme ou algorithme de ESPRIT
    Par itri101 dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 16/11/2012, 14h32
  3. programmations des algorithmes génétiques
    Par faaffou dans le forum Débuter
    Réponses: 0
    Dernier message: 25/12/2010, 21h06
  4. Programmer l'algorithme KPPV
    Par foufar2009 dans le forum C++Builder
    Réponses: 0
    Dernier message: 21/05/2010, 19h51
  5. Programmation algorithme branch and bound en C
    Par mca_183 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 13/01/2006, 15h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo