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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
| /****************************************************************************/
/* fonction optimise */
/****************************************************************************/
void fonction_optimise(int nombre_de_ville,char *pville,struct matrice *pchemin, ITINERAIRE *Citi)
{
/*déclaration des variables locales*/
int long_opti=32000,long_iti=0;
int optimal[NBVILLES];
int ville_depart,ville_arrive;
int i;
/*déclaration de la variable d'incrémentation du pointeur chemin*/
/*elle me permet de sauvegarder le dernier déplacement*/
int c=0;
/*déclaration de la variable existe pour indiquer si la ville est déjà*/
/*présente ou non dans le tableau Diti*/
int existe=0;
/*déclaration de pointeur itinéraire*/
/*opti qui va permettre de copier le tableau Diti dans le tableau optimal*/
/*et Fin qui conservera l'adresse du tableau Diti afin de faire un test*/
/*pour ne pas aller en négatif*/
ITINERAIRE *Opti;
ITINERAIRE *Fin;
/*déclaration du pointeur Fiti qui me permettra de tester que la ville*/
/*suivante ne se trouve pas déjà dans le tableau Diti ainsi qu'une variable*/
/*f pour son déplacement*/
ITINERAIRE *Fiti;
int f=0;
/*initialisation des pointeurs ITINERAIRE*/
Fiti=Citi;
Opti=Citi;
Fin=Citi;
/*affichage des villes et des numéros existants*/
printf("\nchoix des villes\n");
printf("\n%s\t%s\n","Numero","Nom");
/*cette boucle for me permet d'afficher les numéros de ville et*/
/*les villes de à nombre de ville-*/
for(i=0;i<nombre_de_ville;i++)
{
printf("\n%i\t%s",i+1,pville+i*LONGNOM);
}
/*saisie du parcours*/
printf("\n\nveuillez entrer la ville de depart : ");
scanf("%i",&ville_depart);
ville_depart--;
printf("\nveuillez entrer la ville d arrivee : ");
scanf("%i",&ville_arrive);
ville_arrive--;
/*je décrémente mes variables por travailler de 0 à x*/
/*1ère phase initialisation du tableau Diti*/
Citi->num_ville=ville_depart;
Citi->num_suiv=0;
/*2ème phase: boucle effectuée jusqu'à la fin*/
/*positionnement du pointeur dans le tableau CHEMIN*/
/*soit le 1er chemin de la ville de depart*/
pchemin=pchemin+ville_depart*NBCHEMINS;
/*boucle qui tourne avec un goto*/
boucle:
do
{
/*test que la ville suivante soit différente de -1*/
if(pchemin->ville_suiv!=-1)
{
/*teste si la ville est déjà présente dans Diti*/
/*et sauvegarde le résultat dans la variable existe*/
do
{
if(pchemin->ville_suiv!=Fiti->num_ville)
{
f++;
Fiti++;
}
else
existe=1;
}while(f<NBVILLES&&existe==0);
/*je réinitialise mon pointeur Fiti au début du tableau de Diti*/
Fiti=Fiti-f;
/*je réinitialise ma variable de déplacement de pointeur à 0*/
/*pour la prochaine boucle*/
f=0;
/*si la ville n'est pas déjà présente dans Diti alors on incrémente*/
/*Citi et on renseigne les champs de Diti*/
if(existe==0)
{
Citi++;
Citi->num_ville=pchemin->ville_suiv;
Citi->num_suiv=0;
/*on incrémente long iti*/
long_iti=long_iti+pchemin->distance;
}
else
/*si la ville existe déjà on incrémente Citi->num_suiv*/
Citi->num_suiv=Citi->num_suiv+1;
}
else
{
/*retour au début du tableau chemin*/
pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
/*je réinitialise les valeurs courantes de Citi*/
Citi->num_ville=-1;
Citi->num_suiv=0;
/*je décrémente mon pointeur Citi*/
Citi--;
/*je teste que je sois bien dans le tableau pour éviter les erreurs*/
if(Citi>=Fin)
{
/*positionnement du pointeur dans le tableau chemin*/
/*avec les nouvelles valeurs courantes de Citi*/
ville_depart=Citi->num_ville;
c=Citi->num_suiv;
pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
/*je déduis la distance du chemin Citi->num_suiv*/
long_iti=long_iti-pchemin->distance;
/*j'incrémente la valeur de Citi->num_suiv pour essayer un autre chemin*/
Citi->num_suiv=Citi->num_suiv+1;
}
}
/*retour au début du tableau chemin*/
pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
/*positionnement du pointeur dans le tableau chemin*/
ville_depart=Citi->num_ville;
c=Citi->num_suiv;
pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
/*je réinitialise ma variable existe à 0 pour la prochaine boucle*/
existe=0;
}while(Citi->num_ville!=ville_arrive&&Citi>=Fin);
/*le while ci dessus s'arrête lorsque le parcours optimal est trouvé*/
/*ou lorsque le pointeur Citi se retrouve au début de tableau*/
/*cela l'empêche d'être inférieur au tableau*/
/*je teste si long iti est le chemin optimal ou pas*/
/*si c'est le cas , je sauvegarde l'itinéraire dans le tableau optimal*/
if(long_iti<long_opti&&Citi>=Fin)
{
long_opti=long_iti;
/*copie du tableau Diti dans le tableau optimal*/
/*la variable 'i' me sert aussi à compter le nombre de*/
/*déplacement du pointeur pour pouvoir le réinitialiser ensuite*/
for(i=0;i<NBVILLES;i++)
{
optimal[i]=Opti->num_ville;
Opti++;
}
Opti=Opti-i;
}
/*la ville d'arrivée a été trouvée, je réinitialise mes variables de Citi courant*/
/*puis je le décrémente . Ensuite je déduis la distance du chemin Citi->num suiv*/
/*et j'augmente Citi->num suiv pour essayer un autre chemin*/
/*par contre si Citi est inférieur à Fin cela veut dire qu'une boucle testant*/
/*le -1 l'a sortit du tableau et que tous les chemins ont été essayés*/
if(Citi>Fin)
{
Citi->num_ville=-1;
Citi->num_suiv=0;
Citi--;
/*retour au début du tableau chemin*/
pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
/*positionnement du pointeur dans le tableau chemin*/
ville_depart=Citi->num_ville;
c=Citi->num_suiv;
pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
/*remise à jour de long iti*/
long_iti=long_iti-pchemin->distance;
/*j'incrémente la valeur de Citi->num suiv pour essayer un autre chemin*/
Citi->num_suiv=Citi->num_suiv+1;
/*retour au début du tableau chemin*/
pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
/*positionnemlent du tableau pointeur dans le tableau chemin*/
ville_depart=Citi->num_ville;
c=Citi->num_suiv;
pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
/*goto boucle me permet de faire recommencer toute la boucle de recherche*/
/*du parcours optimal*/
goto boucle;
}
/*troisième phase : Fiti est inférieur à Diti*/
/*affichage de la longueur optimale*/
printf("\nla longueur optimale est de : %i\n",long_opti);
/*affichage du parcours*/
i=0;
printf("\nles villes a traverser sont :\n");
do
{
printf("\n\t%s",pville+(optimal[i]*LONGNOM));
i++;
}while(optimal[i]!=-1);
} |
Partager