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;
} |
Partager