AccueilPortailFAQRechercherS’enregistrerConnexion
 Le problème du voyageur de commerceVoir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
mtcs
Administrateur
Administrateur



Inscrit le : 21 Nov 2006
Messages : 1556

MessageSujet: Le problème du voyageur de commerce   Mer 23 Avr - 14:45

Citation:
L'énoncé du problème du voyageur de commerce est le suivant : étant donné n points (des « villes ») et les distances séparant chaque point, trouver un chemin de longueur totale minimale qui passe exactement une fois par chaque point et revienne au point de départ
d'apres www.wikipedia.org

Code:
Program pvc;
uses wincrt;
type
  nv=array[1..10] of string[10];
  dis=array[1..10,1..10]of real;
  traj=array[1..10] of byte;
  vis=array[1..10] of boolean;

var
  nom_villes:nv;
  distance:dis;
  v_depart:byte;
  trajet:traj;
  visite:vis;
  n:byte;


procedure saisie_liste(var n:byte;var nom_villes:nv;var distance:dis);
 var
  i,j:byte;
 begin
  repeat
      write('Combien de ville vous allez visiter? ');
      readln(n);
  until (n in [1..20]);

  for i:=1 to n do
  begin
    distance[i,i]:=0;
  end;

  for i:=1 to n do
    begin
      clrscr;
      write('saisir la ville n° ',i,'  ');
      readln(nom_villes[i]);
      for j:=1 to i-1 do
      begin
        write('distance entre la ville ',nom_villes[i],' et ',nom_villes[j],' en Km: ');
        readln(distance[i,j]);
        distance[j,i]:=distance[i,j];
      end;
    end;
 end;

procedure saisie_ville(n:byte; var v_depart:byte);
  begin
    repeat
      write('saisir le numéro de la ville de départ : ');
      readln(v_depart);
    until (v_depart in [1..n]);
  end;

function ville_proche_non_visite(vv:byte; distance :dis; visite:vis; n:byte): byte;
  var
    k,pv:byte;
  begin
    k:=1;
    while (visite[k]=true) do
      begin
        k:=k+1;
      end;

    pv:=k;
    for k:=k+1 to n do
    begin
      if (visite[k]=false) and (distance[vv,k]< distance[vv,pv]) then
          pv:=k;
    end;

    ville_proche_non_visite:=pv;
  end;

procedure former_trajet(n:byte; distance:dis;v_depart:byte; var visite:vis; var trajet :traj);
  var
    i,vv:byte;
  begin
    for i:=1 to n do
      visite[i]:=false;

    trajet[1]:=v_depart;
    visite[v_depart]:=true;

    vv:=v_depart;
    for i:=2 to n do
    begin
      vv:=ville_proche_non_visite(vv,distance,visite,n);
      trajet[i]:=vv;
      visite[vv]:=true;
    end;
  end;

procedure affiche_trajet(n:byte;trajet:traj;nom_villes:nv);
  var
    i:byte;
  begin
    for i:= 1 to n do
      write(nom_villes[trajet[i]], ' --> ');

  write(nom_villes[trajet[1]]);
  end;

begin
  saisie_liste(n,nom_villes,distance);
  saisie_ville(n,v_depart);
  former_trajet(n,distance,v_depart,visite,trajet);
  affiche_trajet(n,trajet,nom_villes);
end.

_________________
un "bon" programmeur était celui qui savait optimiser la place en mémoire que prenait son programme

Revenir en haut Aller en bas
makram
modérateur
modérateur



Age : 19
Inscrit le : 29 Déc 2006
Messages : 551

MessageSujet: Re: Le problème du voyageur de commerce   Lun 28 Avr - 16:43

merci mohamed
Revenir en haut Aller en bas
Le problème du voyageur de commerceVoir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
 :: Programmation :: Delphi & Pascal :: Pascal :: Cours-