Bonjour,

J'ai besoin de votre aide dans mon programme.
J'ai un problème avec ma boucle.
Le programme fonctionne comme suit:
1.Circuit->tableau[0] = Mettre le zero comme premier element;
2.Circuit->tableau[1] = chercherPlusGrandDemand;
3.Calculer la capacité;
4.Calculer la charge;
5.pour(i=2;i<GestionVertex->nbreVertices;i++) faire
temp = chercherPlus Proche;
mise à jour de la capacité;
mise à jour de la charge;
si(charge >=0 && capacite >=0) faire
mettre temp dans Circuit->tableau[i];
supprimer l'element du tableau GestionVertex->tableau[i];


Lors de l'exécution, le compilateur me réaffiche dans la case 6 et 7 de ma variable Circuit->tableau[i]les memes éléments de la case 2 et la case 4 du mon tableau Circuit->tableau[i].
Je ne vois pas où il est le problème .
Merci de vos aides.
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
 
typedef struct Vertex Vertex;
struct Vertex
{
      int no;
      double x;
      double y;
      int demand;
 
};
/* cette strucutre n'est pas indispensable, mais fourni une aide */
typedef struct GestionVertex GestionVertex;
struct GestionVertex
{
          Vertex tableau[7]; /* Ce tableau a pour but de faciliter la recuperation des données lors de l'evaluation  de la tournee */
};
 
struct Circuit
{
      int tableau[9];//
};
typedef struct Circuit Circuit;
Circuit *allocationCircuit(void)
{
     Circuit *pCircuit;
      pCircuit = malloc(sizeof *pCircuit);
 
      return pCircuit;
}
/**
*Cette fonction permet de construire la tournee
*/
Circuit* creationCircuit(int vertexDepart, double **distanceEntreVertices, GestionVertex *LaGestion)
{
     int i;
     int j;
     Circuit *nouveau;
     nouveau = allocationCircuit();
    /* Ici, on va constituer une solution. */
    /* On initialise */
     for (i=0 ; i<nbreVertices ; i++)
        nouveau->tableau[i] = i;
     int capaciteCamion = 2;
     int vertexDebut = 0;
     int temp;
     int charge = 0;
     int capacite = 0;
     nouveau->tableau[vertexDepart] = 0;
     nouveau->tableau[0] = vertexDepart;
     nouveau->tableau[1] = chercherPlusGrandDemand(LaGestion);
     capacite = capaciteCamion -LaGestion->tableau[1].demand;
     charge += LaGestion->tableau[1].demand;
       /*on va commencer à  déterminer l'ordre de visite des vertex*/
     for(i=2;i<nbreVertices+1;i++)
      {
                         temp = chercherPlusProche(distanceEntreVertices, nouveau->tableau[i-1]);
                         capacite -=LaGestion->tableau[temp].demand;
                         charge += LaGestion->tableau[temp].demand;
                           if(charge>=0&&capacite>=0)
                          {
 
 
                              nouveau->tableau[i]=  temp;
                              printf("supprimer temp\n");
                              memmove (LaGestion->tableau +temp, LaGestion->tableau + temp+1, sizeof (int) * nbreVertices);
                         }
 
          }
 
          return nouveau;
}
/*
*Renvoie le vertex ayant la plus grosse demande
*/
int chercherPlusGrandDemand(GestionVertex *LaGestion)
{
	   double demandMax = 0;
	   int vertexGrand;
	   int i;
        for(i=0; i<nbreVertices;i++)
        {
               if(demandMax < LaGestion->tableau[i].demand)
                    vertexGrand = i;
        }
        return vertexGrand;
}
/*
*Renvoie le vertex le plus proche
*/
int chercherPlusProche(double **distanceEntreVertices, int vertexDebut)
{
 
    double distanceMin = 1000;
 
    int vProche = 0;
    int i;
    for (i=1; i < nbreVertices; i++)
    {
 
        if ( (i != vertexDebut) && distanceEntreVertices[vertexDebut][i] < distanceMin)
        {
               distanceMin = distanceEntreVertices[vertexDebut][i] ;
 
                vProche = i;
 
        }
    }
        return vProche;
}